程式語言筆記:型別系統
型別是什麼?
「型別」是電腦理解「資料的意義」的方式。
變數能儲存的資料種類 (ex:int、float、char、string、boolean)
變數能進行的操作 (ex:加減法、比較、串接)
編譯器或直譯器該如何管理記憶體與運算
簡單舉例說明:
int a = 10;
string b = "10";
上面 a 是數字,b 是文字。
強型別 vs 弱型別
語言在不同型別之間容不容易被自動轉換,容易的是弱型別,不容易是強型別。
直觀上最大的差異感大概是:型別錯了是「直接報錯」還是「幫你偷偷轉換」。
下面直接整理成表,比較一目了然:
| 強型別 | 弱型別 | |
|---|---|---|
| 定義 | 不允許或嚴格限制隱式型別轉換 | 允許自動轉換不同型別 |
| 代表語言 | Python、Java、C#、Rust | JavaScript、PHP(部分)、Perl |
| 優點 | 避免隱性錯誤,程式更穩定 | 撰寫更靈活,快速原型方便 |
| 缺點 | 需要明確轉型,程式碼較冗長 | 容易出現非預期結果 |
靜態型別 vs 動態型別
兩者差在型別什麼時候被確定,需要先宣告、且執行期間不能變換的是靜態,反之為動態。
一樣放比較表:
| 靜態型別 | 動態型別 | |
|---|---|---|
| 型別確認時機 | 編譯時 | 執行時 |
| 宣告方式 | 需明確宣告型別 | 型別由執行時自動判斷 |
| 代表語言 | C、C++、Java、Rust、Go | Python、JavaScript、Ruby |
| 優點 | 錯誤早期偵測、效能佳 | 靈活快速、撰寫方便 |
| 缺點 | 需要較多樣板程式碼 | 錯誤可能在執行期才爆出 |
語言型別分類
下面列舉一些程式語言和它的型別。
| 強/弱型別 | 動/靜態型別 | |
| C | 強 | 靜態 |
| C++ | 強 | 靜態 |
| Java | 強 | 靜態 |
| Python | 強 | 動態 |
| PHP | 弱 | 動態 |
| JavaScript | 弱 | 動態 |
| Go | 強 | 靜態 |
| Lua | 弱 | 動態 |
小結
了解型別系統對開發者來說有什麼好處呢?
我想,它是讓我們能否更快學會另一門程式語言的敲門磚,因為型別系統一樣的程式語言,兩者的設計邏輯是很接近的,舉個我觀察到的例子,善於使用 JavaScript 的工程師在上手 Lua 上,通常比善於使用 C/C++ 的工程師快(當然可能剛好我身邊幾個案例都是這樣)。
而同樣型別系統的程式語言,通常也容易產生類似的錯誤——像是惡夢的弱型別+動態型別,這種組合開發快,但卻容易造成型別混用的災難(它還不會報錯)。
型別系統的存在,或許看似只是語法上的規範,但實際上,它定義了一門語言的性格與思維模式。
留言
張貼留言