acm-header
登录

ACM通信

BLOG@CACM

为什么有这么多编程语言?


安东达的道格·梅尔

在20世纪90年代,我的一个朋友曾问我为什么有那么多编程语言。“为什么没有一种好的编程语言呢?”他问道。他精通计算机,但不是开发人员,至少不是全职的开发人员。我回答说,编程语言通常是为特定的任务或工作负载而设计的,从这个意义上说,大多数语言的差别较小可能的更重要的是他们的收入容易.最后这句话我记得是别人说的。这听起来很聪明也很合适,但事实是我真的不知道为什么会有这么多编程语言。这个问题一直萦绕在我的脑海里。

几年前,我有机会参观了加州山景城的计算机历史博物馆。这是一个了不起的博物馆,在众多展品中,有一幅墙壁大小的编程语言演化图。这个图表是如此之大,以至于任何曾经在任何东西上写过“Hello World”的人都有一种冲动,那就是把鼻子贴在墙上,逐段搜索,试图找到他们最喜欢的语言。我当然不相信。下一个本能是用他们的食指在时间上向后追踪图表“受影响”的边缘。或者转发,这取决于这些语言的历史。

自动生成的包含textDescription的图片
资料来源:计算机历史博物馆

如果你站得“远”一点,这幅图也会告诉你一个故事。

包含道路的图片,室内描述自动生成
资料来源:计算机历史博物馆

左边的标题写着……

“这张图表显示了数千种已经被发明的编程语言中的150种。一些是通用的,而另一些是为特定类型的应用程序设计的。很少有新语言是真正的新语言。箭头显示了新一代如何受到旧一代的影响。”

这清楚地表明,即使如此复杂的图景也只是更大动态的一个样本。上图的时间轴是从1954年到2000年。在创建这张图的时候,所有的编程语言都存在,甚至有*更多的*现在。软件界无法停止创造新的编程语言。

美好的旧时光

在当今的计算机领域,有太多东西可以被视为理所当然。在早期,所有东西都是昂贵和有限的:存储、内存和处理能力。人们不得不顶着风走上坡,才能到达计算机实验室,然后整夜不睡才能使用计算机。有一件事是更容易在那个时期,编程语言的命名空间是一个新领域,最初的编程语言从1950年代和1960年代就被命名为精确地根据他们所做的事情:FORTRAN(公式翻译器),COBOL(通用业务导向语言),BASIC(初学者通用符号指令代码),ALGOL(算法语言),LISP(列表处理器)。大多数人可能没有听说过SNOBOL(面向字符串和符号语言,1962年),但不需要太多猜测就可以确定它试图做什么。如果在那个时期对面向对象编程概念有了更充分的理解,我们就有可能使用类似“OBJOL”的语言进行编码——这是一种明确命名的面向对象语言,至少通过那个时代的命名模式是这样的。

值得注意和赞赏的是PL/I(1964)的大胆,它的目标是实现这一点“一种好的编程语言。”它的名字说明了一切:编程语言1。不需要2、3或4。尽管PL/I计划成为苏格兰高地的人虽然计算机编程并没有像设计者预期的那样进行,但他们仍然在拉着软件的一个关键线索:为什么有这么多语言?这个问题早在20世纪60年代初就有人提出了。

此时此地

Scala(2003)、Go(2009)、Rust(2010)、Kotlin(2011)和Swift(2014)只是2000年以来创建的一些语言的例子。还有很多。在今天的技术形势下,似乎应该如此已经成为这些基本语言属性的每一种组合……

  • 许可证
    • 开源(各种许可证类型),商业的
  • 平台
    • 操作系统,硬件支持
  • 语言范式
    • 过程的、功能的、面向对象的等等。
  • 输入系统
    • 动态的,静态的,等等。
  • 并发性
    • 单线程、多线程
  • 内存管理
    • 自动垃圾回收,手动
  • 执行
    • 解释,编译到虚拟机,本地编译等。
  • 其他语言特性
    • 就内置数据类型和数据结构、数据库和网络功能以及其他功能功能和实用程序而言,这是一个巨大的潜在列表。

服务于任何平台上的每一个低级、高级、函数、过程、对象、单线程、多线程、编译或脚本需求。既然如此,为什么新的语言仍然被创造出来的?我认为最大的主题是控制。

控制和财富

微软在20世纪90年代中期提供的主要开发语言是Visual Basic和Visual c++,这两种语言都是从计算机历史博物馆语言图上的旧节点派生出来的。Visual Basic在为Windows桌面平台构建前端应用程序方面很受欢迎,但缺乏许多高级语言特性(例如,数据结构、线程)。Visual c++则处于光谱的另一端——开发人员几乎可以做任何事情,但c++很复杂。可以说,这是一种“中间语言”的机会。1996年,Java突然出现了。Java是一种功能齐全的面向对象语言,很少有c++的尖锐特点,这一事实非常引人注目,我甚至还记得在微软的Visual j++第一次出现时,我对它进行了一番研究。所有人都加入了Java的行列。

Java的主要设计重点之一是平台可移植性。不幸的是,至少就非微软平台而言,这不是微软的目标之一,这让当时支持Java的Sun微系统公司和微软陷入了冲突,并从1997年开始引发了诉讼。这种紧张的关系最终导致微软发布了另一种叫做c#(2002)的语言,它看起来很像Java,但实际上不是。c#占据了微软开发栈的“中间”位置,与Java不同,它是微软能够控制的东西。

这几乎是一个奇怪的证据,证明了Java的广泛吸引力,这不是唯一的Java诉讼。甲骨文在2010年起诉谷歌在Android移动平台上使用Java,因为甲骨文在收购Sun Microsystems后成为了Java语言的所有者。这是一场长达十年的法律斗争,最终于2021年到达美国最高法院。

总设计控制

维护和发展一个现有的系统是具有挑战性的,我已经写了很多关于这个主题的BLOG@CACM帖子,例如Log4j和管理软件组件升级的费力不讨好的高风险任务而且快速系统转换的艺术.软件增长的悖论是,对系统的更多采用会导致更多的使用,从而导致更大的成功,然后会有更多的采用。但是随着采用和使用的增加,它可能会导致系统变得更加难以更改,特别是在大的方面,因为这样的更改有破坏向后兼容性的风险。这不是不可能,只是很难。

管理编程语言的发展可以说是这些困难案例中最难的一个。编程语言用户就是开发人员,优秀的开发人员不仅具有生产力,而且能够以创造性的方式使用语言特性,而不是所有的这些特性都是作者想要的。如果存在需要发现的边缘案例,开发人员将会发现它们,特别是在规模上。围棋(2009)是一个想要做更多事情的有趣例子而且更少。创建它的一个驱动因素是需要在谷歌的集装箱云环境中进行高效和可预测的部署。另一个驱动因素是对强大语言的渴望,特别是在网络和并发性方面,但不是在语言特性方面是非常强大的,因为作者显然也是出于对c++的复杂性的“共同厌恶”。假设,谷歌可以通过为谷歌已经使用的现有语言构建一个新的编译器和运行时引擎来解决第一个驱动程序。虽然这不是一个简单的任务,但谷歌有很多聪明人,所以这是一种可能。但要改变什么开发人员将选举人如何他们正在做的——需要对编程语言的语法和功能进行更改,而这些类型的更改是很难的——特别是当开发人员被告知某些事情不再被允许或必须以不同的方式进行时。有时,为手边的用例创建一些新东西会更容易,至少如果有资源(谷歌有资源),那么可以重新开始。一次。另一个节点被添加到计算机历史博物馆的计算机语言的墙壁大小的图形中。

围棋之前有一种不相关但更强调的语言,叫做围棋!(带有撇号),表明语言名称空间的区分正变得越来越困难。为什么碰撞之后谷歌仍然使用这个名字?我不知道。图。

特别感谢

非常感谢计算机历史博物馆的Dag Spicer通过电子邮件给我发送了计算机编程语言进化图的PDF。谢谢你!

参考文献

〇计算机历史博物馆https://computerhistory.org/

美好的旧时光

此时此地

控制

选择BLOG@CACM帖子

Log4j和管理软件组件升级的费力不讨好的高风险任务

快速系统转换的艺术

道格·梅尔是医疗保健数据管理和分析方面的软件架构师。他还在2010年创立了克利夫兰大数据Meetup。他的更多ACM帖子可以在这里找到https://www.linkedin.com/pulse/publications-doug-meil


评论


保罗McJones

很好的文章。有兴趣了解FORTRAN、COBOL、BASIC、ALGOL、LISP、SNOBOL、PL/I的历史,以及APT、JOVIAL、GPSS、SIMULA(提示:它影响了Smalltalk和c++)、JOSS和APL的读者应该看看第一届编程语言历史会议——可以在这里免费获得:https://dl.acm.org/doi/book/10.1145/800025


显示1评论

Baidu
map