1. 程式人生 > >關於程式語言的靜態型別、動態型別、編譯型以及解釋型的區別

關於程式語言的靜態型別、動態型別、編譯型以及解釋型的區別

學習Go語言時,看到解釋說Go語言是一種靜態型別,編譯型的語言。特意去了解了一下什麼是靜態型別,什麼是編譯型,與之對應的又是什麼。作為記錄寫下這篇部落格,以下純粹個人粗淺的理解,若有理解錯誤之處,請指出,謝謝。

1. 靜態型別和動態型別的區別

個人理解這種區別主要是型別檢查(Type Check)發生的時機不同,即可以通過判斷語言是在什麼時候檢查型別錯誤來判斷其所屬的型別。

  • 靜態型別: 編譯時即知道每一個變數的型別,因此,若存在型別錯誤編譯是無法通過的。

  • 動態型別: 編譯時不知道每一個變數的型別,因此,若存在型別錯誤會在執行時發生錯誤。

Go語言的型別檢查發生在編譯時,因此它是靜態型別的。

2. 編譯型和解釋性的區別

個人理解無論是編譯型還是解釋性,其本質都是將高階語言(Java,C, Python等)翻譯成機器能理解和執行的語言 。這種區別主要是翻譯發生的時機不同。

  • 編譯型: 翻譯發生在程式執行之前,將高階語言翻譯成機器語言。再次執行時,可直接使用上一次翻譯好的機器碼,不需要重新編譯。

  • 解釋型: 翻譯發生在程式執行時,即邊翻譯邊執行。再次執行時,需要重新進行翻譯。

Go語言可以直接編譯成可執行檔案 , 如Window系統下,可以直接編譯成.exe檔案。因此是編譯型語言。

3. Java語言是靜態型別還是動態型別? 是編譯型還是解釋型?

Java語言的型別檢查發生在編譯時,因此個人認為 Java語言是一種靜態型別。
Java語言首先通過編譯器,得到.class檔案,然後其虛擬機器對.class檔案進行逐條解釋執行。因此我我認為Java本質上一種解釋型的語言, 但是需要先經過編譯器生成.class,為什麼要這樣做,個人認為是為了Java的跨平臺特性。與Java不同的是,有些語言是直接翻譯成機器碼的(比如C#),這種是典型的編譯型。