原文发表在我的公众号 kimmyfun,欢迎关注及时获取更新。
缘起
你知道程序员是个了不得的群体,这群人其实是最宗教,最容易被煽动和感染的群体之一。每个人都多多少少的带着无数种信仰写出一行行的代码,这些信仰指导着他们的工作,学习和仅有的一部分娱乐,包括且不限于,建立鄙视链、划定群体和引发圣战。
我曾试图分析过为什么程序员们对圣战这么热衷,后面发现最终都会落地到宗教性上。任何工具或者系统,作为程序员日常的一部分,都因为习惯、崇尚的哲学和各种奇怪的原因,被作为了圣战的战场:编辑器、操作系统、程序设计语言、不同的编码习惯、不同的工程流派等等。
我个人其实很反感这种感觉,所以对任何圣战相关的话题我都会保持一个中立的态度(当然除非是为了活跃气氛吼一句,“PHP 是最好的编程语言”)。毕竟,所有的工具,只有被好好使用才是有用的工具,这种很大程度上出于自身的倾向形成的圣战,只能说明个人的惰性。不过,另外值得提的一点,战争有时候是能够推进科技进步的。程序员的圣战也一样。虽然可能花在互怼上的时间一定程度上影响了效率,但相互争论之后的结果一定是某一方或者两方尝试去提升自己的实力:进而把工具、系统或者理论变得更好。
这也是为什么我想到要写简史的原因。能让我们进步的事情是值得记录和赞扬的,虽然他们本质上可能并不是为了进步。
从最基本的工具说起
曾经在跟同事一起 pair 的时候,他进到一个运行中的 docker 容器里面,发现找不到任何一款趁手的编辑器来编辑配置文件了。因为要知道为了尽量保证容器清量我们肯定是让容器里的东西尽可能的越少越好。这个时候就看到他有点慌,毕竟这种如果不这样做把编辑好的文件复制到内网再放到容器里这样的过程是非常折腾的。
大部分人遇到这种问题第一个反应也是,apt install vim
。作为黄金时代编辑器的胜出者,Vim 已经是 dominant 了。绝大多数情况下在连接远程服务器的时候最趁手的编辑工具一定就是它,这也是当年一个 Vim 党在向我安利 Vim 的时候的理由。
其实解决这个问题根本用不到安装编辑器这么麻烦,毕竟我们现在使用的是终端模拟器,比上古时代的终端好用了不知道多少倍。Linux Shell 又是基于字符流的,所以用标准输入或者 heredoc 可以轻松实现修改文件内容的动作。只是各位基本功和认知不到位,或者没有见识过上古时代的工具,一直出于惯性地以为工具就是这个样子才行,造成的错觉罢了。
你看,了解历史多重要。
回到话题,编辑器这个东西,在上古时代就是个难题。毕竟在上古时代,“文件”这个概念可能都不存在。
打孔卡
这是最早的编程工具了。
如果大家有看过图灵的传记的话肯定知道最早的那个计算机是用什么来做输入的。一个个的转盘转到指定的位置,来表示输入,然后等状态输出的转盘转到特定的位置来表现表示输出。
打孔卡也一样,通过孔的状态来去区分 0 和 1。这样有个好处就是可以通过这张卡的数量来动态的控制输入输出。但是同样还是有问题,当你的打孔卡有地方出错的时候,修改起来十分麻烦,至少某一段打孔卡你要完全重新编辑。
直到后面电子媒介产生,大家可以通过使用特定的编码来存储信息,才有了进一步使用电子输入设备编辑文本和代码的可能性。
TECO
我们看一下上古时代的几个经典编辑器。
第一个能称道的就是 TECO(Text Editor & Corrector)。它首先是一个面向字符的编辑器,其次是一个用于文本处理的编程语言。
TECO 是 PDP-1 时代的产品。在 TECO 之前,有一个叫“昂贵的打字机”(Expensive Typewriter),可以接入 IBM 的打字机作为输入,在 PDP-1 上进行文字处理。这个名字的后半部分来自于另外一个早期的编辑器“巨型打字机”(Colossal Typewriter),作者是 LISP 之父,约翰麦卡锡;前半部分嘛,就是因为 PDP-1 比起打字机来贵得多了。
TECO 的整体思路是为了提升 PDP-1 的利用率,所以在设计思路上与直接通过控制台来编辑文档的思路不同。TECO 会接受两个磁带的输入,一个是源文本磁带,另外一个是更正磁带,TECO 会读取更正磁带上的指令来即时修改源文本磁带上的内容。这样作为操作人员只需要实时输入指令就能实现即时编辑文档了。
所以更正磁带其实就相当于是用来做文本处理的程序,因为 TECO 实现的太过于复杂,以至于这些命令组合起来是图灵完全的。所以,TECO 完全可以作为一个编程语言来用。
TECO 的命令以及后面加入的宏足够强大,以至于后面把编辑宏(Edit MACroS)集合起来打包发布了一个应用,EMACS。
(待续)