4

假设您正在为一种新语言创建一个编译器,比如 Big-Lang。如果您要为 Big-Lang 引导编译器,您将为 Big-Lang-lite 编写一个编译器,Big-Lang-lite 是 Big-Lang 的最小可能子集. 现在,我想知道 Big-Lang-lite 的编译器可以用 Big-Lang 编写,或者如果我们正在制作引导编译器,我们将不得不使用其他语言?

4

2 回答 2

8

这是引导带的常用方法。

  1. 设计语言 X
  2. 用不同的语言为 X 的内核编写一个编译器。
  3. 在X的内核中为X的内核编写一个编译器
  4. 使用 2. 中的编译器从 3. 编译您的编译器。(您大多是自举的)
  5. 在内核 X 中编写一个完整的 X 编译器
  6. 用 3 编译编译器。
  7. 你被引导了!

从技术上讲,您可以跳过内核语言而只实现完整的语言。我不建议这样做,因为它通常较慢(按数量级)

于 2013-10-14T18:05:23.920 回答
4

(非常有趣的问题,但可能是 stackoverflow 的边界线;https ://softwareengineering.stackexchange.com/ 可能是该问题的更好地方)

除了Jozefg 的回答之外,我还要补充一点,实际上这些步骤是一个循环:

  1. 你设计了一种“小”语言 X
  2. 你用不同的语言 Y为上述 X 语言的子集编写了一个糟糕的编译器(一个原始编译器,概念上只使用一次)PC;这个编译器PC应该是一个快速而肮脏的工作,因为您将在概念上使用它一次,并且您将成为PC的单一用户:您不介意良好的诊断(所以在第一个错误时中止是可以的);你不介意性能;并且你不太关心目标机器(你可以让 PC 瞄准一些糟糕的 C++ 生成的代码,或者你喜欢的任何东西)。顺便说一句,PC 可以是解释器。

  3. 您在 X 中编写了一个更好的编译器 BC 来编译 X(这里目标语言 T 很重要)。至此,您可能意识到您的 X 语言设计缺少一些功能;在这种情况下,转到第 1 步(通过增强 X 的设计)

  4. 您还可以在 BC 中添加更多功能,尤其是更好的诊断、更好的生成代码等。同样,您可能会转到第 3 步(改进 BC 的代码)甚至转到第 1 步(设计更好的 X)然后到第 3 步(改进代码BC,特别是让它处理 X 的新特性,然后使用 X 的新特性)
  5. 你通过用 BC 编译 BC 来测试你的工作
  6. 您可能想利用 X 的新功能重写 BC 中的一些代码。同样,迭代第 1 步和第 3 步。

此外,您可以通过首先制作该语言的解释器然后编写编译器来引导该语言(首先在该解释器上运行)。

您可能(或不)想要在各种版本的 PC 和 BC 上工作。尤其是当前版本的 BC 可能无法由 BC 编译(相同或紧接之前的版本);那么你必须暂时使用各种版本 - 甚至在 BC 中添加临时黑客。

一旦你有一个能够自行编译的 BC,你就可以抛出 PC。

重点是设计和实现语言是一个循环工作(通过实现你的语言,你可以更好地理解你想要的内部特性以及如何实现它们)。

当然,您需要保留 BC 的工作版本。这意味着,例如,您备份(甚至是版本控制)由 BC 编译的 BC 的“目标”代码的快照。在Ocaml中,它是字节码文件bootstrap/ocamlc(Ocaml 有一个可移植的字节码虚拟机这一事实有很大帮助);Scheme 48和可能的Chicken Scheme也采用了类似的方法;在MELT(我正在开发的一种类似 lisp 的领域特定语言以扩展和自定义 GCC 编译器)中,它是生成的 C++ 文件melt/generated/*.cc; Ocaml 和 MELT 都将“已编译的编译器”置于版本控制之下(并分发它......)。在 MELT 中,原始编译器 PC 是一个 Common-Lisp 程序(接受当前 MELT 语言的一小部分),而 BC 是引导式 MELT 编译器(melt/warmelt*.melt用于 MELT 源代码和melt/generated/warmelt*.cc生成的 C++ 代码的文件)。随意在其googlegroup list上询问有关 MELT bootstrap 的问题。Rust语言有一个稍微不同的方法:它的引导构建在 Web 上获取一些可执行文件(一些旧版本的编译器)。

引导语言更像是一门艺术,而不是一门科学。根据经验,小步走通常是值得的。您可能想阅读 J.Pitrat人造人:有意识机器的良心(J.Pitrat 最喜欢的主题是强人工智能是一个引导过程:您需要强人工智能来实现强人工智能,另请参阅本文)。您还可以阅读 Small Pieces 中的 C.Queinnec Lisp(如果您阅读法语,请阅读最新的法语版本)解释如何引导类似 Lisp 的实现。

附加参考

您绝对应该阅读J.Pitrat 的博客(因为 J.Pitrat 的一半职业生涯都是在引导人工智能)。

于 2013-10-14T18:18:01.667 回答