在程式語言的中,型別系統是一個重要的概念,也是學習程式語言過程中,最先接觸到的概念。 不同的程式語言採用不同的型別系統,不同的型別系統對於開發效率及安全性都有不同的影響。 而型別基本上可以分為靜態型別、動態型別、強型別及弱型別,本文將說明這四種型別的差異。

靜態型別與動態型別

靜態型別

在宣告變數時,必須明確指定型別,且在使用過程中,不能任意更換型別,否則會產生錯誤。靜態型別在編譯時可以提早檢測出型別問題,減少程式執行風險。

                
                    String string = "Hello World";
                    string = 10;    // 產生 ERROR
                
            
  • 行 1:宣告變數時必須明確指定型別。
  • 行 2: 在使用過程中,不能任意更換型別,因此這一行程式碼會產生錯誤。

動態型別

在宣告變數時,無需明確指定型別,且在使用過中,也能任意更換型別,變數型別是在執行時確認的。

                
                    $string = "Hello World";
                    $string = 10;
                
            
  • 行 1: 宣告變數時無需明確指定型別,$string 變數型別,是由 = 後面的資料決定。
  • 行 2: 在使用過程中,也能任意更換型別,因此這一行程式碼並不會產生錯誤。$string 會自動變成 int 型別。

強型別與弱型別

強型別

將兩個不同型別的資料進行運算時,不允許型別轉換。

                
                    int a = 123;
                    String b = "456";
                    int c = a + b;      // 產生 ERROR
                
            
  • 行 3:在強型別中,不允許兩個不同型別的資料進行運算。

弱型別

將兩個不同型別的資料進行運算時,允許型別轉換。

                
                    $a = 123;
                    $b = "456";
                    $c = $a + $b;   // 在 PHP 中,$c 為 579
                
            
                
                    let a = 123;
                    let b = "456";
                    let c = a + b;   // 在 JavaScript 中,c 為 123456
                
            
  • 行 3:在弱型別中,可以將兩個不同型別的資料進行運算。但問題來了,$c 到底是 579 還是 123456 呢?答案是因程式語言而異,在 PHP 中是 579,在 JavaScript 中是 123456。因此,如果對程式語言不熟悉的話,就很容易出現錯誤判斷,也因此弱型別通常被認為較不安全,如果是動態弱型別,那這個問題就更嚴重了。

總結

上述說明的兩個象限可以組合出四種類型的型別系統,如下:

  • 靜態強型別:Java、C#、F#
  • 動態強型別:Python、Ruby、Groovy
  • 靜態弱型別:C、C++
  • 動態弱型別:JavaScript、PHP、Perl

這四種類型的型別都各有優缺點,比較極端的是靜態強型別及動態弱型別。 這兩種類型都擁有各自的支持者,靜態強型別的優點是程式安全性較高,很多錯誤可以在編譯時就發現。 而動態弱型別的優點則是分析程式碼更簡單,開發效率更快,可以加速開發人員尋找程式碼中的錯誤。

此外,一般認為動態弱型別是最不安全的型別系統,我基本同意這個說法,但我認為這主要是取決於開發人員對於程式語言的熟悉度。 型別安全是程式語言的特性,您完全可以使用型別不安全的語言,寫出型別安全的程式碼。