首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

10种最具影响力的编程语言

前几天,我读了这篇“20种有史以来最重要的编程语言”,这是一张“我刚刚编出来的荒谬的表格”。它之所以荒谬,是因为他列出的“最重要的”语言中包含了Go,但没有包含ALGOL、Smalltalk或ML。他也没有提到Pascal,因为它“基本上已经消亡了”。荒谬!这完全违背了“有史以来最重要”的含义。

那么,让我们来讨论一下那些“几乎已经消亡”的语言,以及它们如此重要的原因。

免责声明:是的,不是所有这些都已经消亡了,也不是所有这些都被遗忘了。就像大多数人一样,是听说过Smalltalk的,对吧?此外,这可能还会出现上亿个错误,因为当你对60年的计算机历史进行调查时,你总会犯一些错误。如果你发现什么错误,可随时大声指责我!

免责声明2:是的,我知道其中一些是“首个发明”的,而另一些是“首个普及”的。历史很复杂!

探测影响力

在开始之前,先简单介绍一下如何寻找影响力。仅仅知道X是首个具有Z特性的语言并不意味着X实际上影响了Z。虽然Absys可以说是首个逻辑编程语言,但几乎所有的逻辑编程实际上都是源于Prolog了,后者是独立开发的。最终,只有一种方法可以确定X影响了Y:引用。这意味着:

  • Y在其参考手册中引用了X;
  • Y引用了的论文中引用了X;
  • Y的作者说过“我们受到了X的影响”。

引用是可传递的。有时,Q语言的手册会列出激励性文献R,其中R引用了论文S作为灵感,并提到S的灵感是从语言T那里得到的。那么,我们就知道T影响了Q,即使这个链条有好几个步骤。这意味着需要通过多种途径寻找信源。为了加快速度,我们使用启发式的方法来决定在哪里查找。

一种有效的启发式方法是编程语言的同根词。对于语言来说,独立地提出相同的语法是非常罕见的。因此,如果两种语言某种语法相同,则其中一种可能会影响另一种。例如:即使没有阅读Matz的设计决策,我们也知道Ruby受到了Smalltalk的影响,因为它们都使用select方法过滤列表。这不是确凿的证据。也许它是Matz独立开发出来的,也许Ruby和Smalltalk都受到共同祖先的影响。但这给了我们一个开始寻找的方向。

语言

COBOL

背景:CODASYL,1960年。COBOL是由计算领域的商业/科学分裂形成的。那时,高级工业语言要么用于工程计算,要么用于管理数据。工程师们都支持FORTRAN,而商业世界却是一团乱码,充斥着诸如COMTRAN、FLOW-MATIC等语言,因此,国防部成立了一个委员会,共同制定了一种通用的商业语言。那就是COBOL。

COBOL与ALGOL、FORTRAN和LISP一起构成了四种“母”语。今天,虽然我们认为它是小语种,但它曾经是世界上最流行的语言。我们的许多遗留商业系统仍然在其上运行着。

重要意义:就语法和语义而言,我们在现代计算中很少看到COBOL了。 COBOL最重要的附加功能是提出了记录数据的概念。在FORTRAN和ALGOL中,唯一的数据结构是静态数组。但是,在COBOL中,我们可以读取包含分层数据的结构化文件,它会自动将这些文件解构为代表变量。它是现代结构体的先驱。

消亡原因:这里有两个因素。一:COBOL与其他PLT所做的工作没有重叠。很少有人会基于COBOL进行构建。这意味着,建立在祖先教训之上的第二代或第三代语言几乎没有COBOL基因了。这不是COBOL的本质问题,更多的是因为学术界对COBOL的创建过程不屑一顾。CODASYL 是一个商业团体,显然它不值得关注(1)。即使是对于今天的语言来说,COBOL也是非常复杂的。这意味着COBOL编译器在微型计算机和微型电脑上落后于同时代的编译器,为其他语言的繁荣并最终超越它提供了空间。

ALGOL

背景:ALGOL委员会,1960年。ALGOL-58早在两年前就问世了,但很快就被取代了,因此我将它们组装在一起。该委员会想为算法研究提供一种良好的语言。换句话说,ALGOL是一种形式化的“伪代码”。

在四种母语中,ALGOL是最早“消亡”的语言。大家仍然知道LISP(2) ,COBOL仍然为大量的遗留系统提供支持,并且大多数科学软件包仍然具有FORTRAN。但是我见过很多程序员,他们甚至都没有听说过ALGOL。你可能会认为它是最不重要的母语了,但事实恰恰相反。在这四种母语中,只有LISP可以与ALGOL的普遍重要性相提并论。

重要意义:让我们来看一下:词法作用域、结构化编程、嵌套函数、形式化语言规范、按名称调用语义、BNF语法、块注释……今天的每一种现代语言都深受ALGOL的影响。

消亡原因:ALGOL是一种研究语言,而不是商业语言。它是专为算法研究而设计的。规范没有定义任何I/O,这使得它在实践中无法使用。当然,你可以编写一个编译器扩展,但是你还需要添加更多其他的东西。

人们就是这么做的。 1960年,有70人通过用I/O和额外的数据结构来扩展ALGOL,开发了大量的类似ALGOL的语言。这包括JOVIAL、SIMULA、CLU和CPL。后来的语言都是基于这些类ALGOL语言而不是直接基于ALGOL进行扩展的。我们称C为“类ALGOL(ALGOL-like)”,但实际上它是“类BCPL(BCPL-like)”,也就是“类CPL(CPL-like)“,即为类ALGOL。 ALGOL的孩子们把它埋没了。

最终,ALGOL人试图将其扩展到ALGOL-68,而ALGOL-68完全脱离了ALGOL-60,但它并没有获得那么大的影响力。 ALGOL-60的血统通过Nikolaus Wirth的Pascal仍在延续。

APL

背景:Ken Iverson,1962年。最初它是一种用于数组数学的手写表示法,后来IBM将其作为编程语言使用。作为一种语言,APL专注于数组处理:它能够精确地处理大数字块。

如果你以前曾听说过APL,则可能知道它是“那种奇怪的符号语言”。最臭名昭著的代码片段之一就是这个“生命游戏(the Game of Life)”的实现:

life←{↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵}

必须使用专用的键盘来编写它,就像这样:

APL键盘(来源

尽管如此,APL因其内存需求低而在大型机上广受欢迎。

重要意义:数组处理。每次将两个数字列表相加就意味着需要一个映射或一个循环,APL引入了同时操作整个数组的概念。例如:

   1 + 1 2 3 4
2 3 4 5
   1 2 3 4 + 1 2 3 4
2 4 6 8
   2 4 ⍴ ⍳8
1 2 3 4
5 6 7 8
   1 2 3 4 +[2] 2 4 ⍴ ⍳8
2 4  6  8
6 8 10 12

这在科学界确实是一件大事。如此多的应用数学都可归结为对大型矩阵的大规模运算。当你可以把外部产品 ∘.f ,外部产品就很容易拿到了!

通过这一创新,APL引出了R、numpy、pandas、Matlab等。APL的直系后代还包括:J、Dyalog、K、Q。它们虽然没有那么成功,但在金融领域仍然有大量的应用。

消亡原因:很明显,问题在于键盘。如果你无法使用ASCII进行编写,那么你就不能编写太多的内容。Iverson用J修复了该问题,J使用了有向图来代替不同的符号。编写~:,而不是≠。不过,那是在1990年,要普及一种完全不同的编程风格还是为时已晚了。

更微妙的问题在于,APL和J仅适用于同构数据的处理。不能将字符串和数字都存储在同一个数据结构中(除非你使用box,这是一个完整的“蠕虫罐头”),并且处理字符串通常是一场噩梦。因此没有数据帧,这就将许多现代数据科学排除在外了。

扩展阅读:作为思想工具的符号

BASIC

背景:John Kemeny,1964年。最初它是一种简化了的类FORTRAN语言,旨在帮助工程技术以外的人们使用计算机。

BASIC的真正腾飞是在微型计算机时代。最初的微型计算机没有足够的内存来编译“真正的”编程语言,而我们可以把BASIC编译器精简到大约2 KB。 BASIC成为了早期程序员的通用语言。在20世纪70年代,如果你在家编程,那么你可能是在微型计算机上编写BASIC。

10 PRINT "Hello, World!"
20 END

重要意义:其最大的技术影响力在于运行时解释器。 BASIC是首个具有实时解释器(the Dartmouth Time Sharing System,达特茅斯时间共享系统)的语言,领先了APL一年。而且APL系统仅面向IBM客户,因此,在很长一段时间内,实时解释器就是BASIC的,或是不存在的。(3)

BASIC有更大的社会影响力。它为家庭,尤其是孩子们带来了编程。 在80年代和90年代,许多有影响力的程序员首先学习的都是如何使用BASIC编程。许多企业程序也是用BASIC编写的,这可能加速了Cobol的衰落。

BASIC还有一个妙招:Office工具!微软最终将BASIC变成了Visual Basic,并将其用作Office的宏语言。之后,将它扩展到了OpenOffice和LibreOffice,从而巩固了BASIC在特定利基市场的地位。最近,它已被JavaScript取代,现在成为了一种遗留的宏语言。

消亡原因:人们认为BASIC是一种“次要”的语言。如果你是个小孩或小企业主,你可能会使用它,但是真正的程序员使用的是真正的语言。一旦制造商可以廉价地制造出具有超过16k内存的微型计算机时,他们就开始会为了Pascal和C而贬低BASIC了。

BASIC作为一种遗留的语言教学方式在孩子们的生活中延续了一段时间,但似乎也已经消失在这个利基市场之外了。

PL/I

**背景:IBM,1966年。IBM的业务被分成两种语言:科学家使用FORTRAN,商业人士使用COMTRAN。面对来自COBOL的竞争,为了简化系统,他们试图开发一种对工程和商业都有用的语言。它看起来像是两种语言的超集,在顶部还添加了许多附加功能。(4)**现在每个人都可以使用相同的语言了,并且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淘汰了。

扩展阅读:PL/I的选择

SIMULA 67

背景:Ole Dahl和Kristen Nygaard,1967年。他们扩展了ALGOL来进行仿真。首先,他们开发了SIMULA I,它具有专用的仿真器和“活动”语法。 SIMULA I 获得了一些早期的应用,但是两人对该语言的“专业化”程度以及在仿真中存在的大量重复代码感到不满。他们希望创建一个更通用的框架来表示一般事物,而不仅仅是仿真。

他们的想法是允许用户使用多态函数解析来定义称之为“类”的新类型。然后,用户可以将仿真特性作为对象系统中的一个特例来进行构建,从而用户就可以轻松根据自己的特定需求来定制对应的仿真特性了。

重要意义:虽然SIMULA并不是首个“真正的” OOP语言,但它是首个具有适当对象的语言,并为其他语言的构建奠定了基础。这包括类/对象的拆分、子类、虚拟方法和受保护的属性等。 它几乎启发了所有1967年之后的关于对象的学术研究。CLU和ML都将SIMULA作为其主要灵感的来源。 Bjarne Stroustroup在SIMULA上完成了他的博士学位,最终将它的许多思想整合到了C ++中。

消亡原因:在同一份博士论文中,Stroustroup声称SIMULA太慢了,无法大规模使用。 “如果你不在大型机上工作,那么祝你一切顺利”。值得一提的是,Smalltalk-80采用了同样的思路,甚至更进了一步,它在背后还附加了13年的摩尔定律。甚至Smalltalk也常常被嘲笑太慢了。每个人都在SIMULA中实现了他们可以集成到更快、更简单的语言中的想法。

扩展阅读:编译SIMULA:技术起源的历史研究,《SIMULA的历史》

Pascal

背景:Niklaus Wirth,1970年。在ALGOL-68的结构变得过于复杂,而不适合Wirth的喜好之后,他抓住了ALGOL-60的精髓从而开发了Pascal。Pascal最初是作为“ CS入门”语言而发展起来的,到80年代初,它已成为了Usenet工作板上第二受欢迎的语言。Wirth认为整个Pascal、Modula、Oberon家族是一个统一的语言概念。

重要意义:Pascal没有引入任何全新的观点。它是一种刻意保守的语言,它试图挑选出过去十年最好的部分,并以一个统一的包来提供它们。 Pascal将ALGOL语法带出了学术界,以至于ALGOL的赋值语法 :=被称为“Pascal风格”。从这一点上来看,大多数看起来像ALGOL的语言特性很可能是受Pascal启发的,而不是直接受ALGOL本身启发的。

尽管Pascal并不是很有创意,但它的变体却很有创意。Wirth还率先提出了“逐步细化”的概念,以作为编写严谨软件的一种手段。这最终导致了Modula(推广了一级软件模块)和Euclid(首个用于生产的形式化验证语言)的产生。

消亡原因:我在此称之为“加击”。与这个列表中的大多数其他语言不同,Pascal没有重大的结构化障碍,也没有强有力的竞争对手。当然,它与C存在竞争关系,但在很长一段时间里,它仍然表现良好。人们通常将其归因于“为什么Pascal不是我最喜欢的语言”这篇论文,但这个答案太简洁了,而历史要复杂得多。另外,Delphi在TIOBE和PYPA度量中仍然排名很高,因此它并没有像SIMULA一样完全消亡了。对Pascal陨落的准确分析比本文其余部分还要长的多。

扩展阅读:编程语言PascalPascal及其继承者

CLU

背景:Barbara Liskov,1975年。Liskov想要处理抽象数据类型。它就这样产生了。这就是CLU的全部原因。

重要意义:CLU可能是人们从未听说过的最有影响力的语言。迭代器? CLU。抽象数据类型?CLU。泛型? CLU。异常检查? CLU。

我们并没有采用相同的术语,因此它并不是100%都来自于CLU,但仍然如此。未来十年的每种语言规范都是对CLU进行命名的。 CLU做了很多。

消亡原因:CLU是一种展示性语言。Liskov想让人们接受她的想法,而不是这种特定的语言。他们做到了:如今几乎所有的语言都应归功于CLU。她一完成CLU,便转到了Argus,该项目本来是为了展示她关于并发的想法。它并没有采用几乎相同的方法,而且留下了很多需要挖掘的东西。

扩展阅读:CLU的历史

ML

背景:Robin Milner,1976年6月,Milner正在构建LCF校准器,这是首批校准器助手之一。如果采用正确的格式编写了一份证明,LCF可以检查出它是否正确。为了帮助撰写证明,Milner创建了一个基于健全数学形式的元语言,这在当时意味着严格的静态类型和高阶函数。最终,ML被标准化为Standard ML。

重要意义:ML可以说是最古老的“代数编程语言”。有很多东西可以归因于ML:代数数据类型、模块、类型化函数式编程。令人惊讶的是,它并不是第一次这样做的!设计第一个ML只是为了配合LCF的使用,它并不是一种通用语言,因此缺少了许多这类特性。随着人们开始更广泛地使用它,他们从其他研究语言中汲取了一些想法并将其纳入ML。不过,一个非常重要的概念确实源于ML:类型推断。 ML是首个无需键入类型的静态类型语言,因为编译器会为你找出相应类型。这为类型化FP逃离学术界并进入生产应用铺平了道路。

ML还极大地影响了现代定理的校验。 Isabelle、CVC3和Coq的“程序”语言都是基于ML的。尽管近年来,FP的Haskell分支变得越来越流行,但很多类型理论都是基于ML的。(7)

消亡原因:ML具有许多有趣的特性,但人们关注它仅是因为它的类型推断。当时ML仍然是一种专用于定理校验的语言。 SML与Haskell在同一年问世,Haskell是一种“更纯粹”的类型化FP语言示例。

Smalltalk

背景:Alan Kay,1972年、1976年和1980年。这有一个不断变化的目标。 Smalltalk-72是首个,Smalltalk-76将“面向对象编程”的概念引入到了更广阔的世界,而Smalltalk-80则被广泛采用。

Smalltalk不是首个使用对象的语言,但它是首个提出“面向对象”的语言。区别在于,Simula除了具有数字和布尔值等基本类型之外,还具有其他的对象,而在Smalltalk中,布尔值也是对象。如果你想了解更多,可以查看我写在这里的内容。

重要意义:我们有时认为Smalltalk是“真正的” OOP,而Java和Python之类的语言并不是“真正的” OOP,但事实并非如此。就像其他范式一样,OOP是一个由许多不同影响所组成的巨大的混合体。但Smalltalk无疑是推广这一概念。如果你翻开80年代中期或90年代初期的任何一本关于OOP基础理论的书籍,它们都是建立在Smalltalk上的。许多人还将Smalltalk示例转换为C++,少数人将使用另一种语言,但每个人都会使用Smalltalk。

Smalltalk还传播了对象可作为共享数据的概念,从而导致了CORBA的出现,并启发创建了可计算Actor模型。

消亡原因:人们普遍认为Smalltalk衰落,是因为人们改用了C++。但这并不是真的。 Smalltalk确实有一些问题,特别是它很难与其他工具交互,并且运行时性能很差。但是,即使到了1990年代,Smalltalk仍在做着受人尊敬的生意,许多人认为它将成为一种占主导地位的商业语言。

Java的发展趋势:

来源

Smalltalk并不是“Javapocalypse”的唯一受害者:Java还边缘化了Eiffel、Ada95以及OOP世界几乎所有的其他语言。一个有趣的问题不是“为什么Smalltalk会消亡”,而是“为什么C++能够生存”。我认为这是因为C++具有更好的C互操作性,因此能更容易地扩展到遗留系统中。

总结

这只是已消亡的重要语言中的一小部分。我没有涵盖ALPHARD、ALTRAN、Argus、Automath、BCPL、COMTRAN、CPL、Eiffel、FLOW-MATIC、HOPE、Hypercard、ISWIM、JOVIAL、MacSyma、Mesa、Miranda、Multics Shell、PLANNER、SMP、Sketchpad或SNOBOL 。它们都以自己的方式为现代编程领域做出了贡献。历史是复杂的。

最具影响力的语言从未成为主流。很少有人会使用它们中的任何一个。但是每一种语言都鼓舞了人们,也鼓舞了其他人,因此这些被遗忘的语言的基因在它们被遗忘了几十年后才显现出来。但也有不计其数的语言没有把它们的想法表达出来。 《编程语言百科全书》列出了8,000多种编程语言。它们中的许多想法从未消失。想想如果没有人听说过SIMULA,或者Liskov从未分享过CLU,我们将会损失多少东西。

这就是我喜欢研究历史的原因之一。去了解我们丢失了什么并重新将其找回来。


这篇文章的初稿最初是在我的时事通讯上分享的。如果你觉得它很有趣,为什么不订阅它呢?

感谢Miikka KoskinenKevlin Henney、Eric Fischer和Levi Pearson对本文更正和反馈。


备注

  1. 这很讽刺。
  2. 不管怎样,人们都知道Lisplikes,足够接近了。
  3. 究竟是BASIC还是JOSS是首个尚存争议,因为它们几乎是在同一时间开发的,而且都分阶段推出的。但是JOSS只有几百个用户,对现代语言几乎没有影响。
  4. 请注意,PL/I读作“Programming Language One”,而不是“Programming Language Eye”。I应该是罗马数字。
  5. PL/I实际上将这些称为“泛型函数”,但其实现与重载相同。PL/I没有任何抽象数据类型的概念,而这种抽象数据类型出现是十年之后的事情了。
  6. 这里的时间轴有点奇怪。人们说它是在1972-73年出版的,但他们在1977年时提交POPL论文时,声称它时在“两年前”可用的。
  7. Haskell从HOPE和Miranda那里获得的收益比ML还要多。

原文链接:

https://www.hillelwayne.com/post/influential-dead-languages/

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/42Q8QBRDMJpR5iqp9yEu
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券