C 用编译语言编写的编译器如何处理bug?

C 用编译语言编写的编译器如何处理bug?,c,debugging,compiler-errors,compiler-construction,C,Debugging,Compiler Errors,Compiler Construction,假设我有一个C编译器,它是用C语言编写的。然后,C编译器将使用该编译器的早期版本进行编译,或者通过先用旧版本编译源代码,然后再用新的编译器来编译 如果C编译器的实现中有bug呢?这意味着C编译器生成的二进制文件可能不正确。如果我要修复这个bug,那么代码仍然必须使用有bug的编译器版本进行编译,再次导致编译器可能无法正常运行 如果这个bug马上就被发现了,我可以看看如何通过使用一个旧版本的编译器来处理这个问题。但是如果这个bug在多次迭代中都没有被发现呢?在我看来,在那一点上几乎不可能追踪到错误

假设我有一个C编译器,它是用C语言编写的。然后,C编译器将使用该编译器的早期版本进行编译,或者通过先用旧版本编译源代码,然后再用新的编译器来编译

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


如果这个bug马上就被发现了,我可以看看如何通过使用一个旧版本的编译器来处理这个问题。但是如果这个bug在多次迭代中都没有被发现呢?在我看来,在那一点上几乎不可能追踪到错误的来源,因为错误行为可能是该编译器的任何先前版本在各种迭代中传播的结果。

有几种可能性:

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

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

猴子修补编译器以修复错误,然后重新编译。或者,如果编译时没有出现过多次错误,则可以在调试器中手动执行此操作


顺便说一句,你的担心和肯·汤普森在图灵奖演讲中描述的一个更阴险的理论问题没有什么不同。他描述了这样一种情况:编译器有意编写代码,在编译操作系统时检测并插入安全漏洞;它还检测何时重新编译编译器,并插入检测代码。

有几种可能:

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

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

猴子修补编译器以修复错误,然后重新编译。或者,如果编译时没有出现过多次错误,则可以在调试器中手动执行此操作


顺便说一句,你的担心和肯·汤普森在图灵奖演讲中描述的一个更阴险的理论问题没有什么不同。他描述了这样一种情况:编译器有意编写代码,在编译操作系统时检测并插入安全漏洞;它还检测何时重新编译编译器,并插入检测代码。

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


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

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


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

使用没有错误的其他编译器进行编译。@Barmar,如果没有错误,则如何处理;p@Barmar如果这个bug没有立即被检测到,但只是像我在上一段中所说的几个版本之后呢?更高版本的源代码中甚至可能不再有bug,但因为
是由编译器的某个版本生成的,该版本可能会使它们行为不正确。错误可能会在各个版本中传播。当我在IronScheme中遇到此问题时,我通常会编写一个具有工作功能的新部分,并确保调用该部分,而不是错误代码。有时,如果代码解决方案不起作用,我不得不在调试器中乱来,跳过错误代码。我知道你的痛苦:错误的本质是如此稀少,通常你必须独立地考虑每个bug的情况。你的问题是假设性的,应该关闭为超出范围。请使用没有错误的其他编译器进行编译。@Barmar,如果没有错误呢;p@Barmar如果这个bug没有立即被检测到,但只是像我在上一段中所说的几个版本之后呢?更高版本的源代码中甚至可能没有bug,但由于它们是由编译器的某个版本生成的,可能会导致它们行为不正确,因此bug可能会在不同版本中传播。当我遇到IronScheme的这个问题时,我通常会编写一个具有工作功能的新部分,并确保调用该部分而不是错误代码。有时,如果代码解决方案不起作用,我不得不在调试器中乱来,跳过错误代码。我知道你的痛苦:错误的本质是如此稀少,通常你必须独立地考虑每个bug的情况。你的问题是假设性的,应该以超出范围来结束。想象一下,一长串编译器在同一场景中生成不正确的代码,因为它们的前任在该场景中生成了不正确的代码。你所做的事情会永远影响你。你会不断重复关于一系列编译器的事情。错误的性质不会在每次重新编译时都改变。如果您知道错误导致了什么问题,您可以找到解决问题的方法,然后重新编译。现在bug消失了。想象一下,在同一个场景中,一长串编译器生成了不正确的代码,因为它们的前任在该场景中生成了不正确的代码。你所做的事情会永远影响你。你会不断重复关于一系列编译器的事情。错误的性质不会在每次重新编译时都改变。如果您知道错误导致了什么问题,您可以找到解决问题的方法,然后重新编译。现在虫子不见了。