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


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

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

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

    • 另外一種說法(靜態類型語言(Statically typed language) 就是指在運行之前編譯時要檢查數據的類型的語言。如目前主流的開發語言C、C++,JAVA,C#.)
  • 動態類型: 編譯時不知道每一個變量的類型,因此,若存在類型錯誤會在運行時發生錯誤。

    • 另外一種說法(動態類型語言(Dynamically typed language)就是指在運行的時候才去檢查數據的類型的語言。如大部分腳本語言,ruby,Python。所謂動態就是在運行的時候根據給變量或者對象的值的類型來確定其類型。)

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

 

2. 強類型語言和弱類型語言的區別

  • 強類型語言: 強制數據類型定義的語言。也就是說,一旦一個變量被指定了某個數據類型,如果不經過強制轉換,那么它就永遠是這個數據類型了。舉個例子:如果你定義了一個整型變量a,那么程序根本不可能將a當作字符串類型處理。強類型定義語言是類型安全的語言。

  • 弱類型語言: 數據類型可以被忽略的語言。它與強類型定義語言相反, 一個變量可以賦不同數據類型的值。

  注意:強類型定義語言在速度上可能略遜色於弱類型定義語言,但是強類型定義語言帶來的嚴謹性能夠有效的避免許多錯誤。另外,“這門語言是不是動態語言”與“這門語言是否類型安全”之間是完全沒有聯系的!

  例如:Python是動態語言,是強類型定義語言(類型安全的語言); javaScript是動態語言,是弱類型定義語言(類型不安全的語言); JAVA是靜態語言,是強類型定義語言(類型安全的語言)

 

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

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

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

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

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

 

4. Java語言是靜態類型還是動態類型? 是編譯型還是解釋型?

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

 

5. 總結

編譯型與解釋型,兩者各有利弊。前者由於程序執行速度快,同等條件下對系統要求較低,因此像開發操作系統、大型應用程序、數據庫系統等時都采用它,像C/C++、Pascal/Object 

Pascal(Delphi)、VB等基本都可視為編譯語言,而一些網頁腳本、服務器腳本及輔助開發接口這樣的對速度要求不高、對不同系統平台間的兼容性有一定要求的程序則通常使用解釋性語言,如Java、JavaScript、VBScript、Perl、Python等等。 

但既然編譯型與解釋型各有優缺點又相互對立,所以一批新興的語言都有把兩者折衷起來的趨勢,例如Java語言雖然比較接近解釋型語言的特征,但在執行之前已經預先進行一次預編譯,生成的代碼是介於機器碼和Java源代碼之間的中介代碼,運行的時候則由JVM(Java的虛擬機平台,可視為解釋器)解釋執行。它既保留了源代碼的高抽象、可移植的特點,又已經完成了對源代碼的大部分預編譯工作,所以執行起來比“純解釋型”程序要快許多。總之,隨着設計技術與硬件的不斷發展,編譯型與解釋型兩種方式的界限正在不斷變得模糊。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM