前几天,我阅读了历史上最重要的20种编程语言,这是一个“我刚刚编造的荒谬的表格”。他肯定说对了:他把围棋列为“最重要的”,而不是ALGOL、Smalltalk或ML。他还去掉了Pascal,因为它“几乎已经死了”。太荒谬了!这违背了“在历史上具有重大意义”的全部意义。
那么,让我们来谈谈一些“几乎已经消亡”的语言,以及它们为什么如此重要。
免责声明:是的,并不是所有的这些都已经死了,也不是所有的这些都被遗忘了。就像大多数人都听说过Smalltalk一样,对吗?而且这里面可能有十亿个错误,因为当你调查60年的计算历史时,你会弄错一些东西。如果你看到什么,尽管对我大喊大叫!
免责声明2:是的,我知道有些是“最先发明的”,有些是“最先普及的”。历史是复杂的!
在我们开始之前,先快速介绍一下如何找到影响力。仅仅知道X是第一种具有功能Z的语言并不意味着X实际上影响了Z。虽然Absys可以说是第一种逻辑编程语言,但几乎所有的逻辑编程实际上都源于独立开发的Prolog。归根结底,只有一种方法可以确定X对Y的影响:引用。这意味着其中一个。
引用是可传递的。有时Q的语言手册列出了激励文档R,它引用了论文S作为灵感,其中提到它是从语言T获得的想法。然后我们知道T影响了Q,即使这条链有几个步骤长。这意味着要挖掘很多来源来寻找信号。为了加快速度,我们使用启发式算法来决定在哪里查找。
一种有效的启发式方法是编程语言同源词。语言独立地提出相同的语法是非常罕见的。因此,如果两种语言共享一些语法,其中一种很可能会影响另一种。例如:即使没有阅读Matz的设计决策,我们也知道Ruby受到了Smalltalk的影响,因为它们都使用select方法过滤列表。这不是确凿的证据。可能是Matz独立想出来的,也可能是Ruby和Smalltalk都受到了共同祖先的影响。但它给了我们一个开始寻找的地方。
背景:CODASYL,1960。COBOL是由计算领域的商业/科学分裂形成的。当时,高级行业语言要么用于工程计算,要么用于管理数据。工程师们都支持FORTRAN,而商业世界却一团糟,COMTRAN、FLOW-马季奇等等,所以国防部召集了一个委员会来制定单一的通用商业语言。那是COBOL语言。
COBOL是与ALGOL、FORTRAN和LISP并列的四种“母亲”语言之一。虽然我们今天认为它是一句笑点,但它曾经是世界上最流行的语言。它仍然运行着我们的很多遗留业务系统。
意义:就语法和语义而言,我们在现代计算中看不到太多的COBOL。COBOL最重要的补充是记录数据的概念。在FORTRAN和ALGOL中,您唯一的数据结构是静态数组。不过,在COBOL中,您可以读入具有分层数据的结构化文件,它会自动将它们分解为代表性变量。这是现代建筑的前身。
死因:这里有两个因素。其一:COBOL与PLT的其他努力没有重叠。很少有人在COBOL上构建。这意味着建立在祖先经验基础上的第二代或第三代语言几乎没有COBOL DNA。这不是COBOL的固有问题,更多的是因为学术界对它的创造过程不屑一顾。CODASYL是一个商业集团,显然不值得关注。1 COBOL也极其复杂,即使对于今天的语言也是如此。这意味着COBOL编译器在微型计算机和小型机上落后于同时代的人,为其他语言的蓬勃发展并最终击败它提供了空间。
背景资料:ALGOL委员会,1960年。ALGOL-58在两年前问世,但很快就被取代了,所以我把它们包装在一起。该委员会希望为研究算法创造一种良好的语言。换句话说,ALGOL是一个形式化的“伪代码”。
在四种母语中,ALGOL是最“死”的;每个人仍然知道LISP,2COBOL仍然支持大量的遗留系统,大多数科学软件包仍然有一些FORTRAN。但是我遇到了很多甚至没有听说过ALGOL的程序员。你会认为它是母语中最不重要的,但事实恰恰相反。在这四种语言中,只有LISP能与ALGOL的普遍重要性相提并论。
意义:让我们看看:词法作用域、结构化编程、嵌套函数、形式语言规范、按名称调用语义、BNF语法、块注释…。今天的每一种现代语言都深受ALGOL的影响。
死因:ALGOL是一种研究语言,不是商业语言。它是为研究算法而设计的。该规范没有定义任何I/O,这使得它不可能在实践中使用。当然,您可以编写编译器扩展,但是您也可以添加其他东西。
而这正是人们所做的。1960年和1970年,人们通过用I/O和额外的数据结构扩展ALGOL,制造了大量类似ALGOL的程序。这包括JOVIAL、SIMULA、CLU和CPL。后来的语言就是基于这些扩展的,而不是直接基于ALGOL的。我们称C为“类ALGOL”,但实际上它是类BCPL的,是类CPL的,是类ALGOL的。阿尔戈尔的孩子们把它埋了。
最终ALGOL人试图将其扩展到ALGOL-68,ALGOL-68从根本上脱离了ALGOL-60,并且没有产生同样的影响。ALGOL-60的血统继续着尼克劳斯·沃斯的帕斯卡。
背景资料:肯·艾弗森(Ken Iverson),1962年。最初是数组数学的手写表示法,后来IBM将其作为编程语言使用。作为一种语言,APL专注于数组处理:能够简洁地操作大块数字。
如果你以前听说过APL,你可能知道它是“那种奇怪的符号语言”。最臭名昭著的代码片段之一是这个生活游戏的实现:
Life←{↑1⍵∨.。∧3 4=+/,1 0 1∘。⊖‘1 0 1∘。⌽⊂⍵}。
意义:数组处理。当将两个数字列表相加意味着映射或循环时,APL引入了一次对整个数组进行操作的想法。例如:
1+1 2 3 4 2 3 4 5 1 2 34+1 2 3 4 4 6 8 2 4⍴⍳8 1 2 3 4 5 6 7 8 1 2 34+[2]2 4⍴⍳8 2 4 6 8 6 8 10 12。
这在科学界真的是一件大事。如此多的应用数学归结为对大型矩阵的大规模运算。当您只需使用∘.f文件就可以使用外部产品时,使用外部产品真的非常容易!
通过这一创新,APL引出了R,Numpy,Pandas,Matlab等。APL的直系后代也有:J,Dyalog,K,Q。他们虽然不太成功,但在金融领域仍然有很大的用处。
死因:嗯,最明显的问题是键盘。如果你不能用ASCII写,你就不会写太多。艾弗森用J修复了这个问题,J使用有向图而不是不同的符号。您可以写~:而不是≠。不过,那是在1990年,要普及一种截然不同的编程风格有点晚了。
更微妙的问题是,APL和J只处理同质数据。您不能在同一数据结构中同时存储字符串和数字(除非您使用的是盒子,这是一种完全不同的蠕虫),使用字符串通常是一场噩梦。所以没有数据帧,这就排除了很多现代数据科学。
背景资料:约翰·凯梅尼(John Kemeny),1964年。最初是一种简化的类似FORTRAN的语言,旨在帮助工程学以外的人使用计算机。
BASIC真正的腾飞是在微型计算机时代。第一代微型计算机没有足够的内存来编译“真正的”编程语言,而你可以把一个精简的BASIC编译器塞进大约2千字节。Basic成为早期程序员的通用语言。如果你在1970年代在家编程,你很可能是在微型计算机上写BASIC。
意义:最大的技术影响是运行时解释。BASIC是第一个拥有实时口译器(达特茅斯分时系统)的语言,比APL早了一年。而且APL系统只对IBM客户可用,所以在很长一段时间内,它实际上要么是基本的,要么什么都没有。3个。
BASIC产生了更大的社会影响。它把编程带到了家庭,特别是孩子们。20世纪80年代和90年代的许多有影响力的程序员首先学会了如何用BASIC编程。许多企业程序也是用BASIC编写的,这可能有助于加速Cobol的衰落。
Basic还有一个巧妙的招数:办公工具!Microsoft最终将Basic转变为Visual Basic,并将其用作Office宏语言。这随后蔓延到OpenOffice和LibreOffice,巩固了Basic在这一特定领域的地位。最近,它输给了JavaScript,现在是一种遗留的宏语言。
死因:人们认为Basic是一种“次要”语言。如果您是一个孩子或小企业主,您可能会使用它,但真正的程序员使用的是真正的语言。一旦制造商可以廉价地制造内存超过16K的微型计算机,他们就开始将PASCAL和C等语言的BASIC降价。
Basic作为传统的孩子们教授语言曾存在过一段时间,但似乎也已经从这个利基市场消失了。
背景资料:IBM,1966年。IBM的业务被分成两种语言:面向科学家的Fortran和面向商界人士的COMTRAN。面对来自COBOL的竞争,并希望简化他们的系统,他们试图创建一种既可用于工程目的又可用于商业目的的语言。这最终看起来像是这两种语言的超集,上面钉了一堆额外的功能。现在每个人都可以使用相同的语言,IBM可以赚更多的钱!呀。
意义:ALGOL-68的作者嘲讽地称PL/I是一种过时的语言。但ALGOL-68所做的每一件事,PL/I都做得更早、更好。COBOL首先获得结构化数据,而PL/I是第一个将它们实现为类型的语言。在COBOL中,读入一个有名称的用户会得到两个全局变量,USER和NAME。在PL/I中,您将获得一个带有字段user.name的变量。PL/I也是第一种具有用于直接内存操作、常量和函数重载的指针的高级语言。5个。
这些想法中的许多都是通过C语言进入主流编程的,C语言混合了BCPL和PL/I。C甚至使用PL/I的注释语法。
死因:所有的FORTRAN程序员都认为它太像COBOL,所有的COBOL程序员都认为它太像FORTRAN。IBM曾试图用一种复杂得多的语言来挑战两种成熟的语言。他们是唯一一个使用编译器的小组,这也没有帮助,这意味着其他每个人都不信任供应商锁定。当IBM能够在这两个问题上取得进展时,更广泛的计算世界已经进入了微型计算机时代,在这个时代,PL/I已经被BASIC超越了。
背景:Ole Dahl和Kristen Nygaard,1967。他们对ALGOL进行了扩展以进行模拟。首先,他们制作了SIMULA I,它有专门的模拟和“活动”语法。SIMULA我看到了一些早期的使用,但两人对语言的“专门化”程度和他们在模拟中有多少重复代码感到不满。他们想要建立一个更通用的框架来表示一般的事物,而不仅仅是模拟。
他们的想法是允许用户使用多态函数解析定义称为“类”的新类型。然后,用户可以将模拟功能作为对象系统的一个特例来构建,这样就可以很容易地根据他们的特定需求来定制所有这些功能的工作方式。
意义:虽然SIMULA不是第一种“真正的”面向对象语言,但它是第一种具有适当对象的语言,并且为其他语言奠定了很多基础。这包括类/对象拆分、子类化、虚方法和受保护属性。它激发了1967年后几乎所有关于物体的学术研究。CLU和ML都将SIMULA作为灵感的主要来源。Bjarne Stroustroup在SIMULA上攻读博士学位,最终将它的许多想法整合到C++中。
死因:在同一篇博士论文中,Stroustroup声称SIMULA的使用速度太慢,无法大规模使用。“如果你不在大型机上,祝你做任何事都好运”,速度很慢。值得一提的是,Smalltalk-80将同样的想法做得更进一步,它的背后多了13年的摩尔定律。甚至连Smalltalk也经常被嘲笑为太慢了。每个人都去实现了SIMULA的想法,即他们可以集成到更快、更简单的语言中。
背景资料:尼克劳斯·沃斯(Niklaus Wirth),1970年。在ALGOL-68变得太复杂之后,为了捕捉ALGOL-60的精髓而制造的,这对沃斯来说太复杂了。它最初作为“CS入门”语言声名鹊起,到80年代初成为Usenet求职公告板上第二受欢迎的语言。Wirth认为整个家族-Pascal、Moda和Oberon-都是一个统一的语言概念。
意义:帕斯卡并没有引入任何全新的想法。这是一种刻意保守的语言,试图挑选过去十年中最好的部分,并将其打包提供。Pascal把ALGOL语法带到了学术界之外,以至于ALGOL的赋值语法:=被称为“Pascal风格”。从这一点上看,大多数看起来像ALGOL的语言特性更有可能是受到PASCAL的启发,而不是直接受到ALGOL本身的启发。
虽然Pascal不是很有创新性,但它的变种很有创新性。Wirth还率先提出了“逐步细化”的想法,将其作为编写严谨软件的一种手段。这最终导致了Modulas和Euclid的出现,Modulas普及了一流的软件模块,而Euclid则是第一个看到产品使用的正式验证语言。
死因:我要叫穆利根来处理这件事。与榜单上的大多数其他公司不同,Pascal没有重大的结构性障碍,也没有激烈的竞争对手。当然,它与C竞争,但在很长一段时间里它仍然做得很好。人们通常认为“为什么帕斯卡”不是我最喜欢的语言散文,但这个答案太巧妙了,而且历史要杂乱无章得多。此外,德尔福在TIOBE和Pypa方面的排名仍然相当高,所以它并没有像SIMULA那样完全死亡。对帕斯卡衰落的准确分析将比本文的其余部分更长。
背景资料:芭芭拉·利斯科夫(Barbara Liskov),1975年。利斯科夫想要摆弄抽象数据类型。就这样。这就是克鲁的全部原因。
意义:CLU可能是没人听说过的最有影响力的语言。迭代器?克鲁。抽象数据类型?克鲁。仿制药?克鲁。是否检查异常?克鲁。
我们没有采用相同的术语,所以不是100%明显地全部来自CLU,但仍然是这样。未来十年的每一种语言规范都将命名为rop CLU。克鲁做了很多事。
死因:CLU是一种展示语言;利斯科夫想让人们采纳她的想法,而不是她的具体语言。他们做到了:今天几乎每种语言都要归功于CLU。她一完成CLU,就转到了Argus,那里应该展示她关于并发性的想法。这并没有看到几乎同样的领养,仍然有很多东西留给我。
背景资料:罗宾·米尔纳,1976年。6米尔纳正在建造LCF校验器,这是第一批校对助手之一。如果您以正确的格式编写了校样,LCF可以检查它是否正确。为了帮助撰写证明,米尔纳创建了一种基于健全的数学形式的元语言,在当时,这意味着严格的静态类型和高阶函数。最终ML被标准化为标准ML。
意义:ML可以说是最古老的“代数编程语言”。有很多东西我们归功于ML:代数数据类型、模块、类型化函数式编程。令人惊讶的是,这并不是许多这样的事情的第一次!第一个ML只是为使用LCF而设计的,并不是一种通用语言,因此缺少很多这些特性。当人们开始让它变得更通用时,他们从其他研究语言中提取想法,并将它们合并到ML中。不过,一个非常重要的思想确实起源于ML:类型推理。ML是第一种无需将类型写出来的静态类型语言,因为编译器会为您找出类型。这为fp打字机逃离学术界进入生产使用铺平了道路。
ML也极大地影响了现代定理证明者。用于Isabelle、CVC3和Coq的“程序”语言是基于ML的。虽然最近几年FP的Haskell分支变得更加流行,但是很多类型理论都是基于ML的。7个。
死因:ML有很多有趣的特征,但人们关注它是因为类型推断。当时,ML仍然是定理证明者的专用语言。SML与Haskell同年问世,Haskell是一个更“纯粹”的类型化FP语言示例。6个。
背景:艾伦·凯(Alan Kay),1972年、1976年和1980年。它是一种移动的目标。Smalltalk-72是第一个,Smalltalk-76向更广泛的世界介绍了“面向对象的编程”的概念,Smalltalk-80是被广泛采用的。
Smalltalk不是第一种具有对象的语言,但它是第一种“面向对象”的语言。不同的是,Simula除了像数字和布尔值这样的原语之外还有对象,而在Smalltalk中,布尔值也是对象。如果你想了解更多,我在这里写了一点。
重要提示:我们有时认为Smalltalk是“真正的”面向对象程序设计,而像Java和Python这样的东西不是“真正的”面向对象程序设计,但事实并非如此。OOP是许多不同影响的巨大混乱,就像所有其他范例一样。但这肯定是让这个想法流行起来的东西。如果你翻开80年代中期或90年代初的任何一本面向对象的一般理论书籍,它们都会出现在Smalltalk中。许多人还会将他们的示例翻译成C++,少数人会使用另一种语言,但每个人都会使用Smalltalk。
SmallTalk还传播了对象是可共享数据的思想,引领了CORBA的发展,并启发了计算参与者模型。
死因:人们普遍认为Smalltalk失败是因为人们使用了C++。但事实并非如此。Smalltalk确实存在一些问题,特别是它难以与其他工具交互以及运行时性能不佳。但即使到了20世纪90年代,Smalltalk仍在做着令人尊敬的生意,许多人认为它将成为一种占主导地位的商业语言。
Smalltalk并不是“Javapocalysis”的唯一受害者:Java还边缘化了Eiffel、Ada95以及OOP世界中的几乎所有其他产品。有趣的问题不是“Smalltalk为什么死了”,而是“C++为什么活了下来”。我认为这是因为C++有更好的C互操作,所以更容易扩展到遗留系统中。
这只是重要的死亡语言中的一小部分。我不包括Alphard、Altran、Argus、Automath、BCPL、COMTRAN、CPL、埃菲尔、Flow-马季奇、HOPE、HyperCard、ISWIM、Jovia、MacSyma、Mesa、Miranda、Multics Shell、Planner、smp、Sketchpad或SNOBOL。他们都以自己的方式为现代编程世界做出了贡献。历史是复杂的。
大多数有影响力的语言从未成为主流。几乎没有人使用它们中的任何一个。但每一种语言都激励了人们,也激励了其他人,所以这些被遗忘的语言的DNA在被遗忘的几十年后才会出现。但也有一些不为人知的语言没有把他们的想法表达出来。编程语言百科全书列出了8000多种编程语言。他们中的许多人都有从未离开过他们的泡沫的想法。想想看,如果没有人听说过SIMULA,或者利斯科夫从来没有分享过CLU,我们会损失多少。
.