引导翻译?

时间:2012-03-24 16:51:12

标签: language-agnostic compiler-construction interpreter bootstrapping

我们知道编译器可以使用称为bootstrapping的技巧以自己的语言编写。我的问题是这个技巧是否也适用于口译员?​​

理论上答案肯定是肯定的,但有一点担心,当我们经历迭代时,源代码的解释将变得越来越低效。这会是一个严重的问题吗?

我正在引导一个非常动态的系统,程序会不断变化,所以它排除了编译器。

让我用这种方式说出来:

让我成为口译员。

让L's成为编程语言。

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

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

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

4 个答案:

答案 0 :(得分:4)

这没有意义。解释器不会生成二进制文件,因此无法创建可以独立运行的东西。在某个地方,最终,你需要一个二进制文件作为解释器。

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

  1. 在A
  2. 中编写基本C编译器
  3. 在C中编写C编译器并使用早期用A
  4. 编写的编译器进行编译
  5. 你现在有一个可以编译自己的C编译器,你不再需要A或原始编译器了。
  6. 后来的运行只是

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

      现在让我们说你有一种解释语言,我称之为Y.第一个版本可以称为Y1,下一个Y2可以称为Y1,依此类推。让我们尝试“引导”它。

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

      1. 在C中编写Y1解释器,编译它
      2. 在Y1中编写Y2解释器,在用C
      3. 编写的Y1解释器上运行它
      4. 在Y2中编写Y3解释器,在Y1解释器上运行的Y2解释器上运行...用C语言编写。
      5. 问题是你永远无法逃脱解释器堆栈,因为你从不编译更高级别的解释器。因此,您总是需要编译并运行用C编写的第一个版本解释器。您永远无法逃避它,我认为这是编译器引导过程的基本点。这就是为什么我说你的问题没有意义。

答案 1 :(得分:2)

答案取决于所解释的内容。如果你的目标是一个解释字节码的虚拟机,并且你的语言是在字节码不变的情况下迭代开发的,那么你就不会失去性能。在目标VM上有大量语言示例,这些语言并非专门针对该语言而设计,并且它们不会直接影响性能(例如,JVM上的Scala)。

以JVM为例,您将用Java编写第一个编译器,它将您的源语言编译为JVM字节码。然后你会用你的新源语言重写你的编译器来做同样的事情。得到的字节码在两者之间无法区分。请注意,这与在解释语言中编写解释器不同,每次迭代都会变慢。

答案 2 :(得分:0)

这句话似乎没有意义:

  

我正在引导一个非常动态的系统,程序会不断变化,所以它排除了编译器。

无论你是否有翻译或编译器:两者都必须处理更改的内容,即使用您的语言。即使语言以某种方式“动态”,也会有一种固定的元语言。很可能你也有一些低级代码,或者至少是解释器正在使用的数据结构。

你可以先设计并形式化这个低级代码(无论它是什么)并编写一些可以“运行”它的程序。一旦你有了这个,你可以添加一堆解释器,只要它们都产生这个低级别的代码,效率应该不是问题。

答案 3 :(得分:-1)

你的确可以,这就是吱吱声使用的方法(我相信很多其他的小伙伴)。这是一种方法:https://github.com/yoshikiohshima/SqueakBootstrapper/blob/master/README