acm-header
登录

ACM通信

BLOG@CACM

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


来自onada的Doug Meil

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

几年前,我有机会参观了位于加州山景城的计算机历史博物馆。这是一个很棒的博物馆,在众多展品中有一幅墙壁大小的编程语言演变图。这个图表是如此之大,以至于任何曾经在任何地方写过“Hello World”的人都会有一种冲动,把鼻子贴在墙上,一节一节地搜索,试图找到他们最喜欢的语言。我当然不相信。下一个本能反应是用他们的食指沿着图表上“受影响”的边缘回溯时间。或者向前,这取决于语言的年龄。

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

如果你站得*远*后,这张图也说明了一个问题。

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

左边的标题写着……

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

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

昔日的好时光

在当今的计算机领域,有太多的东西是理所当然的。在早期,所有东西都是昂贵而有限的:存储、内存和处理能力。人们不得不逆风上坡,两种方式,仅仅是为了去计算机实验室,然后通宵熬夜,以获得使用计算机的时间。有一件事是更容易在那个时期,编程语言的命名空间还处于起步阶段,20世纪50年代和60年代的最初的编程语言有机会被精确地命名为它们所做的事情: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的主要设计重点之一是平台可移植性。不幸的是,至少在非微软平台的发展中,这并不是微软的目标之一,这使得Sun microsystems——当时开发Java的公司——和微软发生了冲突,并从1997年开始引发了诉讼。这种紧张的关系最终导致微软发布了另一种名为c#(2002)的语言,它看起来很像Java,但不是。c#在微软的开发堆栈中占据了“中间”位置,而且与Java不同,它是微软可以控制的。

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

总设计控制

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

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

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

特别感谢

非常感谢计算机历史博物馆的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