微软当年其实也想用正斜杠
换过电脑的人应该都注意过一件事。Mac 上文件路径长这样,/Users/xxx/Documents。Windows 上长这样,C:\Users\xxx\Documents。中间那个分隔符,一个是斜杠,一个是反斜杠。写过跨平台代码的人还知道另一件事,这一个字符的差别,每年要让全世界开发者写无数次 path.join、os.path、pathlib。40 多年了,没人改过,也没人敢改。这个反斜杠的身世,跟技术其实没什么关系。它是 1982 到 1983 年 DOS 2.0 开发那 10 个月里,两家公司反复拉锯留下来的一笔兼容性妥协。我做开发这些年,\ 这东西带来的问题总是遇到,回回都得处理,但一直没深究过,以为是微软的审美,或者故意要跟 Unix 划清界限。最近翻到 1983 年的老资料,发现跟审美没一毛钱关系。这事要从 Unix 说起。1970 年前后,Ken Thompson 和 Dennis Ritchie 在贝尔实验室定 Unix 的目录分隔符。前身 Multics 没定过这个标准,两个人顺手挑了 /。键盘上有、看着利索、没跟别的符号冲突。这个决定后来写进 Unix,Linux 继承,macOS 继承,Android 继承。今天全世界的操作系统,除了 Windows,路径分隔符全是 /。到这一步历史还没分叉。不过分叉的种子,其实比 Unix 还早几年就埋下了。1970 年代初,DEC 的 TOPS-10 操作系统是大学和科研院所的主流。TOPS-10 的命令行有个约定,用 / 做参数前缀。你敲 DIR /W,那个 /W 是参数,告诉 DIR 用宽格式显示。作用等同于今天 Unix 的 -(ls -l 那个短横)。这个习惯,70 年代一大批在大型机上练手的工程师都熟。他们后来进了各家公司,其中一批进了 IBM。1980 年,Tim Paterson 在西雅图一家小公司写了一个 86-DOS。第二年微软从他手里把这东西买下来,改名 MS-DOS 卖给 IBM,装进 1981 年的 IBM PC。关键点就在这里。MS-DOS 1.0 没有子目录,只有扁平文件系统,所有文件都在根目录下。但 DOS 1.0 附带的 DIR、FORMAT、COPY 这些命令,相当一部分是 IBM 工程师写的。这批人从 TOPS-10 时代长大,写程序顺手就用 / 做参数前缀。于是 DIR /W、FORMAT /Q、COPY /Y,全是 /。/ 在 DOS 世界里,先成了参数前缀。不是路径分隔符,因为根本没有路径这个概念。分水岭在 1983 年。准确说,是 1982 年到 1983 年 3 月的那 10 个月。DOS 2.0 要大改,从 DOS 1.x 的扁平文件系统加上子目录,再加上硬盘支持。微软这头是 Paul Allen 带着 Mark Zbikowski、Aaron Reynolds 一共 6 个人在做。IBM 那头是 Boca Raton 的 PC 部门,两边隔着整个北美大陆反复对接。既然要子目录,就要一个路径分隔符。微软的工程师想法很自然,既然子目录是学 Unix 的,分隔符就跟 Unix 一样用 / 呗。图省事。IBM 那边不同意。IBM 的理由讲得也清楚。/ 在 DOS 1.x 里已经是参数前缀,几十万套已经卖出去的 IBM PC、所有第三方开发者写的 DOS 程序,全都在这么用。真要把 / 改成路径分隔符,兼容性会是个灾难,所有现有的程序都得重写。IBM 是大客户。微软不敢得罪。工程团队重新看了看键盘,要找一个没被占用、键盘上本就有、最好不用 Shift 键也能敲的字符。筛到最后,只剩下 \。就这么定了。从那天起,Windows 用 \,Unix 用 /,一用就是 42 年。中间微软也不是没想过统一。Windows NT 起(1993 年),Win32 API 其实早就兼容 /,你在程序里写 C:/Users 大多数时候都能跑。但 cmd.exe 没改,PowerShell 没改,文件资源管理器显示的路径也没改。为什么不改?因为这一套生态里,几十万个老程序、几百万个批处理脚本、无数个注册表项、企业内网跑了 30 年的老 SDK,全都在用 \。动这个字符,几亿用户和几百万开发者都要跟着适配。微软每次想统一,先算一笔账。账算不过来,作罢。所以今天你按下键盘上那个反斜杠键的时候,按下的不是一个字符。是 1983 年 DOS 2.0 开发尾声,微软 6 个人和 IBM 来回拉锯之后留下的一笔兼容承诺。那笔承诺当时只是个权宜,现在变成了遗产。Windows 开发者每次写 \\ 转义,跨平台工程师每次写 path.join,CI 工程师每次调脚本,都在还当年留下的债。一个字符的差别,分开了两个世界。分开它们的不是技术,是一次大客户的强势,加上一代开发者的惰性。代码每天在变,兼容性却像是凝固的历史。AI 也改变不了。Mac 上那个 /,是 1970 年 Thompson 顺手挑的。Windows 上这个 \,是 1983 年 IBM 留给微软的。一个是选择,一个是欠的债。这笔债,还没还完。