编程语言错误还是编译器错误? [关闭]
Posted
技术标签:
【中文标题】编程语言错误还是编译器错误? [关闭]【英文标题】:Programming Languages Bug or Compiler Bug? [closed] 【发布时间】:2012-08-06 15:18:15 【问题描述】:最近,我看了一些关于 C# 异步错误的视频,并与朋友们进行了讨论。
说编程语言有错误是否正确? 还是只能说编译器有bug?
两者有什么区别?
【问题讨论】:
虽然这可能是一个有趣的讨论,但我不认为这里真的是讨论它的地方。这可能取决于错误到底是什么。但我认为“编程语言”本身并没有真正的错误,因为它只是一种由编译器解释和重写的语法。所以在我看来,编译器在大多数情况下都会有这个错误。 【参考方案1】:该语言存在设计缺陷,如果由于某种原因(例如,通过 Java 中的声明类型的表达式调用静态方法的能力,IMO)设计得不好。
如果规范自相矛盾或没有表达作者想要表达的内容,则该语言存在 错误 (IMO)。 (例如,我相信 C# 语言规范中围绕类型推断存在一些错误。)
如果编译器未能正确实现规范,则会出现错误。
编辑:我发现了一个规范错误的示例,它比类型推断更简单...
在 C# 4 规范中,第 7.3.1 节规定:“除了赋值运算符,所有二元运算符都是左关联的”。
第 7.13 节指出:“空合并运算符是右关联的”
由于 null 合并运算符是非赋值二元运算符,因此这是一个矛盾,因此 (IMO) 是一个错误。 (this Stack Overflow question 中也提到了这一点。)
null 合并运算符还提供了一个 example of a compiler bug,这是我在回答该问题时发现的...
【讨论】:
你能指出一些关于类型推断中的错误或 C# 语言规范中的任何其他错误的链接吗?谢谢 @Attilah:我也想问同样的问题。 @NikhilAgrawal 我不一定明白这一点。更重要的是答案没有错。 @Attilah:我给 Eric Lippert 发了邮件,这对我来说更简单 :) @Attila:哪一个?我不知道微软如何在内部对事物进行分类,因为我不在那儿工作。【参考方案2】:两者都可以。语言和编译器都可能有错误。语言错误是无论使用何种编译器都会出现的错误,而编译器错误只会出现在特定的编译器中。
【讨论】:
【参考方案3】:实际上,错误被认为是规范和实际实现的差异。
所以是的,从这个意义上说,两者都可能有错误。
编程语言是语言的规范。有可能的是,语言规范存在歧义或不规则,从这个意义上说,您可以说它有错误。
但是,C# 的规范和编译器之间可能存在差异。在这种情况下,错误在编译器内部。
【讨论】:
以上是关于编程语言错误还是编译器错误? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章