为什么会有这么多编程语言?
标签: 为什么会有这么多编程语言?
2023-07-13 18:23:35 110浏览
【编者按】本文主要探讨为什么存在这么多的编程语言,以及新的编程语言为什么不断地被创造出来。作者从计算机历史博物馆的一幅展示编程语言演化的巨图入手,分析了不同的编程语言是如何受到前人的影响,以及如何针对特定的任务或工作负载而设计的。作者认为,控制是创造新编程语言的最大主题,因为不同的公司或组织可能有不同的目标或需求,而现有的编程语言可能难以满足或改变。
原文链接:https://cacm.acm.org/blogs/blog-cacm/262424-why-are-there-so-many-programming-languages/fulltext
未经允许,禁止转载!
作者 | Doug Meil 译者 | 枫叶聊斋
责编 | 夏萌
出品 | CSDN(ID:CSDNnews)
在上世纪 90 年代,一位朋友问我为何存在那多的编程语言。他虽然对计算机有所了解,但并非专业开发者。他不解地问:“为何没有出现一个卓越的编程语言?” 。我回答说,编程语言通常是针对特定的任务或工作负载而设计的,从这个意义上说,大多数语言在它们能够实现什么方面差别不大,而更多的是在于它们使什么变得容易。最后一句话是我从别人那里听来的,我感觉很有道理,很贴切。其实这个问题我也没想明白。
几年前,我有幸参观了加利福尼亚山景城的计算机历史博物馆。这个博物馆收藏丰富,其中一幅编程语言演变图让人印象深刻。这幅图非常让人震撼,无论是用过任何语言写过 “Hello World” 的人都会情不自禁地走过去观看,找找自己钟爱的语言,我也没能例外。人们本能地用指尖追溯图中的 "影响" 轨迹,深入了解这些语言的历史发展和未来趋势,具体内容取决于他们所关注语言的年代。
图片来源:计算机历史博物馆
这张图从远处看,就像在讲述一段故事。
图片来源:计算机历史博物馆
图表左侧的标题写道:
"这幅图给我们展示了大概 150 种编程语言,它们只是无数编程语言中的一部分。这些语言中有通用型的,也有专用型的。新语言很少能够完全摆脱旧语言的束缚,它们都受到了旧的语言的启发或者借鉴,这些关系用箭头标注出来了。"
这意味着,这张复杂的图表只是编程语言演变的一小部分罢了。图表上的时间线是 1954 年到 2000 年。而此图开始制作时已经存在的编程语言,现在已经更多了。软件界似乎总有新的编程语言出现。
往事如烟
我们现今在计算领域所视为理所当然的事物,回望计算机的初期时代,都显得不可思议。早在那时,存储、内存和处理能力都是昂贵且稀缺的资源。为了能在计算机实验室使用计算机,人们需要克服种种困难,无论环境多么艰苦。然而,在那个时代,相对来说,编程语言的命名空间还是一片未开垦的土地,1950年代和1960年代初的编程语言可以直接以其功能进行命名,比如 FORTRAN(Formula Translator,公式翻译器)、COBOL(Common Business Oriented Language,通用商业的通用语言)、BASIC(Beginner's All-purpose Symbolic Instruction Code,初学者通用符号指令代码)、ALGOL(Algorithmic Language,算法语言)以及 LISP(List Processor,列表处理器)。你可能没听过 SNOBOL(String Oriented and Symbolic Language, 面向字符串和符号编程语言,1962年)这个名称,但通过名称,你能够轻易推测出这门语言是用来做什么的。
若在那个时期,面向对象的编程概念被更为广泛地理解,我们可能会用一种叫做 "OBJOL" 的语言编程——这将是一个根据那个时代的命名模式直接命名的面向对象语言。
我们必须赞赏 PL/I(1964年)的大胆之处,它试图成为那个 "唯一的优秀编程语言"。它的名字已经表明了一切:编程语言1。理论上不应该存在 2、3 或 4。虽然 PL/I 并未如其设计者期望的那样成为计算机编程的"不朽之作",但它确实引出了软件行业的一个核心问题:早在 1960 年代初,人们就开始提出这个问题:为什么有这么多种编程语言?
此时此刻
Scala(2003年)、Go(2009年)、Rust(2010年)、Kotlin(2011年)和 Swift(2014年)只是自 2000 年以来创造出的众多编程语言的一部分。今天的技术环境中,似乎已经有适用于所有基础语言特性组合的编程语言,包括:
许可证:开源(各种类型的许可证)、商业
平台:操作系统、硬件支持
语言范式:过程式、函数式、面向对象等
类型系统:动态、静态等
并发性:单线程、多线程
内存管理:自动垃圾收集、手动管理
执行方式:解释执行、编译到虚拟机、本地编译等
其他语言特性:内置的数据类型和数据结构、数据库和网络功能以及其他实用性能,构成了一份庞大的候选列表。
似乎这些编程语言已经足够满足在任何平台上的任何低级、高级、函数式、过程式、对象、单线程、多线程、编译或脚本需求。那么,为什么新的编程语言仍在不断地被创造出来?在我看来,最大的原因是对控制权的追求。
掌控与命运
在二十世纪九十年代中叶,微软的主要开发语言是 Visual Basic 和 Visual C++,它们都起源于较早的计算机语言。Visual Basic 因其在构建 Windows 桌面应用的前端方面展示出的优秀能力而受到青睐,但在诸如数据结构和线程等高级语言特性方面却显得力不从心。而 Visual C++ 则呈现出另一种情况——开发者可以通过它实现几乎所有的功能,但这也意味着他们必须面对 C++ 的高复杂性。
在那个时期,出现了一种位于两者之间,折中的语言的机会,接着在 1996 年,Java 应运而生。作为一种全能的面向对象语言,Java 既没有 C++ 的过度复杂,又提供了丰富的功能性,这一特点令人瞩目。我至今记得在微软的 Visual J++ 刚刚发布的时候,我也曾尝试过使用它。那时候,几乎每个人都加入了这场 Java 的盛宴。
Java 的主要设计理念之一就是跨平台性。不幸的是,这与当时微软主张的只在自家平台运行的策略产生了冲突,这也就引发了支持 Java 的 Sun Microsystems 公司与微软之间从 1997 年开始的诉讼。双方的关系趋于紧张,最终导致微软在 2002 年推出了另一种看似与 Java 极为相似,但实则非 Java 的语言:C#。C# 成功地填补了 Visual Basic 和 Visual C++ 之间的空缺,并且是微软可以完全掌控的一种语言,这与 Java 极为不同。
Java 的广泛影响力实际上证明了它的重要性,这远远超过了与单一诉讼的关系。2010 年,Oracle 以 Google 在 Android 移动平台上使用 Java 为由,对 Google 提起诉讼,这是因为 Oracle 在收购了 Sun Microsystems 后成为了 Java 语言的所有者。这场法律纠纷持续了十年,最终在 2021 年进入了美国最高法院的审理程序。
全面设计控制
系统维护与发展常常颇具挑战性,我在 BLOG@CACM 的多篇帖子中讨论过这个话题,例如《Log4j 和无感的高风险任务:管理软件组件升级》和《快速系统转换的艺术》。软件增长的悖论在于,系统接受度的增长会带来使用量的提升,从而可能带来更大的成功,并进一步吸引更多的使用者。然而,随着系统的采用和使用增加,可能会变得越来越难以进行改变,特别是大规模的改变,因为这可能会破坏向后兼容性。虽然这种情况并非无解,但的确非常困难。
管理编程语言的发展可能是最难的挑战之一。开发者是编程语言的用户,他们不仅生产力高,而且经常会以创新的方式使用语言特性,其中有些使用方式甚至可能超出了语言的初始设计预期。如果存在特定的边缘情况,尤其在大规模应用场景下的开发者,终将会找出并利用这些情况。
Go 语言(2009 年发布)是一个典型的例子,其设计目标旨在做出权衡:足够强大,但又不过于复杂。Go 语言的诞生部分源于 Google 对一种能在其容器化云环境中高效、可预测部署的语言的需求。另外一个原因是希望有一种语言能够在网络和并发性方面有强大的能力,但在语言特性方面不要太繁杂,因为设计者们显然对 C++ 的复杂性感到反感。
Google 或许可以通过为它自身已经在使用的语言构建新的编译器和运行时引擎来满足第一个需求。尽管这并非易事,但 Google 有足够的人才资源来实现这一目标。然而,改变开发者正在做的事情以及他们的开发方式需要对编程语言的语法和功能进行调整,而这种改变往往相当困难,尤其是当开发者被告知某些事情不再被允许或必须以不同方式进行时。
有时候,只要有足够的资源(如 Google),针对手头的用例创建新的东西,然后从零开始可能会更加容易。于是,计算机历史博物馆的计算机语言墙面图又增加了一个节点。
Go 语言的名称实际上与 2003 年的一个完全不相关但更强调语法的语言 Go! (带感叹号)有所冲突,这反映出语言命名空间的差异化正变得越来越难。尽管存在这种冲突,Google 为何仍选择这个名称?这个问题我不得而知,你可以自行探索。
致谢
在此我要向计算机历史博物馆的 Dag Spicer 表达深深的感谢,他通过邮件向我提供了计算机编程语言发展图的 PDF 文件。十分感谢!
参考资源
计算机历史博物馆 - 链接:https://computerhistory.org/
编程语言发展史 - 链接:https://en.wikipedia.org/wiki/Timeline_of_programming_languages
PL/I - 链接:https://en.wikipedia.org/wiki/PL/I
《挑战者》(电影)- "只能有一部" - 链接:https://en.wikipedia.org/wiki/Highlander_(film)
编程语言范式对比 - 链接:https://en.wikipedia.org/wiki/Comparison_of_multi-paradigm_programming_languages
Sun/Microsoft Java 诉讼:
2002年的报道:链接:https://www.cnet.com/tech/tech-industry/sun-microsoft-settle-java-suit/
2009年的报道:链接:https://www.cnet.com/tech/tech-industry/sun-settles-with-microsoft-announces-layoffs/
Visual J++ - 链接:https://en.wikipedia.org/wiki/Visual_J%2B%2B
Oracle/Google Java 诉讼 - 链接:https://www.bbc.com/news/technology-56639088
Go! (2003) - 链接:https://en.wikipedia.org/wiki/Go!_(programming_language)
Go (2009) - 链接:https://en.wikipedia.org/wiki/Go_(programming_language)
BLOG@CACM 文章精选:
Log4j 和无感的高风险任务:管理软件组件升级(链接:https://cacm.acm.org/blogs/blog-cacm/257897-log4j-and-the-thankless-high-risk-task-of-managing-software-component-upgrades/fulltext)
快速系统转换的艺术(链接:https://cacm.acm.org/blogs/blog-cacm/252981-the-art-of-speedy-systems-conversions/fulltext)
你是否曾被编程语言的选择困扰过?在你的开发经历中,你是否发现了某个编程语言在特定任务上的优势?让我们一起在评论区分享你的见解吧!
推荐阅读:
▶微信新增文章朗读功能;超越 ChatGPT 记录,Threads 上线 5 天用户破亿;在删除数据前如何通知客户|极客头条
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论