可能的重复:
一种语言的编译器如何用该语言编写?
在“自身”中实现编译器

我在看 鲁比纽斯, ,一个 Ruby 实现,使用 Ruby 编写的编译器编译为字节码。我无法理解这个问题。如何用该语言本身编写该语言的编译器?看起来它只是文本,没有任何东西可以将其编译成可执行文件,然后可以编译将来用 Ruby 编写的代码。只是输入这句话我就感到困惑。谁能帮忙解释一下吗?

有帮助吗?

解决方案

要简化:首先写一编译器,编译器,在不同的语言。然后,编译,编译器,瞧!

所以,你需要某种已经有一个编译器语言的 - 但因为有很多这样的,你可以写了Ruby编译器编译例如(!)在C,然后将编译红宝石编译器,其然后可以编译Ruby程序,即使本身的进一步的版本。

当然,原始的编译器被写在机器代码,用于组装编译的编译器,其进而编译的编译器为例如C或Fortran语言,它编译的编译器......几乎一切。 迭代开发在行动。

这个过程被称为引导 - 可能命名男爵明希豪森的故事中,他拉着自己摆脱沼泽由他自己的自举:)

其他提示

关于一个编译器的自举它是关于这过分地聪明的黑客值得读数。

http://catb.org/jargon/html/B/back- door.html

我会感到困惑只是读这句话。

有可能有助于认为编译器作为一个翻译,其中编译器通常被称为的。其目的是把源代码,人类可以阅读和翻译成二进制代码,计算机可以读取。在Rubinius的情况下,它读取的代码恰好是Ruby代码,而且它把它转换成代码是机器代码(实际上LLVM机代码本身进一步编译成英特尔的机器代码,但是这只是一个背景细节) 。 Rubinius的本身可能已经写在几乎任何编程语言。它只是碰巧都在其编译相同的语言被写入。

当然,你需要的东西摆在首位运行Rubinius的,这最有可能是常规的Ruby解释器。但是请注意,一旦你能够在一个解释器中运行Rubinius中,你可以通过它自己的源代码,它会创建并运行自身的编译版本。这就是所谓的引导,从那句老话,“自己拉了由白手起家。”

最后一点:Ruby程序不能调用任意机器代码。 Rubinius的的那部分实际上是用C ++编写。

可以按照以下顺序进行:

  1. 用任何语言编写一个编译器,比如用 C 语言编写 Ruby 代码。
  2. 现在您可以编译 Ruby 代码,您可以编写一个编译 Ruby 代码的编译器,并使用您在步骤 1 中编写的 C 编译器来编译此编译器。 哇这句话好奇怪啊!
  3. 从现在开始,您可以使用 2 中编写的编译器来编译所有 ruby​​ 代码。:)

玩得开心!:)

一个编译器是只是一些变换源代码转换成一个可执行文件。所以doen't不管它是写在 - 它可以被编译相同的语言或足够的电力的任何其他语言

当你正在编写针对平台的语言,写在同一种语言,这还没有为你实现语言的编译器编译器的乐趣来。在这里您的选择是编译在其他平台上为你确实有一个编译器,或写在另一种语言编译器,并用它来编译“真实”的编译器。

这是一个两步过程:

  1. 假设 Ruby 编译器还不存在,用 C 等其他语言编写 Ruby 编译器
  2. 既然你现在有了一个 Ruby 编译器,你可以编写一个 Ruby 程序,它是一个(新的)Ruby 编译器

由于有人已经编写了 Ruby 编译器(Matz),因此您“只需”执行第二部分。说起来容易做起来难。

答案的所有迄今为止已经解释了如何通过使用不同的编译器来引导编译器。然而,有一个替代方法:编译手动编译器。没有理由为什么编译器已经由机器来执行,也可以一样好由人来执行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top