2012-07-12 82 views
2

這兩個定義中的哪一個是正確的?靜態類型和動態類型的定義

  • 靜態類型 - 類型匹配在編譯時檢查(因此只能適用於彙編語言)
  • 動態類型 - 類型匹配是在運行時檢查,或者根本沒有。 (這一項可以應用於編譯或解釋語言)

  • 靜態類型 - 類型分配給變量,這樣我會說「x是int類型的」
  • 動態類型 - 類型分配給值(如果有的話),所以我會說「x是持有一個int」

根據這個定義,靜態或動態類型是不依賴編譯或解釋語言。

哪一個是正確的,或者兩者都不正確?

回答

1

第二個是我眼中更好的定義,假設你沒有尋找關於爲什麼或如何工作的解釋。再次

更好的方式是說,

  • 靜態類型賦予變量的顯式類型不能改變
  • 動態類型賦予變量的隱式類型,它可以改變
+2

我不確定「顯示」。通過類型推斷,程序員不會明確地給變量賦予一個類型。 – 2013-01-31 13:12:06

+0

我還沒有使用過類型推斷的語言,也不知道對不起。 – Cramer 2013-03-18 01:35:36

0

我喜歡後者定義。考慮使用面嚮對象語言(如Java或C++)從基類轉換爲派生類時進行的類型檢查,該語言適合第二個定義,而不是第一個定義。它是一種帶有(可選)動態類型檢查的編譯語言。

+0

這是如何動態檢查?而且這兩個定義都允許編譯語言動態輸入。 – baruch 2012-07-12 08:28:26

+0

@baruch從基類轉換爲派生類引發運行時類型檢查。也就是說,按照定義,動態類型。 – 2013-01-31 13:17:07

4

哪一個是正確的,或者哪一個都不正確?

第一對定義比較接近但不完全正確。

靜態類型 - 類型匹配在編譯時被檢查(並且因此只能應用於編譯語言)

這是棘手。我認爲如果一個語言被解釋,但在執行開始之前進行了類型檢查,那麼它仍然是靜態類型的。 OCaml REPL幾乎就是一個例子,除了它在技術上將源代碼編譯(並鍵入檢查)到自己的字節碼中,然後解釋字節碼。

動態輸入 - 在運行時檢查類型匹配,或根本不檢查類型匹配。

相反:

動態類型 - 類型檢查是在運行時完成。

無類型 - 類型檢查沒有完成。

靜態類型 - 類型分配給變量,這樣,我會說「x是int類型」。

動態類型 - 類型分配給值(如果有的話),所以我會說「×拿着一個int」

變量是不相關的。雖然在變量和函數定義中,您只能在許多靜態類型語言的源代碼中明確地看到類型,但所有子表達式都具有靜態類型。例如,"foo" + 3通常是一個靜態類型錯誤,因爲您不能將一個字符串添加到一個int,但沒有涉及變量。

2

一個有用的方法來看看這個詞靜態是這樣的:靜態屬性是那些適用於所有可能的程序執行所有可能的輸入。然後,你可以看看在任何給定的語言或類型系統,並考慮其靜態屬性可以在驗證,例如:

  • 的JavaScript:沒有段錯誤/內存錯誤

  • 的Java/C#/ F#:如果程序編譯和一個變量有一個類型T,那麼變量只保存這種類型的值 - 在所有執行中。但是,可悲的是,參考類型也承認null作爲一個值 - billion dollar mistake

  • ML沒有null,使得上述擔保更強

  • 哈斯克爾可以驗證有關副作用的語句,例如一個屬性,如「這個程序不能在標準輸出上打印出任何東西」

  • 勒柯克也驗證終端 - 「結束本程序的所有輸入」

多少錢你要驗證,這取決於口味和手頭的問題。所有的魔法(驗證)都是以價格爲準。

如果你以前從未見過ML,那就試一試。至少給予亞倫明斯基的talk 5分鐘的關注。它可以改變你作爲程序員的生活。