程式語言筆記:型別系統


 

型別是什麼?

「型別」是電腦理解「資料的意義」的方式。 

  • 變數能儲存的資料種類 (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++ 的工程師快(當然可能剛好我身邊幾個案例都是這樣)。

而同樣型別系統的程式語言,通常也容易產生類似的錯誤——像是惡夢的弱型別+動態型別,這種組合開發快,但卻容易造成型別混用的災難(它還不會報錯)。

 

型別系統的存在,或許看似只是語法上的規範,但實際上,它定義了一門語言的性格與思維模式。 

 

 

 



 

 

 

留言