你的语言很烂,这无关紧要

2020-09-15 02:35:11

这篇文章描述了我自己钟爱的编程语言流行理论。我的理解是,没有人知道为什么一些语言流行,另一些语言不流行,所以如果我把自己的想法加到整个混乱中也没有什么坏处。显然,这都是胡乱猜测,没有任何数据支持的研究,只是平淡无奇的故事。

中心论题是,实际的编程语言(语法、语义、范例)实际上并不重要,重要的是运行时 - 的特征粗略地说,运行过程的记忆是什么样子的?

首先,我们来观察一下。很多软件都是用vimscript和emacs lisp编写的(Magit是一个我离不开的例子)。这些语言客观上很糟糕。即使使用不那么深奥的技术也会出现这种情况,著名的例子是PHP和JavaScript。虽然JavaScript在某些方面很棒(它是第一种带有lambdas的主流语言!),但不难想象它会有一个稍微好一点的版本(例如,没有两个不同的null值)。

这是一条一般规则 - 一旦你有了一种图灵完全的语言,并且有一些构建抽象的能力,人们就会用它来完成事情。当然,一些语言的生产力更高,一些语言的生产力更低,但总的来说,FP、OOP、静态类型和动态类型似乎并不是超级相关的。总是可以通过花更多的时间编写程序来克服这种语言。

相比之下,克服语言运行时是不可能的。如果你想扩展Vim,你就必须使用vimscrip。如果你想让你的代码在浏览器中运行,JavaScript仍然是最好的选择。需要在任何地方嵌入你的代码吗?GC可能不是您的选择。

语言通常在带来创新的运行时或具有运行时排他性时变得流行起来,语言本身的质量是次要的。

让我们看一些可以用这个理论“解释”的例子。

C有一个相当简朴的运行时,这是值得注意的两个原因。首先,它是第一个足够快的高级语言运行时。它可以用C编写操作系统内核,这在此之前通常是用汇编语言完成的。其次,C是Unix的语言。(是的,我会把C归入“容易改进的”语言类别。以NULL结尾的字符串只是一种糟糕的设计)。

我认为这个案例是理论中最有趣的。Java受欢迎的一个常见解释是“Sun营销”,以及随后将Java引入大学课程。这对我来说似乎并不令人信服。让我们来看看90年代的流行语言(我不确定百分比和相对排名,但在我看来,其构成大体上是正确的):

在这个列表中,Java是唯一一种非动态的跨平台内存安全语言。也就是说,Java既是内存安全的(没有手动容易出错的内存管理),又可以相当高效地实现(字段访问是一种负载,而不是字典查找)。这似乎是选择Java的一个非常有说服力的理由,而不管语言本身的实际外观是什么。

人们可能会争辩说,以牺牲其他一切为代价而专注于简单性是好是坏,但静态链接的零依赖二进制绝对是Go在devops领域流行的一个原因。从某种意义上说,Go是对“内存安全和相当快”的Java运行时的升级,当您不再需要单独安装JVM时。

当然,也有一些东西是我的假设无法解释的。一个是脚本语言。一个高度动态的运行时,具有eval和轻松链接C扩展的能力,确实是一个与众不同的地方,所以我们会期待一种流行的脚本语言。但是,我们不清楚为什么它们是Python和PHP,而不是Ruby和Perl。

另一个是语言演变:C++和TypeScript在运行时并没有创新,但它们仍然是主流语言。

首先,我自然希望RUST成为一种主要的语言:)这需要一些解释,首先, - ,RUST是运行时等价于C和C++,所以理论应该正好预测相反的情况。但是我要争辩说,内存安全是运行时属性,尽管它对于RUST来说是独一无二的,完全是通过语言机制实现的,但是我会争辩说,内存安全是一种运行时属性,尽管它是RUST独一无二的,完全通过语言机制实现。

其次,我预测Julia会变得更受欢迎,它在运行时是相当独特的,它完全拒绝了Ousterhout的二分法,并坚持认为,是的,我们只需要使用高度动态的语言来在运行时支持快速的数字代码。

第三,如果DART增长,我不会感到惊讶。一方面,它与Go和Java大致相同,具有内存安全的运行时,具有固定的对象布局和无处不在的动态调度。但运行时的实现质量令人震惊:它拥有一流的JIT、AOT和JS编译器。此外,它还具有一流的热重新加载支持。这里没有任何突破,但组合令人印象深刻。

第四,我预测Nim、Crystal和Zig(语言设计非常有趣)不会流行起来。

第五,我预测,由于平台独占性,SWIFT将在苹果硬件上相当受欢迎,但除了平台之外,SWIFT不会有太大增长,尽管它在语言设计方面非常创新(SWIFT中的泛型与围棋中的泛型相反)。