对各种语言的运行时系统的思考

JavaScript的功能是不是都是靠C或者C++这种编译语言提供的? - RednaxelaFX的回答 - 知乎
这篇回答讲了各种语言的运行时系统的分析。
可能搜索关键字偏差很大。
那我加个关键字,语言运行时分析与思考JavaScript的功能是不是都是靠C或者C++这种编译语言提供的? - RednaxelaFX的回答 - 知乎

如果不使用动态类加载、反射等功能,运行时需要维护的元数据就可以大幅减少,并且可以对程序做的静态分析的精度可以大幅提升。Java ME 的 CLDC 就是这样的子集,它的 JVM 就比 Java SE 的 JVM 简单得多。
如果上面这些高级功能都不用,是不是可以得到一个不需要带额外的运行时库的 Java 子集呢?
答案是肯定的。如果把 Java 语法当 C 语法来写,只用静态方法(因为不能 new)和原始类型(因为引用类型要用都得 new),不用任何复杂的标准库功能,那么这个 Java 的子集是可以完全彻底编译成可裸奔的目标程序,不需要跟运行时库链接。此时的这个子集其实就跟没了指针和自定义值类型的 C 几乎一样…
大家实现过 “MiniJava” 的编译器不?它所实现的基本上就是这样的不需要额外运行时支持库的 Java 子集。所以不要笑,这是实际存在的东西。
上面 Java 的列表里没有提到解释器或者 JIT 编译器。为啥?因为它们并不是非要不可的。
如果不使用动态类加载的功能,那么可以事先把一个 Java 程序需要用到的代码全部编译到目标代码,也就是完全的 AOT 编译。这样在运行时就不需要解释器或者 JIT 编译器了。AOT 编译、解释器、JIT 编译都是实现 Java 程序执行的方式,挑任意一种或多种都可以。
总有同学以写程序是否需要带运行时库来衡量一门语言是否能被 “彻底编译”。这种表示方式是很具误导性的。上面已经展示了 C 与 C++ 也需要带上运行时库的情况。关键还是看某个具体程序使用了多复杂的功能,越复杂的功能就越需要带上一个复杂的运行时库。
更具有指导意义的说法是: 一门语言,剥离了运行时库也能使用的功能,与这门语言的完整功能相比,是多大的子集。 这样就好说了:C 语言剥离了运行时库也几乎可以使用整个语言所有的语法功能,只是不能用标准库函数了;而 Java 的话就会被限制在一个很小的子集里,写不出一般结构的 Java 程序了。
另外一种有指导意义的问题:一门语言是否能只靠自己来实现自己,最终得到一个可以独立运行的程序。换句话说,这门语言是否可以 “自举”。对这个感兴趣的话请继续往下读。
注意:一门语言是否能自举,跟这门语言的实现是否需要带一个运行时库,两者是没有必然联系的。

posted @ 2020-07-05 14:25  lingr7  阅读(286)  评论(1编辑  收藏  举报