引导翻译?

Yan*_*Yin 3 language-agnostic compiler-construction bootstrapping interpreter

我们知道,可以使用称为引导程序的技巧以自己的语言编写编译器。我的问题是,这个技巧是否也可以应用于口译人员?

从理论上讲,答案肯定是肯定的,但是人们担心,随着迭代的进行,对源代码的解释将变得越来越低效。那会是一个严重的问题吗?

我正在引导一个非常动态的系统,在该系统中程序将不断变化,因此它排除了编译器。

让我这样写出来:

让我成为口译员。

假设L是编程语言。

  • 我们可以用机器代码(最低级别)编写i1来解释L1。
  • 然后,我们用L1编写i2,解释L2(一种新语言)。
  • 然后,我们用L2编写i3,解释另一种新语言L3。
  • 等等...

我们上面不需要任何编译器,只需解释器。对?

这可能是低效的。这是我的问题,如果确实效率低下,该如何克服。

blu*_*ift 5

那没有道理。解释器不会生成二进制文件,因此无法创建可以独立运行的文件。最终,您需要在某个地方有一个二进制文件作为解释程序。

编译器引导示例。假设我们有两种语言A(ssembler)和C。我们想引导用C编写的C编译器。但是,我们只有一个汇编器开始。

  1. 用A编写基本的C编译器
  2. 用C编写C编译器,并使用用A编写的早期编译器进行编译
  3. 现在,您有了一个可以自行编译的C编译器,不再需要A或原始编译器。

以后的跑步变得公正

  1. 使用C语言编写的编译器编译C程序

现在,假设您使用一种解释语言,我将其称为Y。第一个版本可以称为Y1,下一个版本可以称为Y2,依此类推。让我们尝试“引导”它。

首先,我们没有什么可以解释Y程序的东西,我们需要编写一个基本的解释器。假设我们有一个C编译器,并用C编写了一个Y1解释器。

  1. 用C编写Y1解释器,然后编译
  2. 在Y1中编写Y2解释器,然后在用C编写的Y1解释器上运行
  3. 在Y2中编写Y3解释器,在Y1解释器上运行的Y2解释器上运行...用C语言编写。

问题在于,您将永远无法逃脱解释器堆栈,因为您永远不会编译更高级别的解释器。因此,您始终需要编译并运行用C编写的第一个版本解释器。您永远无法逃脱它,我认为这是编译器引导过程的基本要点。这就是为什么我说你的问题没有道理的原因。

  • 确实有道理,尽管效率不高:解释器采用程序并执行程序(不生成二进制文件);现在,如果我们向自己提供较新版本的解释器怎么办?它将以新的方式开始解释。无需二进制。因此,它可以工作;问题是如何使其高效。 (4认同)
  • 即使解释器堆叠在一起,这也确实是有道理的-这只是递归的一种形式。步骤1也不需要编译器,它可以是解释器,没有代码输出。我的问题恰恰是如何使其高效,部分评估可能是答案(一个朋友刚刚告诉我)。 (2认同)