程式語言概覽(90%)

songtianyi發表於2018-07-09

https://github.com/songtianyi/songtianyi.github.io/blob/master/mds/programming-languages-review.md

型別系統

什麼是型別?在軟體執行的過程中,變數可以為很多值,定義變數的邊界的描述即型別。變數可以被賦予型別(即變數有邊界)的語言稱為型別語言(typed language),無型別語言(untyped language)沒有型別,或者說只有一個全域性型別,能夠儲存所有的值。 型別語言我們見得多了,無型別的呢?lambda演算(pure λ-calculus)是無型別的,彙編和LISP也是無型別的.

變數型別的指定可以是顯式的

// golang
var foo int

也可以是隱式的

-- haskell
fac :: Int -> Int -- 這一行可以省略
fac 0 = 1
fac n = n * fac (n - 1)

fac 0 = 1
fac n = n * fac (n - 1)

型別系統會自動賦予變數型別,這種行為稱為型別推斷(type inference)。

型別檢查

型別系統是型別語言的首要組成部分。型別系統的一個職責是跟蹤變數的型別,判斷程式碼是否滿足型別約束,這種行為稱為型別檢查typechecking, 型別檢查是保證程式穩定執行的手段,同時又分為執行時檢查(runtime checks)和靜態檢查(static checks), 執行時檢查也叫動態檢查(dynamic checking).

型別系統做了靜態檢查,還有必要做動態檢查嘛?有,比如陣列的邊界檢查,就必須在runtime做。執行時的型別檢查會導致程式執行終止(fail-stop),為什麼還要檢查呢?讓它執行到無法繼續執行為止不就好了?型別檢查雖然會出錯,但是阻止了更惡劣的錯誤(untrapped errors)的發生,比如保證gc等機制能夠正常運轉,讓程式能夠更平滑地退出. 動態檢查的缺點是會導致fail-stop,也會消耗資源,影響效能,所以通常我們認為擁有靜態檢查的型別系統的語言會更穩定高效。但是靜態檢查就足夠安全了嗎?不一定,因為某些語言在靜態檢查時沒有檢查一些危險操作,比如C指標的運算和轉換,這類語言稱為weekly checked, 反之, 程式在編譯期間能夠儘可能發現所有的錯誤, 稱為strongly checked.

那麼延伸一下,怎麼區分一門語言是weekly checked, 還是strongly checked? 以下幾點可以作為判斷的依據。

Implicit type conversions

可以進行隱式型別轉換的語言屬於weekly checked, 如c++

int a = 3;
double b = 4.5;
a + b; // a將會被自動轉換為double型別,轉換的結果和b進行加法操作

Pointers

允許指標運算的語言屬於weekly checked, 比如c

..... 內容太長,見連結,完成度90%。

相關文章