点选一级来筛选,拖动选一个范围
说明
我知道比较编程语言可能非常有争议,但我想先说清楚:这张图有意带着偏见,呈现的是我自己的世界观。
-
纵轴代表我的经验,从略知一二(🤦♂️)、课堂水平(🙇♂️)、工业级(👨💻),一直到语言律师(👨🎓)。这一条应该不太有争议。嗯,除了那些审过我的代码、觉得我的代码比我以为的还烂的教授和同事。
-
横轴是一门语言对我来说有多有趣,从无聊(🥱)、挺酷(😎)、着迷 / 喜欢(🤓),到上头 / 沉迷(🤯)。这非常主观,但我的主观确实和一些客观因素相关,比如理论上的有趣程度(例如
Coq/Agda > OCaml/Haskell)和标准的演进(例如C++0x > C++、Typed JS > ES6 > JS)。所以如果有人把这张图误读成“凭什么 OCaml 比你在图里最喜欢的语言更高级?”,可能就会觉得有争议。其实原因可能很简单:“这跟我的工作有关(或无关)!”,或者“我现在没时间深入研究!”。所以别太当真,我会尽量(在注解里)解释。 -
颜色试图表达抽象层级。这是最客观、最可衡量的一项,但我承认我的排序绝对不准确,甚至可能很误导人,比如:
- C++/Rust 可以和 C 一样底层,同时又和很多语言一样高层!
- Java 和 Scala 编译出来的是完全同一套 JVM 指令!
更精确的定义应该用一个区间,但那样我就不知道该怎么在图里画了。所以我只好用一个值。不过这也有它的道理,并非完全不讲理:
-
在它们的刻板印象之间取个平衡,并突出造成最大差异的因素,例如:
- 零开销抽象让 C++/Rust 更适合系统编程。
- 托管程度越高(例如有 GC),抽象层级就给得越高。
-
它们的类型系统,这一点就很微妙了:
- 从理论上我们知道,由于不完备性,可表达的程序集合总会被收窄,所以类型牺牲了一部分动态语义,可能会削弱抽象能力。
- 然而类型系统丰富了静态语义,带来了另一个层次的抽象,例如(高阶)类型算子抽象类型,正如(高阶)函数抽象项,从而增加了抽象能力。
我不知道是否存在一个定义良好的全序。我最后采用的偏序是:让无类型的语言居中,类型系统越传统的越往下,类型系统越先进的(例如渐进类型、归纳类型、高阶多态、高阶类型、依赖类型)越往上。
换个说法:颜色度量的,是一门语言的设计在为谁服务。类型可以为机器服务,比如 int、class,这些是为了让编译器更好地映射到硬件;也可以为数学服务:代数数据类型、参数多态、依赖类型,一直到类型本身就是计算的证明助手。所以主流静态类型语言在 4,略低于居中的无类型语言;越往上越接近 λ 演算(对 Prolog 来说是逻辑)。而且算数的是设计者的本意:一门语言后来长出来的、甚至是意外发现的能力(C++ 的模板元编程是被发现的,不是被设计的),不太会把它往上推。类型可以承诺得多或少,承诺可以由证明兑现、由运行时检查兑现,或者无人兑现;从 7 往上,靠的是证明。
当一个数值不足以概括一门语言时,它也带着一个区间:把鼠标移到点上,或展开它的注解,就能看到它能覆盖多远。2026 年加上的自然语言,则覆盖了整条刻度。