为什么一个自启动的编译器在没有源语言的情况下工作



我读过关于引导编译器的文章,Java、Go、Typescript等如何编译自己——但有一点似乎不太对劲:让我们假设我们使用Node.js为一种新的编程语言编写编译器。

根据维基百科的说法,现在是第二阶段。我们创建了一个用X语言编写的全新编译器,并使用用Node.js编写的旧编译器来处理这个新编译器。这些都是有道理的,但我很难理解接下来会发生什么。

在X语言的第一个编译器编写完成后,旧的编译器可以被丢弃(引用(,但这怎么可能呢?编译器难道不需要生成供Node理解的Javascript文件,以及供Javascript文件工作的Node环境吗?为了简化,我认为这个过程必须是这样的,这需要源语言。

Code in language X -> Compiler written in X -> X code to Node.js code -> Executed in Node.js

基本上,我要问的是,一种语言如何在没有源语言的情况下自行编译。最终,用这种语言编写的编译器难道不需要源语言吗?

A"编译器";只是一个将(另一个(程序从一种语言翻译成另一种语言的程序——从源语言翻译成目标语言。

要真正运行编译后的程序,您(只(需要一个目标语言1的解释器。你可以"链";编译器通过多个步骤进行翻译,并有多层解释器在彼此之上运行(用语言B编写的语言A的解释器,在用C编写的语言B的解释器上运行,等等(,但最终它必须以";"机器语言";这只是由计算机中的硅CPU解释的语言。所以"在底部";只有一个解释器直接在晶体管和导线中运行。

编译器的要点是:

  • 一旦运行,就不再需要程序的源代码,只需要目标语言的编译代码。如果你通过第二个编译器(到第三种语言(运行它,你只需要最终输出,而不是中间输出,等等
  • (希望(目标语言比源语言的解释器运行得更快

实际上,您可以将从X到Y的编译器与Y的解释器结合起来,得到看起来很像X的解释器的东西。组合后的包首先使用编译器将程序翻译成Y,然后立即解释该翻译(然后将其丢弃,所以您永远看不到真正的翻译,只看到结果(。这有时被称为JIT编译器,Node.js就是一个例子。

循环回到您最初的问题——您有一个X的编译器,但目标语言是什么?如果目标语言是JavaScript,则需要一个JavaScript解释器来运行编译后的程序。当您引导时,您将使用js版本的编译器来编译X版本的编译器,但一旦您完成了这一操作,您现在就有了新的js版本编译器(编译器的输出(,不再需要原始的js版编译器。


1 因此,编译器可能会引入对一些用目标语言编写的库的依赖关系,这些库与目标语言解释器一起使用。

相关内容

  • 没有找到相关文章

最新更新