程式語言概覽(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
- (翻譯)Dart語言概覽Dart
- 自然語言處理技術詳細概覽自然語言處理
- 帶讀 |《Go in Action》(中文:Go語言實戰)語法和語言結構概覽 (二)Go
- 帶讀 |《Go in Action》(中文:Go語言實戰) 語法和語言結構概覽(三)Go
- PLSQL Language Reference-PL/SQL概覽-PL/SQL語言基礎SQL
- Bjarne Stroustrup:概觀C++程式設計語言 (轉)JARC++程式設計
- 概覽
- 併發程式設計概覽程式設計
- Kotlin 概覽——如何看待 Google 將 Kotlin 選為 Android 官方語言?KotlinGoAndroid
- 面嚮物件語言概論 (一) (轉)物件
- “低程式碼”平臺特性概覽
- PostgreSQL 優化器程式碼概覽SQL優化
- 機器學習概覽機器學習
- Babel 社群概覽Babel
- Hooks概覽(譯)Hook
- 推理框架概覽框架
- Flutter框架概覽Flutter框架
- Java NIO 概覽Java
- 學習概覽
- IT專案概覽
- 把程式語言看做語言
- 各種不同領域的程式語言一覽表
- 為 AI 而生的程式語言「GitHub 熱點速覽」AIGithub
- iOS開發系列--IOS程式開發概覽iOS
- 蘋果釋出 Swift 程式語言,支援程式碼效果實時預覽蘋果Swift
- PyQt5 概覽QT
- React Hooks-概覽ReactHook
- Flutter技術概覽Flutter
- HTTP報文 概覽HTTP
- Redis分散式概覽Redis分散式
- BIO,NIO,AIO概覽AI
- Vuex - 原始碼概覽Vue原始碼
- 概覽【JavaScript那些事】JavaScript
- 編譯原理概覽編譯原理
- Goolge AppEngine概覽GoAPP
- SOE開發概覽
- redis基本操作概覽Redis