争论
即使是黑客,也不是千人一面。黑客也有各种各样的。把那些只做坏事的「自称黑客」除开不算,黑客中也存在着各种兴趣、各种文化。而且他们往往因自己的意见和文化而产生争论。像这样的争论主题有很多典型的有:「哪个编程语言最优秀啊?」「哪个操作系统最好啊?」「最厉害的编辑器究竟是Emacs还是Vi啊?」等。这回我就以最后问的那个「Emacs还是Vi」为例来眺望一下黑客文化圈吧。
从TECO进化而来的Emacs
最早的Emacs,是理查德·斯托曼(Richard Stallman)为TECO编辑器开发的宏。Richard Stallman以GNU的运动而闻名,但其实他本来也是超一流的黑客,写起代码也是不含糊的,这一点可别忘了。TECO是具备宏功能的行编辑器(Line Editor)。Stallman则使用它的宏功能,编写了最早的Emacs——和TECO不同,Emacs是全屏幕编辑器。
据记载,在TECO上实现Emacs是1976年的事情。后来,Java的设计者詹姆斯·高斯林(James Gosling)在1981年开发了UNIX版的Emacs。Gosling开发的Emacs(通称Gosling Emacs或Gosmacs)拥有一种叫做MockLisp的、类似Lisp的语言来扩展它的功能。但是Gosling把Gosmacs的著作权卖给了UniPress公司,Stallman不能以Gosmacs为基础来开发新的Emacs。
结果,不能以UniPress Emacs为基础进行开发的Stallman再次从零开始开发Emacs。这就是现在广泛使用的GNU Emacs。GNU Emacs参考了Gosmacs的扩展性,但使用的并不是MockLisp那样的山寨语言,而是内含了更为「正宗」的Lisp——Emacs Lisp。Emacs本体只包含了基本的编辑功能和Emacs Lisp,绝大多数方便的功能都是随后使用Emacs Lisp实现的。也就是说,普通用户也能用Emacs的基本功能为基础实现各种各样的功能。其实,Emacs中(包括支持编程语言的各种模式在内的)各种编辑辅助功能,都是由用户提交的代码所实现的。此外,除了文本编辑器,Emacs还提供了无所不包的扩展功能,例如阅读电子邮件、新闻组、浏览Web、玩游戏之类之类。Emacs已经不单单是一个编辑器了,它已经发展成了一种集成环境、甚至可以说是一种操作系统了。
从ed进化而来的vi
vi是VIsual editor之略,它是由BSD的核心人物、曾长期担任太阳微系统公司(Sun Microsystems)副总的比尔·乔伊(Bill Joy)在1976年开发的,是以UNIX的标准行编辑器ed和ex为基础,加入了全屏编辑功能的产物。它能轻松地通过ed macro进行非对话模式的作业,随时都能安心地回到行编辑的状态。到了现在,需要这两项功能的机会应该是很少了,不过我在当学生的时候,有时因为终端出了问题,在行编辑模式下使用过vi。
话说我学生时代有个叫E君的朋友,他那时总爱用行编辑器ed。有天他感叹道,「要是有个编辑器既能像less那样直接看满屏,又能用ed命令编辑就好啦。做个lessed吧」,于是开始弄(hack)less的源代码。我不忍卒视,就告诉他「那个就是vi啊」,他深受震动。那是1988年的事情。每天都在用UNIX却不知道vi,究竟是大牛呢,还是奇葩呢?
本页出现的专门用(mài)语(méng)
- 在行模式下使用vi
当不知道全屏编辑所必需的、终端的控制字符的时候,vi会在行模式下启动。也就是说在ed兼容模式下工作啦。 - 做个lessed吧
那时要是没告诉他vi的存在,或许现在就有能和Emacs、vi三分天下的黑客用编辑器了呢。可惜啊!
新泽西PK麻省
vi可以说是UNIX哲学的体现。在新泽西州贝尔实验室出世的UNIX,它的哲学强调「将许多单一工具组合起来的灵活性」。熟谙UNIX工具的人,肯定会想起把各种过滤器组合在一起的「管道处理」。将cat、grep、awk、sed、nroff、pic、tbl等单功能工具用管道连在一起工作,可以说是一种高超的技艺。在UNIX哲学看来,编辑器也被看作上述工具的一种。获取两个文件的不同之处的diff,指定-e选项就输出ed脚本。将输出结果的最后加上「w」交给ed,就能自动改写并保存文件。不过,这种方式的危险在于,只要文件略有更改,就会导致悲惨的结果,所以现在人们几乎都在使用略微聪明一些的patch命令,而不是ed。
如上所述,vi这个工具反映的是「Small Is Beautiful、Keep It Simple」(小既是美、保持简约)的思想。
与之相对的Emacs反映的是另一种思想。Emacs现在由于常在UNIX上使用,容易被看作UNIX系编辑器,但其实它原先不是在UNIX上开发的。
Emacs(被认为)反映的是MIT(美国麻省理工学院)的Lisp文化。Lisp于1958年诞生于MIT。(Matz写作本文的时候)已经快50年了呢。几乎所有的Lisp处理系统,都是通过交互对话进行处理的;采取的开发方式则是「将程序所必须的函数一个个定义出来,逐渐完善开发环境」。可以想像,在这样的环境中成长起来的Lisp Hacker看来,「在Lisp处理系统中加上编辑功能,逐渐将其完善成编辑器」这种做法,是非常自然而然的。考虑到1970年代的Stallman是著名的Lisp Hacker,可以说是「有了他才有了这个编辑器」呢。
Emacs的魅力在于其扩展性,也可以叫作「可编程性」。将Emacs作为开发的基础,利用其本身具备的屏幕操作等基本功能,可以有效地开发程序。我自己就开发了许多辅助日常编辑的Emacs用小工具,还开发了支持Ruby编辑和缩进的rubymode、Emacs上的两个邮件阅读器(email和morq)。
但是,Emacs在作为编辑器的同时又吸纳了各种功能,导致它变得越来越复杂、臃肿。有人称其为「厨房水槽」。
UNIX思想通过小工具的组合提供灵活性;Lisp思想通过可编程的工具提供灵活性。两个编辑器的对立同时也是两种思想的对立。
NASA乱入
不过,由于后来Emacs被看作UNIX上代表性的编辑器,战况变的有些复杂。双都被认为是UNIX的好机友,以往的UNIX对Lisp的这种容易看出的对立模式变得难以识别。随后,由于另一个「厨房水槽」Perl的参战,原先的对立模式变得完全看不出了。
Perl试图将UNIX文化中通过个别工具提供的功能全打包到一种语言当中。开发者Larry Wall(当时在NASA喷气推进实验室工作)是否受到Lisp文化的影响,并不好说;但他广为展示了「厨房水槽」方式的有效,这倒是毋庸置疑的。最终,Perl成了UNIX文化和Lisp文化之间的桥梁。
各位读者在看到「Emacs对vi」的争论时,请追寻它们身后UNIX和Lisp思想对决的轨迹吧。思想虽然不停地在改变外形,但它们一直活在黑客们的文化中。
本页出现的专门用语
- Lisp于1958年诞生于MIT
Lisp之父是约翰·麦卡锡(John McCarthy)。将其作为实际的编程语言开发出来的是史帝芬·罗素(Steve Russell)。 - morq
morq是基于全文检索的邮件阅读器。
本文由开源杂志2005年7月号的《松本行弘的黑客生活》重构而成。