這兩個定義中的哪一個是正確的?靜態類型和動態類型的定義
- 靜態類型 - 類型匹配在編譯時檢查(因此只能適用於彙編語言)
- 動態類型 - 類型匹配是在運行時檢查,或者根本沒有。 (這一項可以應用於編譯或解釋語言)
- 靜態類型 - 類型分配給變量,這樣我會說「x是int類型的」。
- 動態類型 - 類型分配給值(如果有的話),所以我會說「x是持有一個int」
根據這個定義,靜態或動態類型是不依賴編譯或解釋語言。
哪一個是正確的,或者兩者都不正確?
這兩個定義中的哪一個是正確的?靜態類型和動態類型的定義
根據這個定義,靜態或動態類型是不依賴編譯或解釋語言。
哪一個是正確的,或者兩者都不正確?
第二個是我眼中更好的定義,假設你沒有尋找關於爲什麼或如何工作的解釋。再次
更好的方式是說,
我喜歡後者定義。考慮使用面嚮對象語言(如Java或C++)從基類轉換爲派生類時進行的類型檢查,該語言適合第二個定義,而不是第一個定義。它是一種帶有(可選)動態類型檢查的編譯語言。
這是如何動態檢查?而且這兩個定義都允許編譯語言動態輸入。 – baruch 2012-07-12 08:28:26
@baruch從基類轉換爲派生類引發運行時類型檢查。也就是說,按照定義,動態類型。 – 2013-01-31 13:17:07
哪一個是正確的,或者哪一個都不正確?
第一對定義比較接近但不完全正確。
靜態類型 - 類型匹配在編譯時被檢查(並且因此只能應用於編譯語言)
這是棘手。我認爲如果一個語言被解釋,但在執行開始之前進行了類型檢查,那麼它仍然是靜態類型的。 OCaml REPL幾乎就是一個例子,除了它在技術上將源代碼編譯(並鍵入檢查)到自己的字節碼中,然後解釋字節碼。
動態輸入 - 在運行時檢查類型匹配,或根本不檢查類型匹配。
相反:
動態類型 - 類型檢查是在運行時完成。
無類型 - 類型檢查沒有完成。
靜態類型 - 類型分配給變量,這樣,我會說「x是int類型」。
動態類型 - 類型分配給值(如果有的話),所以我會說「×拿着一個int」
變量是不相關的。雖然在變量和函數定義中,您只能在許多靜態類型語言的源代碼中明確地看到類型,但所有子表達式都具有靜態類型。例如,"foo" + 3
通常是一個靜態類型錯誤,因爲您不能將一個字符串添加到一個int,但沒有涉及變量。
一個有用的方法來看看這個詞靜態是這樣的:靜態屬性是那些適用於所有可能的程序執行所有可能的輸入。然後,你可以看看在任何給定的語言或類型系統,並考慮其靜態屬性可以在驗證,例如:
的JavaScript:沒有段錯誤/內存錯誤
的Java/C#/ F#:如果程序編譯和一個變量有一個類型T,那麼變量只保存這種類型的值 - 在所有執行中。但是,可悲的是,參考類型也承認null
作爲一個值 - billion dollar mistake。
ML沒有null
,使得上述擔保更強
哈斯克爾可以驗證有關副作用的語句,例如一個屬性,如「這個程序不能在標準輸出上打印出任何東西」
勒柯克也驗證終端 - 「結束本程序的所有輸入」
多少錢你要驗證,這取決於口味和手頭的問題。所有的魔法(驗證)都是以價格爲準。
如果你以前從未見過ML,那就試一試。至少給予亞倫明斯基的talk 5分鐘的關注。它可以改變你作爲程序員的生活。
我不確定「顯示」。通過類型推斷,程序員不會明確地給變量賦予一個類型。 – 2013-01-31 13:12:06
我還沒有使用過類型推斷的語言,也不知道對不起。 – Cramer 2013-03-18 01:35:36