Java基础、中级、高级、架构面试资料

正斜杠 vs 反斜杠,让全球程序员多写了 100 亿行代码

业余杂谈 herman 8浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
【腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

有不少大学生关注着我的公众号,也有不少“老网友”是从大学期间就关注着我的,更有不少人我们一起同行了 8 年之久。谢谢大家的喜爱,我会继续用更多优质的原创文章服务大家的同时,享受写作的乐趣。

最近有一位新朋友,反馈说,他发现只有 Windows 用反斜杠,其它 Mac、Linux 等系统,甚至是 http 等协议用的都是正斜杠,这很神奇。

这个问题得到了很多群友的讨论,也是一场持续 50 年的“路径之争”。当我们在 Windows 资源管理器地址栏里输入C:\Users\Documents,在 Mac 终端里输入~/Documents/projects时,很少有人想过,为什么 Windows 偏偏是那个“异类”?这背后不仅是技术优劣之争,而是一场始于 1970 年代、由几个“历史偶然”共同导演的荒诞剧。

1970 年的 Unix

故事要从 Unix 的诞生说起。

1970 年左右,贝尔实验室的 Ken Thompson 和 Dennis Ritchie 在设计 Unix 文件系统时,需要一个符号来表示目录层级。他们选中了正斜杠/

至于为什么是/?至今都没有确切答案,网上只有猜测和各种说法。

有说法认为,Unix 的祖先系统 Multics 使用的是>,但 Unix 的设计者们已经把<>留给了 shell 的重定向操作(输入输出转向)。

于是,/home/user/documents 这种写法诞生了,并随着 Unix 在学术界和服务器领域的统治地位,成为了“行业标准”。后来,Linux、macOS、Android、Chrome OS 等,甚至是互联网的 URL 协议,全都继承了这个传统。

因此,业界认为,Unix 的选择,本质上是一场“先到先得”的圈地运动。

MS-DOS 的尴尬入局

这段时间主要涉及 1981-1983 年之间,下面我们简单展开说说。

没有目录的 DOS

时间来到 1981 年,微软在当年推出了 MS-DOS 1.0,它甚至不支持目录!那时的个人电脑主要用软盘,文件直接堆在根目录下。既然没有层级路径,自然也就不需要路径分隔符。

但 DOS 需要命令行参数。比如 dir /w 表示“宽列表格式显示”,format /s 表示“复制系统文件”。这里的 / 被用作“开关字符”(switch character),也就是我们今天说的命令选项前缀。

实际上,今天大多数命令选项前缀,多数都是以“-”或者“–”开始的。

这个习惯从哪来?

也有很多人以为是CP/M(DOS 的前辈)传下来的。但CP/M本身并没有系统级的“选项字符”概念,由每个程序自己决定用什么符号。这其中真正的原因是,微软自家的开发工具早在 1977 年就开始用 / 作为选项分隔符了。

微软为 Intel 8080 的处理器开发的 FORTRAN 编译器(F80)、宏汇编器(M80)和链接器,都使用 / 来分隔命令参数。这个习惯很可能来自 DEC(数字设备公司)的 TOPS-10 操作系统。所以某种意义上,Windows 今天用反斜杠,是因为 50 年前 DEC 的 TOPS-10 用了正斜杠

目录来了,但 / 已被占用

时间来到了 1983 年,MS-DOS 2.0 终于引入了目录系统( hierarchical directory structure),这明显受到了 Unix 的启发。但问题也来了,/ 已经被大量 DOS 1.x 的程序用作选项开关。

微软其实想直接用 / 作为路径分隔符,这样就和 Unix 一致了。但 IBM 强烈反对。为什么?

因为兼容性。想象一下,如果你有一个 DOS 1.1 的批处理文件里写着:

COPY FOO + BAR /A

如果 /A 突然变成了“根目录下的 A 文件”而不是“ASCII 模式开关”,这个命令的含义就完全变了,甚至可能导致数据丢失。

种种原因,再加上由于 IBM 的坚持,让微软不得不寻找替代品。

反斜杠 \ 的意外中选

同样的,在 1983 年,微软最终选择了\(反斜杠,backslash)。背后的真实原因也很“务实”。

  1. 视觉相似:\/ 长得最像,用户容易接受
  2. 键盘位置:在 IBM Model F 键盘上,\ 不需要按 Shift 就能输入,而且当时还没有被赋予其他重要功能

但这个决定埋下了几十年的“祸根”。

非英语键盘的灾难

当时没人考虑过非美国键盘的布局。结果在德国键盘上,反斜杠变得极其难输入;在日本版 Windows 上,屏幕上甚至把反斜杠显示为 (日元符号),虽然底层编码仍然是 \

这就是一个典型的“美国中心主义”设计失误。

Windows 的继承与妥协

从 DOS 到 Windows NT,是 Windows 继承与妥协的一个过程。

Windows 95/98 基于 DOS,自然继承了反斜杠。Windows NT(以及后来的 XP、7、10、11)虽然内核重构了,但为了兼容海量的 DOS/Windows 软件,这个“传统”也被保留了下来。

有趣的是,微软和 IBM 在合作OS/2时,OS/2 其实支持正斜杠和反斜杠两种分隔符通用。1990 年微软和 IBM 分道扬镳后,微软把这部分代码带进了 Windows NT。所以今天的 Windows 内核底层 API 其实是同时接受 /\ 的。

多写 100 亿行代码

很多 Windows 程序(包括资源管理器的地址栏)确实能自动把 / 转换成 \。但命令提示符(cmd.exe)在某些情况下依然会报错,PowerShell 则友好得多。这种“半推半就”的态度,让开发者们几十年来一直在两种斜杠之间走钢丝。

有一个隐秘的数据揭示,因为微软的反斜杠,导致全球程序员在处理这类逻辑时,多增加了 100 亿行以上的代码。当然,也为此多创造了一些岗位吧。

为什么都用正斜杠?

为什么“全世界”或者说全球大多数应用都用正斜杠?

因为除了 Windows 文件路径,几乎所有地方都用 /

  • 互联网:https://www.xttblog.com/path/to/page
  • FTP 协议:ftp://xttblog@xttblog/dir/file
  • Linux/Android/Chrome OS/macOS:所有 Unix-like 系统
  • 编程语言:Python、Java、C++ 的跨平台路径库内部都使用 /

甚至连 Windows 上的 Web 服务器(如 IIS)、FTP 服务器,也因为遵循协议规范而使用正斜杠。而Windows 成了互联网时代的“孤岛”

反斜杠的后遗症

转义字符的混乱

在 C 语言、Python、Java 等语言中,\ 是转义字符(如 \n 表示换行)。这意味着在 Windows 路径中,你必须写成 C:\\Users\\Name,否则编译器会把 \U 当成 Unicode 转义序列,引发各种诡异错误。这是让程序员最头疼的“反斜杠地狱”之一。

这也是反斜杠让程序处理逻辑判断时代码行数增加的原因之一。

斜杠方向的记忆口诀

国外开发者流传一个有趣的记忆法,看 Windows 徽标,那个飘扬的旗帜,第一笔是什么?没错,是反斜杠!所以 Windows 用 \,其他系统用 /

文章中的多张配图,参见 https://mp.weixin.qq.com/s/GpQrS46fxXVK_CTotaaRhw

不过,现在有些新电脑和键盘,换了新徽标。

现代框架的统一大业

现代跨平台框架(如 Node.js 的 path 模块、Python 的 pathlib)都在努力抹平这个差异。它们内部统一使用 /,只在最终写入 Windows 文件系统时才做转换。这其实是“技术债”的最佳解决方案,在底层兼容历史,在接口面向未来

结语

回顾这段历史,反斜杠与正斜杠的分裂,本质上是一系列“历史偶然”的叠加。

时间节点事件结果
1970 年Unix 选择 / 作为路径分隔符成为行业标准
1977 年微软工具使用 / 作为命令选项占用关键字符
1981 年MS-DOS 1.0 不支持目录无需路径分隔符
1983 年MS-DOS 2.0 引入目录,但 / 已被占用被迫选用 \
1990 年代Windows NT 内核支持两种斜杠但 UI 层保持“传统”
2020 年代跨平台开发成为主流反斜杠成为“兼容性负担”

这不是技术最优解的选择,而是兼容性、商业博弈和时代局限共同作用的结果。正如 OS/2 博物馆的那篇经典文章所言,hindsight is 20/20(事后诸葛亮总是容易的)。在 1982 年,没人能预见到 Unix 和 DOS 会成为未来几十年的两大主流。

对于今天的开发者来说,最好的策略是写代码时用正斜杠,让框架去处理平台差异。毕竟,在这个互联互通的时代,正斜杠已经赢了。只是 Windows 还在用反斜杠,倔强地提醒着我们有些历史债,可能要还一辈子

参考资料

  • https://www.os2museum.com/wp/why-does-windows-really-use-backslash-as-path-separator/
  • https://stackoverflow.com/questions/38428561/difference-between-forward-slash-and-backslash-in-file-path
  • https://superuser.com/questions/176388/why-does-windows-use-backslashes-for-paths-and-unix-forward-slashes
  • https://jasonroell.com/2015/03/11/how-to-once-and-for-all-remember-when-to-use-or/

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 正斜杠 vs 反斜杠,让全球程序员多写了 100 亿行代码