编程语言的好坏其实没那么重要

这篇文章表达了我对编程语言流行度的看法。我认为,没有人知道为什么某些语言受欢迎,而另一些不受欢迎,因此,我也可以在这一片纷争中表达自己的想法。当然,这完全出自我个人的猜测,并没有任何数据支持我的研究。我的中心论点是,实际使用何种编程语言(语法、语义、范例)并不重要。重要的是运行时的特性,简单来说,就是正在运行中的进程的内存是什么样的?

首先,我们来观察一个现象。许多软件都是用 vimscript 和 emacs lisp 编写的(比如我个人就离不开 magit )。客观地说,这些语言都不怎么样。即便没有不那么小众的语言也是如此,比如 PHP 和 JavaScript 。尽管 JavaScript 在某些方面很出色(这是第一个支持 lambda 的主流语言!),但肯定不难想象它本来可建立一个更好的版本(例如,不存在两个不同的 null 值)。

这是一条通用规则:只要你的语言是图灵完备的,并且具有构建抽象的能力,人们就愿意使用。当然,有些语言的生产力比较高,而有些语言则比较低,但是总的来说,选用函数式编程还是面向对象编程,静态类型还是动态类型,似乎并没有太大关系。我们花一些时间总是能够克服这种语言的难点。

相反,克服语言运行时的难点基本是不可能的。如果要扩展 vim ,则必须使用 vimscript 。如果你希望代码在浏览器中运行,那么 JavaScript 仍然是最好的选择。需要将代码嵌入到某个地方?那么可能没办法使用 GC 。

这两个观察结果可以推出如下假设

如果编程语言带来创新的运行时,或具有运行时排他性,则通常它们都会变得很受欢迎。语言本身的质量是次要的。

下面,我们来看几个能够通过这种理论“解释”的例子。

C语言

C 语言的运行时非常优秀,值得一提的原因有两个。首先,它是第一个运行时足够快的高级语言。我们可以使用 C 编写 OS 内核,在这之前为了提高性能只能使用汇编。其次,C 是 Unix 的语言。(我会将 C 归类为“易于改进”的语言类别。以 Null 结尾的字符串是一个糟糕的设计。)

JavaScript

浏览器中只能使用 JavaScript ,长期以来一直如此。

Java

我认为对于我的理论来说,Java 是一个非常有意思的例子。关于 Java 流行的常见解释是“ Sun 给力的营销”,以及随后大学的课程中引入了 Java 。但对我来说,这似乎没有说服力。我们来看一下90年代流行的编程语言(我不确定此处的百分比和相对排名,但是对我来说,大致是正确的):

在这个列表中, Java 是唯一的非动态跨平台内存安全语言。也就是说,Java既是内存安全的(没有易于出错的手动内存管理),又可以合理有效地实现(字段访问是一条加载指令,而不是通过字典查找进行)。不论语言本身如何,似乎这都是吸引人们选择 Java 的充分理由。

Go

关于为了简单性而牺牲其他一切是好是坏,这一点仍然有争议,但是静态链接的零依赖二进制文件无疑是 Go 在开发运维领域流行的主要原因。从某种意义上讲,当你不再需要单独安装 JVM 时, Go 是“内存安全且相当快”的 Java 运行时的升级。 

我的假设自然无法解释所有情况。一种是脚本语言。一个支持 eval 且能够很容易地连接到 C 扩展的高度动态运行时确实与众不同,因此这种语言理应是一种流行的脚本语言。但是很奇怪为什么流行的是 Python 和 PHP ,而不是 Ruby 和 Perl 。

另一种是语言的发展:C++ 和 TypeScript 并没有在运行时方面进行创新,但它们仍然是主流的语言。

预测

最后,让我们使用该理论做出一些大胆的预测。

首先,我预测 Rust 将会成为主流语言。我来解释一下:首先,Rust 的运行时等效于 C 和 C++,因此我的理论应该会预测它不会成为主流。但是我要说的是,内存安全是运行时属性,尽管 Rust 是通过语言机制来实现的。

其次,我预测 Julia 会越来越受欢迎。它在运行时方面非常独特,它坚决地拒绝了 Ousterhout 的二分法,并坚持认使用JIT来编译高动态语言,在运行时提供快速的数值运算代码。

第三,如果 Dart 出现增长,我不会感到惊讶。一方面,它与 Go 和 Java 大致相同,并具有内存安全的运行时,固定的对象布局和普遍的动态分配。而且运行时的实现质量令人震惊:它具有一流的 JIT 、 AOT 和 JS 编译器。此外,它还具有一流的热重载支持。虽然没有什么是突破,但是这种组合令人印象深刻。

第四,我预测 Nim 、 Crystal 和 Zig (语言设计非常不错)不会流行

第五,我预测由于平台的排他性, Swift 将在苹果硬件上非常流行,但是尽管在语言设计上非常创新( Swift 中的泛型与 Go 相反),但在苹果之外不会有太大的增长。 

发表评论

电子邮件地址不会被公开。 必填项已用*标注