交叉编译器的T图


9

我正在研究Red Dragon Book Compilers的Bootstrapping,发现交叉编译器的T图非常令人困惑。我不明白“通过编译器2运行编译器1”的含义。谁能提供一些更好的解释,类比或与某些实际编译器相关的例子?

首先一些符号。由 我的意思是语言的编译器大号 书面语言小号产生输出语言/机器代码Ñ。这是一个墓碑T型图LSN= 在此处输入图片说明LSN

编译一个编译器

  1. 假设我们在实现语言S中为新语言L交叉编译,从而为机器N生成代码。

    LSN=
    LSN的T图

  2. 假设我们还有一个在M机上运行的现有S编译器,为M机实现代码:

    SMM=
    SMM的T型图

  3. 通过SMM运行LSN以生成LMN

编译器构造

LMN=LSN+SMM
LMN的T图= LSN + SMM


我添加了一些T型图,这实际上应该使它更容易理解正在发生的事情。希望有人可以更好地渲染它们。
戴夫·克拉克

Answers:


11

T形图(您在问题的原始版本中已省略)对于理解此类问题至关重要。让我们看一下最后的T形图。

在此处输入图片说明

第一个T描述了用S编写的从L到N的编译器。

第二个T描述了用M编写(或在M上运行)的从S到M的编译器。这将是您的编译器编译器

将第二个T应用于第一个T会编译第一个T,以便它在机器M上运行。因此,结果是在机器M上运行的编译器从L到N。

第二个T也在机器M上运行的事实是,您在要运行编译器的机器上运行了编译器,而不必使用交叉编译器(如果底部M不同,情况就是这样)。 )。


5

这意味着我们用SMM编译LSN,即通过SMM运行LSN的源代码。

当SMM编译某些源代码时,它会为机器M生成可执行文件,因此,当我们使用SMM编译LSN时,会得到LMN-可执行文件,它会在机器M上编译L个源文件,以便为机器N生成可执行文件。

用类推也许更容易理解这一点。假设我们有一个cc用Fortran编写的C编译器,它可以生成ARM代码。假设我们fc在x64计算机上也有一个Fortran编译器。如果使用编译cc源代码,fc则会得到一个在x64上运行的程序,会编译C程序,但会为ARM生成可执行文件。


0

简单起见...

注意:请记住,编译器只能在低级语言上运行。

在第一张图中,编译器是用HLL(高级语言)编写的,因此为了在计算机上运行,​​编译器的实现语言应在LLL中。

因此,在第二图中,编译器的实现语言在自驻留的编译器上运行,以便目标代码可以在其自己的计算机上运行。

最后,将两者结合起来,编译器将在具有langg--M的计算机上运行

输入语言--L

输出Langg--N

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.