Create 20140412 My Lisp Experiences and the Development of GNU Emacs.md

This commit is contained in:
geek 2018-08-16 12:49:55 +08:00 committed by GitHub
parent 243a26581e
commit dd9d8d89c5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -0,0 +1,109 @@
我的Lisp体验和GNU Emacs的开发
Richard Stallman的演讲稿2002年10月28日国际Lisp会议
由于我的常见演讲都没有与Lisp有任何关系因此它们都不适用于今天。所以我将不得不放弃它。由于我在与Lisp相关的职业生涯中做了足够的事情我应该能够说些有趣的事情。
我第一次使用Lisp是在高中时阅读Lisp 1.5手册。就在那时我的想法是因为可能有类似的计算机语言。我第一次有机会和Lisp做任何事情的时候是我在哈佛大学的新生我为PDP-11写了一个Lisp解释器。这是一个非常小的机器 - 它有类似8k的内存 - 我设法用一千个指令编写解释器。这为我提供了一些数据空间。那是在我看到真正的软件之前,它做了真正的系统工作。
一旦我开始在麻省理工学院工作我开始与JonL White一起开展真正的Lisp实现工作。我在人工智能实验室雇用的不是JonL而是来自Russ Noftsker考虑到将要发生的事情这是最具讽刺意味的 - 他当然一定非常后悔。
在20世纪70年代在我的生活因可怕的事件而变得政治化之前我只是为了各种程序而一个接一个地进行扩展其中大多数与Lisp没有任何关系。但是在此过程中我写了一个文本编辑器Emacs。关于Emacs的有趣想法是它有一种编程语言用户的编辑命令将用这种解释的编程语言编写这样你就可以在编辑时将新命令加载到编辑器中。您可以编辑正在使用的程序然后继续编辑它们。所以我们有一个对编程以外的东西有用的系统但你可以在使用它的时候对它进行编程。我不知道它是否是第一个但它肯定是第一个这样的编辑。
这种构建巨大而复杂的程序以便在您自己编辑中使用然后与其他人交换这种精神的精神激发了我们在AI实验室进行的自由合作的精神。我们的想法是您可以将任何程序的副本提供给想要其副本的人。我们与想要使用它们的人共享程序它们是人类的知识。因此尽管没有有组织的政治思想与我们将软件与Emacs的设计共享的方式联系起来但我确信它们之间存在联系也许是一种无意识的联系。我认为这是我们在AI实验室生活的方式的本质它导致了Emacs并使它成为现实。
最初的Emacs里面没有Lisp。较低级别的语言非解释性语言 - 是PDP-10汇编程序。我们写的解释实际上并不是为Emacs编写的它是为TECO编写的。这是我们的文本编辑器并且是一种非常难看的编程语言尽可能难看。原因是它不是一种编程语言它被设计成一种编辑器和命令语言。有一些命令如'5l',意思是'移动五行',或'i'然后是一个字符串然后是一个ESC来插入该字符串。您将键入一个字符串该字符串是一系列命令称为命令字符串。你会用ESC ESC结束它它会被执行。
好吧,人们想用编程工具扩展这种语言,所以他们添加了一些。例如,第一个是循环结构,它是<>。你会把它们放在周围它会循环。还有其他神秘的命令可用于有条件地退出循环。为了制作Emacs我们1添加了具有名称的子程序的工具。在此之前它有点像Basic子程序只能用单个字母作为名称。这很难用大型程序编程因此我们添加了代码以便它们可以有更长的名称。实际上有一些相当复杂的设施; 我认为Lisp得到了TECO的放松保护设施。
我们开始使用相当复杂的设施,所有这些都是你能想到的最丑陋的语法,并且它起作用了 - 人们无论如何都能够在其中编写大型程序。显而易见的教训是像TECO这样的语言并没有被设计成编程语言这是错误的方法。您构建扩展的语言不应该被认为是事后的编程语言; 它应该被设计为编程语言。实际上我们发现用于此目的的最佳编程语言是Lisp。
是伯尼格林伯格他发现它是2。他在Multics MacLisp中编写了一个版本的Emacs并且他以直截了当的方式在MacLisp中编写了他的命令。编辑器本身完全是用Lisp编写的。事实证明Multics Emacs取得了巨大成功 - 编写新的编辑命令非常方便甚至他办公室的秘书也开始学习如何使用它。他们使用了某人编写的手册其中展示了如何扩展Emacs但并没有说这是一个编程。所以那些认为自己无法编程的秘书并没有被吓跑。他们阅读了手册发现他们可以做有用的事情并且他们学会了编程。
因此,伯尼看到了一个应用程序 - 一个对你有用的程序 - 里面有Lisp你可以通过重写Lisp程序来扩展它实际上是人们学习编程的一种非常好的方式。它让他们有机会编写对他们有用的小程序这在大多数领域是你不可能做到的。他们可以鼓励他们自己的实际用途 - 在最困难的阶段 - 他们不相信他们可以编程,直到他们达到程序员的程度。
那时人们开始想知道如何在他们没有完整服务Lisp实现的平台上得到这样的东西。Multics MacLisp有一个编译器和一个解释器 - 它是一个成熟的Lisp系统 - 但是人们希望在其他尚未编写Lisp编译器的系统上实现类似的东西。好吧如果你没有Lisp编译器你就无法在Lisp中编写整个编辑器 - 如果它必须运行解释的Lisp那就太慢了尤其是重新编译。所以我们开发了一种混合技术。我的想法是编写一个Lisp解释器和编辑器的低级部分以便编辑器的部分内置Lisp工具。这些将是我们认为必须优化的任何部分。这是我们已经在原始Emacs中有意识地实践的一种技术因为我们在机器语言中重新实现了某些相当高级别的特性使它们成为TECO原语。例如有一个TECO原语来填充段落实际上要完成填充段落的大部分工作因为一些耗时较少的部分工作将由TECO程序在更高级别完成 。您可以通过编写TECO程序来完成整个工作但这太慢了所以我们通过将其中的一部分放在机器语言中来优化它。我们在这里使用了相同的想法在混合技术中大多数编辑器都是用Lisp编写的但是必须以特别快的速度运行的某些部分才能在较低级别编写。因为我们在机器语言中重新实现了某些相当高级别的功能使它们成为TECO原语。例如有一个TECO原语来填充段落实际上要完成填充段落的大部分工作因为一些耗时较少的部分工作将由TECO程序在更高级别完成 。您可以通过编写TECO程序来完成整个工作但这太慢了所以我们通过将其中的一部分放在机器语言中来优化它。我们在这里使用了相同的想法在混合技术中大多数编辑器都是用Lisp编写的但是必须以特别快的速度运行的某些部分才能在较低级别编写。因为我们在机器语言中重新实现了某些相当高级别的功能使它们成为TECO原语。例如有一个TECO原语来填充段落实际上要完成填充段落的大部分工作因为一些耗时较少的部分工作将由TECO程序在更高级别完成 。您可以通过编写TECO程序来完成整个工作但这太慢了所以我们通过将其中的一部分放在机器语言中来优化它。我们在这里使用了相同的想法在混合技术中大多数编辑器都是用Lisp编写的但是必须以特别快的速度运行的某些部分才能在较低级别编写。完成填写段落的大部分工作因为一些耗时较少的工作部分将由TECO计划在更高层次完成。您可以通过编写TECO程序来完成整个工作但这太慢了所以我们通过将其中的一部分放在机器语言中来优化它。我们在这里使用了相同的想法在混合技术中大多数编辑器都是用Lisp编写的但是必须以特别快的速度运行的某些部分才能在较低级别编写。完成填写段落的大部分工作因为一些耗时较少的工作部分将由TECO计划在更高层次完成。您可以通过编写TECO程序来完成整个工作但这太慢了所以我们通过将其中的一部分放在机器语言中来优化它。我们在这里使用了相同的想法在混合技术中大多数编辑器都是用Lisp编写的但是必须以特别快的速度运行的某些部分才能在较低级别编写。
因此当我编写第二个Emacs实现时我遵循了同样的设计。低级语言不再是机器语言它是C. C是便携式程序在类Unix操作系统中运行的一种好的高效的语言。有一个Lisp解释器但我直接在C中实现了专用编辑工作的工具 - 操作编辑缓冲区,插入前导文本,读取和写入文件,重新显示屏幕上的缓冲区,管理编辑器窗口。
现在这不是第一个用C编写并在Unix上运行的Emacs。第一部由James Gosling撰写被称为GosMacs。他身上发生了一件奇怪的事。起初他似乎受到原始Emacs的共享和合作精神的影响。我首先向麻省理工学院的人们发布了最初的Emacs。有人希望将它移植到Twenex上运行 - 它最初只运行在我们在麻省理工学院使用的不兼容的分时系统。他们将它移植到Twenex这意味着全世界有几百个可能会使用它的安装。我们开始将它分发给他们其规则是“您必须将所有改进发回”这样我们才能受益。没有人试图强制执行但据我所知人们确实合作。
起初戈斯林似乎参与了这种精神。他在手册中写道他称Emacs计划希望社区中的其他人能够改进它直到它值得这个名字。这是采用社区的正确方法 - 要求他们加入并使计划更好。但在那之后,他似乎改变了精​​神,并把它卖给了一家公司。
那时我正在研究GNU系统一种类似Unix的自由软件操作系统许多人错误称之为“Linux”。没有在Unix上运行的免费软件Emacs编辑器。然而我确实有一位朋友曾参与开发Gosling的Emacs。戈斯林通过电子邮件允许他分发自己的版本。他向我建议我使用那个版本。然后我发现Gosling的Emacs没有真正的Lisp。它有一种被称为'mocklisp'的编程语言它在语法上看起来像Lisp但没有Lisp的数据结构。所以程序不是数据而且缺少Lisp的重要元素。它的数据结构是字符串数字和一些其他专门的东西。
我总结说我无法使用它并且必须全部替换它第一步是编写一个实际的Lisp解释器。我逐渐调整了编辑器的每个部分基于真正的Lisp数据结构而不是ad hoc数据结构使得编辑器内部的数据结构可以由用户的Lisp程序公开和操作。
唯一的例外是重新显示。很长一段时间重新显示是一个替代世界。编辑器将进入重新显示的世界并且会继续使用非常特殊的数据结构这些数据结构对于垃圾收集是不安全的不会安全中断并且在此期间您无法运行任何Lisp程序。我们已经改变了 - 因为现在可以在重新显示期间运行Lisp代码。这是一件非常方便的事情。
第二个Emacs计划是现代意义上的“自由软件” - 它是使软件免费的明确政治运动的一部分。这次活动的实质是每个人都应该自由地做我们过去在麻省理工学院做的事情,共同开发软件并与想与我们合作的任何人一起工作。这是自由软件运动的基础 - 我拥有的经验,我在麻省理工学院人工智能实验室的生活 - 致力于人类知识,而不是阻碍任何人进一步使用和进一步传播人类知识。
当时您可以制作一台与其他不适合Lisp的计算机价格相同的计算机除了它可以比它们更快地运行Lisp并且在每个操作中都进行全类型检查。普通计算机通常迫使您在执行速度和良好的类型检查之间做出选择。所以是的你可以拥有一个Lisp编译器并快速运行你的程序但是当他们试图获取car一个数字时它会得到无意义的结果并最终在某些时候崩溃。
Lisp机器能够以与其他机器一样快的速度执行指令但是每条指令 - 汽车指令都会进行数据类型检查 - 所以当你试图在编译的程序中得到一个数字的汽车时它会立即给你一个错误。我们构建了机器并为它配备了Lisp操作系统。它几乎完全是用Lisp编写的唯一的例外是在微码中编写的部分。人们开始对制造它们感兴趣这意味着他们应该创办公司。
关于这家公司应该是什么样的有两种不同的想法。格林布莱特希望开始他所谓的“黑客”公司。这意味着它将成为一家由黑客运营的公司并以有利于黑客的方式运营。另一个目标是维持AI Lab文化3。不幸的是Greenblatt没有任何商业经验所以Lisp机器组的其他人说他们怀疑自己能否成功。他们认为他避免外来投资的计划是行不通的。
他为什么要避免外来投资?因为当一家公司有外部投资者时,他们会接受控制,他们不会让你有任何顾忌。最后,如果你有任何顾忌,他们也会取代你作为经理。
所以Greenblatt认为他会找到一个会提前支付购买零件的顾客。他们会建造机器并交付它们; 通过这些零件的利润,他们将能够为更多的机器购买零件,销售这些零件,然后为更多的机器购买零件,等等。小组中的其他人认为这不可行。
然后Greenblatt招募了聘请我的Russell Noftsker后来他离开了AI Lab并创建了一家成功的公司。据信拉塞尔有商业天赋。他通过对群体中的其他人说“让我们放弃格林布拉特忘记他的想法我们将成为另一家公司。”他展示了这种商业天赋。在后面刺伤显然是一个真正的商人。那些人决定他们组建一家名为Symbolics的公司。他们会得到外部投资没有顾忌并尽一切可能获胜。
但格林布拉特没有放弃。无论如何他和忠于他的少数人决定启动Lisp Machines Inc.并继续他们的计划。你知道什么他们成功了他们得到了第一个客户并提前付款。他们建造机器并出售它们并建造了更多的机器和更多的机器。尽管他们没有得到团队中大多数人的帮助但他们确实取得了成功。Symbolics也取得了成功的开始所以你有两个竞争的Lisp机器公司。当Symbolics看到LMI不会掉在脸上时他们开始寻找破坏它的方法。
因此放弃我们的实验室之后在我们的实验室中进行了“战争”。除了我和少数在LMI兼职工作的人之外当Symbolics雇佣了所有的黑客时遗弃了。然后他们引用了一条规则并且淘汰了为麻省理工学院做兼职工作的人所以他们不得不完全离开只剩下我。人工智能实验室现在无能为力。麻省理工学院与这两家公司做了非常愚蠢的安排。这是一份三方合同两家公司都许可使用Lisp机器系统源。这些公司被要求让麻省理工学院使用他们的变化。但它没有在合同中说MIT有权将它们放入两家公司获得许可的MIT Lisp机器系统中。没有人设想AI实验室的黑客组织会被彻底消灭但确实如此。
因此Symbolics提出了一个计划4。他们对实验室说“我们将继续对可供您使用的系统进行更改但您无法将其置于MIT Lisp机器系统中。相反我们将允许您访问Symbolics的Lisp机器系统您可以运行它但这就是您所能做的一切。“
实际上这意味着他们要求我们必须选择一个侧面并使用MIT版本的系统或Symbolics版本。无论我们做出哪种选择都决定了我们改进的系统。如果我们研究并改进了Symbolics版本我们就会单独支持Symbolics。如果我们使用并改进了MIT版本的系统我们将为两家公司提供工作但是Symbolics认为我们将支持LMI因为我们将帮助它们继续存在。所以我们不再被允许保持中立。
直到那时我还没有站在任何一家公司的一边尽管让我很难看到我们的社区和软件发生了什么。但现在Symbolics迫使这个问题。因此为了帮助保持Lisp Machines Inc.5 - 我开始复制Symbolics对Lisp机器系统所做的所有改进。我自己再次写了相同的改进即代码是我自己的
过了一会儿6我得出结论如果我甚至不看他们的代码那将是最好的。当他们发布了发布说明的beta版时我会看到这些功能是什么然后实现它们。当他们真正发布时我也做了。
通过这种方式两年来我阻止他们消灭Lisp Machines Incorporated两家公司继续进行。但是我不想花费数年和数年来惩罚某人只是挫败了一个邪恶的行为。我认为他们受到了相当彻底的惩罚因为他们被那些没有离开或将要消失的竞争所困扰7。与此同时现在是时候开始建立一个新社区来取代他们的行动和其他人已经消灭的社区。
70年代的Lisp社区不仅限于麻省理工学院人工智能实验室而且黑客并非都在麻省理工学院。Symbolics开始的战争是麻省理工学院的战争但当时还有其他事件正在发生。有人放弃了合作共同消灭了社区没有多少人离开。
一旦我停止惩罚Symbolics我必须弄清楚下一步该做什么。我必须制作一个免费的操作系统这很清楚 - 人们可以一起工作和共享的唯一方法是使用免费的操作系统。
起初我想过制作一个基于Lisp的系统但我意识到这在技术上不是一个好主意。要拥有像Lisp机器系统这样的东西你需要特殊用途的微码。这使得以其他计算机运行程序的速度运行程序成为可能并且仍然可以获得类型检查的好处。没有它你将被简化为类似其他机器的Lisp编译器。程序会更快但不稳定。如果你在分时系统上运行一个程序就好了 - 如果一个程序崩溃那不是灾难这是你的程序偶尔会做的事情。但这并不能很好地编写操作系统所以我拒绝了制作像Lisp机器这样的系统的想法。
我决定改造一个类似Unix的操作系统让Lisp实现作为用户程序运行。内核不会用Lisp编写但我们有Lisp。因此操作系统GNU操作系统的开发使我编写了GNU Emacs。在这样做的过程中我的目标是实现绝对最小化的Lisp实现。节目的规模是一个巨大的问题。
那些日子里1985年有人拥有一台没有虚拟内存的1兆字节机器。他们希望能够使用GNU Emacs。这意味着我必须保持程序尽可能小。
例如,当时唯一的循环结构是'while',这非常简单。没有办法打破'while'语句你只需要执行catch和throw或者测试运行循环的变量。这表明我在努力保持小事做多远。我们没有'caar'和'cadr'等等; “挤出一切可能”是从一开始就是Emacs Lisp精神的GNU Emacs的精神。
显然,机器现在变大了,我们不再这样做了。我们放入'caar'和'cadr'等等我们可能会在其中一天进行另一个循环构造。我们现在愿意扩展它但我们不想将它扩展到常见的Lisp级别。我在Lisp机器上实现了一次Common Lisp我对此并不满意。我不太喜欢的一件事是关键字参数8。他们对我来说似乎不太好看; 我有时候会这样做,但是当我这样做时,我会尽量减少。
这不是与Lisp有关的GNU项目的结束。后来在1995年左右我们开始考虑启动一个图形桌面项目。很明显对于桌面上的程序我们希望编程语言能够编写大量内容以使其易于扩展就像编辑器一样。问题是应该是什么。
当时为了这个目的TCL正在被大力推动。我对TCL的看法很低主要是因为它不是Lisp。它看起来有点像Lisp但在语义上它不是而且它不那么干净。然后有人向我展示了一则广告其中Sun试图聘请某人在TCL工作使其成为世界“事实上的标准扩展语言”。我想“我们必须阻止这种情况发生。”因此我们开始将Scheme作为GNU的标准可扩展性语言。不是Common Lisp因为它太大了。我们的想法是我们将有一个Scheme解释器设计为以与TCL链接到应用程序相同的方式链接到应用程序中。然后我们建议将其作为所有GNU程序的首选可扩展性包。
使用像Lisp这样强大的语言作为主要的可扩展性语言可以获得一个有趣的好处。您可以通过将其翻译成主要语言来实现其他语言。如果您的主要语言是TCL则无法通过将其翻译成TCL来轻松实现它。但是如果你的主要语言是Lisp那么通过翻译来实现其他东西并不困难。我们的想法是如果每个可扩展的应用程序都支持Scheme您可以在Scheme中编写TCL或Python或Perl的实现将该程序转换为Scheme。然后您可以将其加载到任何应用程序中并使用您喜欢的语言进行自定义它也可以与其他自定义项一起使用。
只要可扩展性语言很弱,用户就必须只使用您提供的语言。这意味着喜欢任何特定语言的人必须竞争应用程序开发人员的选择 - 说“请,应用程序开发人员,将我的语言放入您的应用程序,而不是他的语言。”然后用户根本没有选择 - 无论哪个他们正在使用的应用程序带有一种语言,并且它们被[该语言]所困扰。但是,如果你有一种强大的语言可以通过翻译来实现其他语言,那么你就可以让用户选择语言了,我们不再需要语言大战了。这就是我们希望'Guile'我们的计划翻译会做的。我们去年夏天有一个人在完成从Python到Scheme的翻译工作。我不知道是不是' 已完全完成,但对于对此项目感兴趣的任何人,请与我们联系。这就是我们未来的计划。
我没有谈过自由软件,但让我简要地告诉你一些关于这意味着什么的信息。自由软件不涉及价格; 这并不意味着你是免费获得的。(您可能已经支付了一份副本,或者免费获得了一份副本。)这意味着您拥有作为用户的自由。关键是你可以自由运行程序,自由学习它的功能,可以随意改变它以满足你的需求,可以自由地重新发布其他人的副本并免费发布改进的扩展版本。这就是自由软件的含义。如果你使用非免费程序,你就失去了至关重要的自由,所以不要这样做。
GNU项目的目的是通过提供免费软件来取代它使人们更容易拒绝自由践踏用户主导非自由软件。对于那些没有道德勇气拒绝非自由软件的人来说当这意味着一些实际的不便时我们试图做的是提供一个免费的替代方案这样你就可以在没有混乱的情况下转向自由。实际上的牺牲。牺牲越少越好。我们希望让您更轻松地生活在自由合作中。
这是合作自由的问题。我们习惯于思考自由和与社会的合作,好像他们是对立的。但在这里他们是在同一边。使用免费软件,您可以自由地与其他人合作,也可以自由地帮助自己。使用非自由软件,有人会主宰你并让人们分裂。你不能与他们分享,你不能自由地合作或帮助社会,而不是你可以自由地帮助自己。分裂和无助的是使用非自由软件的用户状态。
我们已经制作了大量的免费软件。我们做过人们说我们永远做不到的事情; 我们有两个免费软件操作系统。我们有很多应用程序显然我们还有很长的路要走。所以我们需要你的帮助。我想请你自愿参加GNU项目; 帮助我们开发更多工作的免费软件。看看 http://www.gnu.org/help 找到如何提供帮助的建议。如果您想订购商品,可以在主页上找到相关链接。如果你想阅读哲学问题,请查看/哲学。如果您正在寻找可以使用的免费软件,请查看/directory其中列出了大约1900个软件包这是所有免费软件的一小部分。请写更多信息并为我们做出贡献。我的论文“自由软件和自由社会”正在出售可以在www.gnu.org上购买。快乐的黑客
--------------------------------------------------------------------------------
via: https://www.gnu.org/gnu/rms-lisp.html
作者:[Richard Stallman][a]
选题:[lujun9972](https://github.com/lujun9972)
译者:[geekmar](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.gnu.org
[1]:https://www.gnu.org/help/
[2]:http://www.gnu.org/