2012-08-09 75 views
3

最近,我觀看了一些關於C#異步錯誤的視頻,並與朋友進行了討論。編程語言錯誤或編譯器錯誤?

說一個編程語言有錯誤是正確的嗎? 或者你只能說編譯器有bug?

兩者有什麼區別?

+1

雖然這可能是一個有趣的討論,但我不認爲這真的是討論它的地方。這可能取決於錯誤究竟是什麼。但是我認爲'編程語言'本身並不是真的有一個bug,因爲它只是一個被編譯器重寫的語法。所以在我看來,編譯器在大多數情況下都會有bug。 – 2012-08-09 11:50:55

回答

7

語言有一個設計缺陷如果它不是出於某種原因精心設計(例如調用通過在Java中聲明類型的表達式靜態方法,IMO的能力)。

該語言有錯誤(IMO)如果規範是矛盾的或不表達作者意圖表達的內容。 (例如,我認爲C#語言規範在類型推斷方面存在一些缺陷)。

如果編譯器無法正確實現規範,則會出現錯誤。

編輯:我發現了一個規範的錯誤是不是類型推斷那些簡單的例子...

在C#4規範,第7.3.1條規定:「除賦值運算符,所有二元運算符都是左關聯的「。

第7.13條規定:「空合併運算符是右結合」

由於空合併運算符是不可轉讓的二進制運算符,這是一個矛盾,因而(IMO)的錯誤。 (這是在this Stack Overflow question還指出。)

空合併經營者還提供了一個example of a compiler bug我在回答這個問題,發現...

+1

您能指點我一些關於類型推斷中的錯誤的鏈接或C#語言規範中的其他錯誤嗎?謝謝 – Attilah 2012-08-09 11:52:19

+0

@Atitilah:我想問這個問題。 – 2012-08-09 11:52:40

+0

@Atitilah:類型推斷部分的細節讓我頭痛。我會看看是否可以疏通一些其他的規格bug。 – 2012-08-09 11:54:51

1

它可以是。語言和編譯器都可能有錯誤。語言錯誤是無論使用何種編譯器都會出現的錯誤,因爲編譯器錯誤只會出現在特定的編譯器中。

1

實際上,一個bug被認爲是規範和實際實現中的差異。

所以是的,從這個意義上說,兩者都可能有一個錯誤。

編程語言是語言的規範。可能的情況是,在語言規範中存在歧義或不規範,從這個意義上講,你可以說它有一個錯誤。

但是,C#和編譯器的規範可能存在差異。在這種情況下,錯誤在編譯器內部。