【问题标题】:Compiler which compiles itself (Bootstrapping)自行编译的编译器(引导程序)
【发布时间】:2018-04-05 19:15:24
【问题描述】:

我阅读了有关引导的信息,但还没有完全理解。 我想解释一下我是如何看待它的,如果它不是真的,你会指出。 为了创建一个可以自行编译的编译器,它应该遵循以下步骤:

假设有 X 和 Y 编程语言。

  1. 将编译器 f 从 X 语言写入 Y。对于 Y 中的每个代码 A,编译器都会给出 f(A)。
  2. 从 Y 到 Y 编写一个编译器 g。因为编译器 g 是用 Y 语言编写的,所以编译器 f 可以编译它。因此,我们可以理解 f(c)=g 是一个从 Y 到 Y 的编译器。
  3. 您可以再次使用 g 编译 C,然后使用 g(C)=g - 编译器自行编译。

我觉得我的解释缺少重要的细节。
如果有人能像我尝试做的那样用数学符号解释,我会很高兴。

【问题讨论】:

  • 我对您对“from”和“to”的使用感到困惑。我觉得其中一个介词应该改为“in”。从 Y 到 Y 的编译器并没有真正的意义(除非 Y 是 JavaScript,我想)——那只是身份函数。从 Y 到 Z 的编译器(例如 Assembly)in Y 会更有意义。
  • 此链接指向构建自编译编译器的完整描述和个人经验(您的!)。没有什么比做一次更能真正理解它了。 stackoverflow.com/a/7375884/120163

标签: compiler-construction bootstrapping


【解决方案1】:

在大多数情况下,您的步骤似乎是正确的,只是您似乎一直在混淆源语言和目标语言。我不确定这些只是拼写错误还是你真的很困惑。所以这是我对引导程序的正式描述的尝试,这与你的很接近,但源语言、目标语言和实现语言之间的区别更清晰,细节也更详细:

假设 X 是源语言(即您新发明的语言),Y 是目标语言(例如汇编或机器语言),Z 是另一种语言,至少已经存在一个实现。让T : X -> Y 是一个翻译方案,将用语言 X 编写的有效程序翻译成用语言 Y 编写的等效程序。换句话说,对于任何用 X 编写的有效程序 x,T(x) 应该产生一个用 Y 编写的程序 y,它的行为等效于x 的定义行为。

现在我们要做的第一件事是在编程语言 Z 中实现这个函数 T。让我们将此实现称为 C_0。由于 Z 的实现已经存在,我们现在可以开始编译 X 程序。这是您的第 1 步,但您似乎在第二句话中切换了 X 和 Y。

在我们这样做之后,我们现在可以再次实现 T,但这次是用语言 X。所以我们编写了一个程序 C_1,它等价于 C_0,但用 X 而不是 Z。我们仍然从 X 编译到 Y,但我们是在 X 中进行的。我们现在可以使用 C_0 来应用 T(C_1),我们得到一个(另一个)工作 X 编译器。这与您的 step self 类似,但我们仍将 X 转换为 Y。将 X 转换为自身是没有意义的,因为那只是无所事事。将 Y 翻译成它本身就更没有意义了,因为 Y 甚至不是我们的源语言。​​

我们现在也可以通过使用C_1 而不是C_0 来应用T(C_1),但此时这仅用于测试目的(确保编译器工作)。理想情况下,C_1(C_1) 的结果应该是与C_0(C_1) 完全相同的 Y 代码。一旦我们开始向 X 添加功能,我们可能只能在 C_1 中实现它们,所以那时我们想停止使用 C_0,以便我们可以使用新功能。

【讨论】:

    【解决方案2】:

    想象一下,您想创建一种名为 XYZPDQ 的新语言。你知道 C,所以你用 C 编写 XYZPDQ 的编译器。它可以工作,所以现在你可以用 XYZPDQ 语言编写代码并编译它——使用你用 C 编写的编译器,可能称为 XYZPDQc。

    事实上,您非常喜欢它,以至于您再次编写了编译器——但这一次您是用 XYZPDQ 语言编写的。您使用您用 C 编写的编译器(XYQPDQc 程序)编译该 XYZPDQ 编译器代码(用 XYZPDQ 本身编写)。其结果是您可以运行一个新程序,可能称为 XYZPDQc2。

    现在您可以使用 XYZPDQc2 程序编译您在 XYZPDQ 本身中编写的 XYZPDQ 编译器,因此编译器(实际上)正在编译自己。

    此时:您已经启动了一种编译语言。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      相关资源
      最近更新 更多