用他们编译的语言编写的编译器如何处理错误?

How do compilers written in the language they compile deal with bugs?

假设我有一个用 C 编写的 C 编译器。然后将使用该编译器的早期版本或自行编译该 C 编译器(首先使用旧版本编译源代码,然后再次使用新编译器假设).

如果该 C 编译器的实现中存在错误怎么办?这意味着 C 编译器生成的二进制文件可能不正确。如果我要修复该错误,代码仍然必须使用有错误版本的编译器进行编译,再次导致编译器可能无法正常运行。

如果错误被立即发现,我可以看到如何通过使用旧版本的编译器来处理这个问题。但是,如果多次迭代都没有检测到错误怎么办?在我看来,当时几乎不可能追查错误的来源,因为不正确的行为可能是该编译器的任何先前版本的结果,该编译器已通过各种迭代传播。

有几种可能:

  1. 如果编译器还有其他实现,您可以使用其中之一重新编译您的编译器。大多数语言都有多种实现,因此这通常是一个选项。

  2. 如果您知道是什么触发了错误行为,请在您的源代码中查找触发代码,然后重写它。如果这是次优代码,您只需暂时执行此操作:编译这个更改后的版本,然后使用(现在没有错误的)编译器编译原始版本。

  3. Monkey-patch 编译器以 "fix" 错误,然后重新编译。或者,如果在编译时错误情况没有出现太多次,则在调试器中手动执行此操作。

顺便说一句,您的担忧与 Ken Thompson 在他的图灵奖演讲 Reflections on Trusting Trust 中描述的一个更隐蔽的(理论上的)问题没有什么不同。他描述了一种情况,编译器有意代码检测它何时编译 OS 并插入安全漏洞;它还会检测何时重新编译编译器,并插入检测代码。

"Language"是一个抽象的概念;编译器是实现该语言的特定的、真实的 运行 程序。编译器很可能是用与它编译的语言相同的语言编写的,但它是由该语言的特定实现的特定版本编译的,因此处理错误是特定于该实现的。

它可能是用来自其他来源的语言实现编译的,或者来自它自己的早期版本,或者它自己的有限版本,例如。代码很可能包含其他编译器中错误的解决方法。但同样,此类错误存在于特定实现中,而不存在于抽象语言中,并且它们的处理方式与处理任何其他程序中的编译器错误的方式相同。