编程语言错误或编译器错误?

时间:2012-08-09 11:47:21

标签: c# compiler-construction

最近,我观看了一些关于C#异步错误的视频,并与朋友们进行了讨论。

说编程语言有错误是否正确? 或者你只能说编译器有错误吗?

两者有什么区别?

3 个答案:

答案 0 :(得分:7)

如果语言因任何原因设计得不好(例如,通过Java,IMO中声明类型的表达式调用静态方法的能力),该语言有设计缺陷

如果规范是矛盾的或者不表达作者想要表达的内容,则该语言有 bug (IMO)。 (例如,我认为C#语言规范中存在一些关于类型推断的错误。)

如果编译器无法正确实现规范,则会出现错误。

编辑:我发现了一个spec bug的例子,它比类型推断更简单...

在C#4规范中,第7.3.1节规定:“除了赋值运算符,所有二元运算符都是左关联的。”

第7.13节规定:“空合并运算符是右关联的”

由于空合并运算符是非赋值二元运算符,这是一个矛盾,因此(IMO)是一个错误。 (在this Stack Overflow question中也有人注意到。)

空合并运算符还提供example of a compiler bug,我在回答这个问题时发现了...... {/ p>

答案 1 :(得分:1)

它可能是。语言和编译器都可能有错误。语言错误是无论使用何种编译器都会出现的错误,因为编译器错误只会出现在特定的编译器中。

答案 2 :(得分:1)

实际上,错误被视为规范和实际实施的差异。

所以是的,从这个意义上讲,两者都有一个错误。

编程语言是语言的规范。可能的是,语言的规范存在歧义或不规则,从这个意义上说,你可以说它有一个bug。

但是,C#的规范和编译器之间可能存在差异。在这种情况下,bug就在编译器内部。