【问题标题】:Does a compiler that compiles to machine code need to be written in assembly?编译成机器代码的编译器是否需要用汇编语言编写?
【发布时间】:2013-09-14 09:53:37
【问题描述】:

不包括将一种高级语言转换为另一种高级语言的编译器,是否任何编译为机器代码的编译器都需要用汇编语言编写?

【问题讨论】:

  • 不,您认为为什么需要这样做?
  • 制造汽车的机器人必须由汽车制成吗?不会。许多语言都可以写入带有位的文件。任何可以写入内存的语言或其中包含位的文件都可用于生成机器代码(这只是内存或文件中的一些位)。
  • 看一下 tiny cc 作为直接到机器代码编译的例子。

标签: compiler-construction programming-languages low-level machine-code


【解决方案1】:

编译器的源代码不需要用汇编语言编写。例如,CPython 编译器(从技术上讲是解释器)的(很大一部分)是用 C 语言编写的: http://en.wikipedia.org/wiki/Cpython

在一开始,在编译器出现之前,第一个编译器确实必须用汇编语言编写。但是后来有人使用这个编译器来编译他们自己的编译器。然后其他人使用这个编译器来编译他们自己的编译器。以此类推。

这就引出了“引导”的概念。引导编译器是用它打算编译的语言编写的。 clang 编译器可以编译 C++ 代码,但是编译器本身是用 C++ 编写的!这是如何运作的?好吧,第一个 clang 编译器是由不同的编译器编译的(可能是 g++)。在clang编译器足够成熟之后,它能够编译自己的代码。现在,对 clang 编译器所做的任何更改都可以由 clang 编译器重新编译到另一个 clang 编译器中!整洁吧?

【讨论】:

  • 我以前听说过这种事情,但我还没有上过编译器课程。我一直认为一些编译器可以自己编译是非常有趣的(现在,令人困惑)。我仍在寻找关于编译器构造的良好入门课程。感谢您的回答
  • 编译器是一种乐趣。如果您找不到要学习的编译器课程,我仍然建议您拿起一本书并与它们一起玩。我们认为理所当然地在后台快速而安静地发生了很多事情。
【解决方案2】:

编译器不是一个特殊的、神奇的程序。如果你眯着眼睛看,编译器只是一个将一个文本文件转换为另一个文本文件的程序(嗯,好吧,一个二进制文件)。

程序可以用什么语言实现只有一个限制。如果您用一种语言编写程序,该语言必须已经实现了编译器或解释器。因此,语言 X 的第一个编译器/解释器不能用 X 编写。(如果您希望能够使用它,至少。)但这对于编译器/解释器来说并不特殊;在有人实现 X 之前,你不能在 X 中有用地编写任何东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2010-12-24
    • 2018-11-11
    • 1970-01-01
    • 2010-10-25
    相关资源
    最近更新 更多