最近,我观看了一些关于C#异步错误的视频,并与朋友们进行了讨论。
说编程语言有错误是否正确? 或者你只能说编译器有错误吗?
两者有什么区别?
答案 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就在编译器内部。