程式語言概覽(90%)
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%。
相關文章
- Dart語言概覽Dart
- 自然語言處理技術詳細概覽自然語言處理
- 帶讀 |《Go in Action》(中文:Go語言實戰) 語法和語言結構概覽(三)Go
- 帶讀 |《Go in Action》(中文:Go語言實戰)語法和語言結構概覽 (二)Go
- 併發程式設計概覽程式設計
- 概覽
- “低程式碼”平臺特性概覽
- PostgreSQL 優化器程式碼概覽SQL優化
- DOM概覽
- 公司概覽
- 為 AI 而生的程式語言「GitHub 熱點速覽」AIGithub
- 各種不同領域的程式語言一覽表
- Hooks概覽(譯)Hook
- Java NIO 概覽Java
- Flutter框架概覽Flutter框架
- Babel 社群概覽Babel
- 推理框架概覽框架
- BurpSuite 功能概覽UI
- 聊聊C語言/C++—程式和程式語言C語言C++
- Java併發程式設計知識概覽(一)Java程式設計
- Python 基礎概覽Python
- Vuex - 原始碼概覽Vue原始碼
- Flutter技術概覽Flutter
- React Hooks-概覽ReactHook
- python - pipenv 使用概覽Python
- BIO,NIO,AIO概覽AI
- 概覽【JavaScript那些事】JavaScript
- 設計模式概覽設計模式
- PyQt5 概覽QT
- 流量控制--概覽
- HTTP報文 概覽HTTP
- Redis分散式概覽Redis分散式
- Android 儲存概覽Android
- 編譯原理概覽編譯原理
- SpringMVC 解析(一)概覽SpringMVC
- Milvus 2.0 Knowhere 概覽
- CheerpX:使用 WebAssembly 在瀏覽器中執行任何程式語言Web瀏覽器
- PLSQL程式語言SQL