编译器和解释器可以存在错误,我们(作为用户)可以采取什么措施来解决它们?[关闭]


28

如果编译器的工作实质上是将源代码转换为机器级代码,那么编译器中是否会出现故障,即错误的“翻译”?

解释器也是如此:有时会无法输出所需的内容吗?

我还没有听说过编译器/解释器中的任何错误,但是它们存在吗?


6
在开发中,它们肯定会存在,只要看看任何开源编译器上的bugtracker即可
棘手的问题

7
我还没有听说过编译器/解释器中的任何错误,但是它们存在吗? 我在gcc编译器中找到了有关错误的邮件列表:gcc.gnu.org/ml/gcc-bugs
FrustratedWithFormsDesigner

47
这不是一个很好的问题,它只是问一些常识。

12
到目前为止,没有任何评论或答案解决遇到编译器错误的可能性。确保先排除自己代码中的错误。
Dan Pichelman

6
简短的回答:肯定。尽管IDE和编译器通常在他们接触外界之前就花费了不到一英寸的时间,但总有一个极端的情况,那就是开发者过于聪明。
KeithS

Answers:


51

您倾向于在正在积极开发的语言中找到它们,不是在相对成熟的语言中找到它们(因此不会经常看到很多变化)。这可能就是为什么大多数语言都在稳定的各个“阶段”发布的原因。夜间构建比发布候选者要稳定的可能性要小得多,发布候选者本身要比完全发布和积极使用的版本要稳定的可能性小。

幸运的是,这些语言中的大多数(尤其是开放源语言)都将具有可向其提交报告的公共错误跟踪系统

以我自己的经验,我在Windows的Scala中遇到了一个相当模糊但严重的错误。我将调查结果提交给Bug跟踪器,此问题很快得到解决。在那种情况下,语言开发人员足够聪明,可以在错误日志输出中包含一个有用的注释,表明我实际上遇到的是编译器错误,并指出了在何处提交报告。


希望你不介意;我添加了一个新段落(待批准),我认为这可能是相关的。编译器不仅可能包含错误,而且可能包含恶意代码。
安迪

@Andy似乎是一位主持人拒绝了它,因为它应该是评论或单独的答案。
KChaloux

不仅是“是”,还包括“是的!” :-)
Hellion

C既成熟又积极发展。C ++也是如此。Java也是如此。等
djechlin

100

用外行的话来说:

所有程序都可能存在错误。

编译器是程序。

因此,编译器可能会出现错误。


55
更令人担忧的是:调试器是程序。因此,调试器存在错误。
Daniel Gratzer 2013年

19
@jozefg:那么如何调试调试器?谁看守看守者?
FrustratedWithFormsDesigner 2013年

16
@FrustratedWithFormsDesigner看守者,du。
吉米霍法2013年

9
@JoelFan自从我写了“可以拥有”之后,这个异常就被覆盖了。如果您说“拥有”,则必须指定仅指非平凡的程序。通过说“可以”,您不必。
图兰斯·科尔多瓦

8
如果“ Hello world”程序与错误的编译器兼容,则可能会有错误。
wtsang02



4

当然,因为编译器是软件。

在2005年,我为一家大公司编写的一个非常关键的软件出现了一段代码故障。由于花费了公司数百万美元进行纠正,因此他们当然发起了大规模调查。

幸运的是(从我的角度来看),这个问题原来是Delphi中的一个编译器问题。在try finally块中,函数的返回值被破坏,并导致绝对随机的结果返回给调用者。这已被记录,并得到Borland的认可。

众所周知,.NET实际上有数百种不同的内存泄漏,特别是在其早期实现中。

我认为,没有没有错误的软件之类的东西。编译器也不例外。但是,与大多数商业软件相比,它们经过了更全面的测试,并且被聪明,关键,有争议的人们所使用,因此,从总体上看,他们的业绩记录非常好。


有“正式验证”的软件。在数学上证明它可以工作。有时甚至经过正式验证的代码也有错误。IIRC Java的quicksort实现已得到正式验证,但这并未解决溢出问题。
David Plumpton

1
什么软件?来吧:)
罗克兰

2

不仅是错误,还包括故意的恶意软件。

其中最著名的是Brian Kernighan对原始Unix C编译器实施的“登录”木马。http://cm.bell-labs.com/who/ken/trust.html文章对此有一些了解。


1
很明显这实际上已经实现了吗?
基思·汤普森

这是一个非常有趣的话题,但与这个问题根本无关。

@delnan我不同意;问题的核心似乎是“我可以信任我的编译器多少?”
安迪

1

是的,当然像任何软件编译器都存在错误一样,例如,此处的gcc错误列表


0

是。

此外,不仅与编译器一起使用,还与Interpretors / debuggers和任何第三方软件工具一起使用。

我们目前正在使用某些第三方软件,并且遇到了一些问题。有时他们感谢我们发现并报告错误。:)

其中一些也有一些内存泄漏,从而导致崩溃。这里的重要问题是,如何确定第三方工具或编译器是否存在使您的应用程序正常运行的错误?


然后,您的重要问题将导致停止问题
wtsang02 2013年

0

编译器是一种程序,它读取用一种语言(源语言)编写的程序,并将其翻译为另一种语言(目标语言)(主要是机器语言)的另一个等效程序。

在编译器的不同阶段中,逐行扫描源语言代码。有一个符号表,可跟踪在源语言代码中扫描过的所有关键字。

阶段1:词法分析器-读取源程序中的所有字符并形成令牌的逻辑分隔(int,char,float,if-else,for,while等)

阶段2:语法分析器-分析令牌流的结构。表达式的层次分析,包括后缀/前缀等(a = b + c * d)

阶段3:语义分析器-令牌的类型检查(整数到实数,浮点数等)以及许多类似操作符优先级的检查。

阶段4:中间代码生成器-a = b + c * de(temp1 = c * d,temp2 = temp1 + b,temp3 = temp2-e)

阶段5:代码优化-消除的各种分析(控制流,数据流,转换)
:冗余代码,常量传播,部分无效代码,公共子表达式,循环不变代码

阶段6:代码生成-生成目标代码(多数为汇编语言),将值放入寄存器

所有这些阶段只不过是编写良好的程序,而其中可能存在N个缺陷。


-1

当然,编译器只是程序,其作者也是白痴:)。甚至语言规范也可能有错误。示例:c#+ foreach + lambda

或在Python中,解释器中的错误:编译ast会使解释器崩溃

好吧,如果您想查看编译器/ interpeter中的错误,请查看php。有一个著名的整数溢出错误。第一个修复程序从开始if (size > INT_MAX) return NULL;故事的延续


编译器作家不是白痴。由于编译器非常复杂,进入该领域的障碍也相当高。因此,我们可以期望编写它们的人不会像普通人那样犯错误。
jszpilewski

foreach / lambda不是错误,它取决于在添加lambda之前做出的具体而良心的设计决策。
安迪

据我所知,@安迪还没有人知道这个决定会导致什么问题。为什么不臭虫?
维克多·洛瓦

@jszpilewski在该文字之后看到微笑了吗?
维克多·洛瓦

1
我建议您重新阅读OP,因为他的问题不是有关规范是否可能存在错误,而是有关编译器是否可能存在错误。由于C#编译器符合规范,因此编译器没有错误。我还建议您重新阅读自己的Wikipedia语录“软件错误是计算机程序中的错误,缺陷,故障或错误”
Andy
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.