维基百科将Java、Python列入自举编译语言?为何javac、CPython基于C实现?
为什么Java和Python会被列入编译器自举语言列表?
这个问题问得很到位,很多人都会把「语言是否支持自举」和「某款主流实现的编写语言」搞混,咱们拆开来说清楚:
先搞懂核心:自举的对象是「语言」,不是「某款特定实现」
编译器自举的本质是:用语言X本身编写一个能处理X的编译器/解释器,并且这个工具可以编译/解释它自己的源码,形成完整的自举循环。判断一种语言是否能自举,看的是「是否存在这样的自举实现」,而不是看当前最流行的那款实现是不是用别的语言写的。
关于Java:主流编译器早已完成自举
- 早期的
javac确实是用C语言实现的,但早在JDK 1.2版本之后,Sun(后来的Oracle)就把javac完全重写成了Java代码。现在OpenJDK里的javac就是纯Java实现的——你可以用现有的javac编译javac的源码,直接得到一个全新的javac编译器,这就是标准的自举流程。 - 除此之外,还有Eclipse的ECJ编译器(Eclipse Compiler for Java),也是纯Java实现的,同样可以完成自举。所以Java作为语言,完全具备自举能力,自然会被列入列表。
关于Python:存在自举实现,语言本身支持自举
- 虽然CPython(最流行的Python实现)是用C写的,但Python有不少用自身(或其子集)实现的解释器/编译器:
- PyPy:它的核心翻译器是用RPython(Python的一个静态类型子集)编写的,而RPython代码可以用PyPy自己来编译,形成完整的自举循环。PyPy本身就是能运行Python代码的解释器,它的构建过程完全可以通过自举完成。
- 甚至你自己都能用Python写一个简单的Python解释器(比如递归下降解释器),只要这个解释器能正确处理它自己的源码,就满足了自举的核心逻辑。
- 维基百科的列表关注的是语言本身的能力,而非某一款实现的技术栈,所以Python也符合自举语言的标准。
内容的提问来源于stack exchange,提问作者saga
相关产品推荐
相关产品推荐

