『無為則無心』Python基礎 — 2、編譯型語言和解釋型語言的區別

繁華似錦Fighting發表於2021-06-20

1、什麼是計算機語言

計算機就是一臺用來計算機的機器,人讓計算機幹什麼計算機就幹什麼。我們需要通過計算機的語言來控制計算機,所謂計算機的語言就是程式語言。

計算機語言其實和人類的語言沒有本質的區別,不同點就是交流的主體不同。也就是說中文、英文是人和人之間的交流語言,而計算機語言(程式語言)是人和計算機交流的語言。

計算機語言發展經歷了三個階段:

(1)機器語言

  • 最早的一種計算機語言。
  • 機器語言通過二進位制編碼來編寫程式,二進位制編碼就是1和0,計算機也只認識1和0。
  • 執行效率高,但編寫起來太麻煩。

(2)組合語言

  • 使用符號(如ABC和各種符號)來代替二進位制編碼。
    編寫程式時,不需要使用二進位制,而是直接編寫符號。
    編寫完成後,需要將符號轉換為機器碼,然後再由計算機執行。
  • 符號轉換為機器碼的過程稱為彙編。
  • 將機器碼轉換為符號的過程,稱為反彙編 。
  • 組合語言一般只適用於某些硬體,和硬體的關係太緊密,相容性比較差 。
    就好比不同硬體廠商識別符號的標準是不一樣的。
  • 現在的一些硬體驅動還是會用到組合語言進行編寫。

(3)高階語言

  • 高階語言的語法基本和現在英語語法類似,並且和硬體的關係沒有那麼緊密了。
    也就是說通過高階語言開發程式可以在不同的硬體系統中執行。
  • 高階語言都會有自己的編譯器,所編寫的程式碼都會執行在自己的編譯器上。
    不同系統上安裝想對應的編譯器,實現一份原始碼一次編譯,到處執行。
  • 高階語言學習起來也更加的容易,現在我們知道的語言基本都是高階語言。如CC++C#JavaGolangPython等等。

2、高階語言中的編譯型語言和解釋型語言

計算機是不能理解高階語言的,更不能直接執行高階語言,它只能直接理解機器語言(二進位制編碼)。所以使用任何高階語言編寫的程式,若想被計算機執行,都必須將其轉換成計算機語言,也就是機器碼,這個過程就叫編譯。比如,一行Python的命令print('hello') ,必需要轉換為類似1010101 這樣的機器碼 ,計算機才能夠識別你的命令。

根據從原始碼轉換二進位制編碼的時機不同,語言分成了兩大類:編譯型語言解釋型語言

(1)編譯型語言

對於編譯型語言,開發完成以後需要將所有的原始碼都轉換成可執行程式,比如 Windows 下的.exe檔案,可執行程式裡面包含的就是機器碼。只要我們擁有可執行程式,就可以隨時執行,不用再重新編譯了,也就是“一次編譯,無限次執行”。

在執行的時候,我們只需要執行編譯生成的可執行程式,不再需要原始碼和編譯器了,所以說編譯型語言可以脫離開發環境執行。

編譯型語言一般是不能跨平臺的,也就是不能在不同的作業系統之間隨意切換。

編譯型語言使用的轉換工具稱為編譯器。常見的編譯型語言有CC++Golang等。

總結:

  • 編譯一次後,脫離了編譯器也可以執行,並且執行效率高。
  • 可移植性差,跨平臺性比較差。

(2)解釋型語言

對於解釋型語言,每次執行程式都需要一邊轉換一邊執行,用到哪些原始碼就將哪些原始碼轉換成機器碼,用不到的不進行任何處理。每次執行程式時可能使用的功能不同,這個時候需要轉換的原始碼也不一樣。

因為每次執行程式都需要重新轉換原始碼,所以解釋型語言的執行效率天生就低於編譯型語言,甚至存在數量級的差距。計算機的一些底層功能,或者關鍵演算法,一般都使用 C/C++ 實現,只有在應用層面(比如網站開發、批處理、小工具等)才會使用解釋型語言。

在執行解釋型語言的時候,我們始終都需要原始碼和直譯器,所以說它無法脫離開發環境或者執行環境 。

解釋型語言使用的轉換工具稱為直譯器。常見的解釋型語言有PythonJavaScriptPHPShell等。

總結:

  • 每次執行程式碼都需要解釋一次,執行速度比較慢。
  • 不能脫離直譯器獨立執行。
  • 跨平臺性比較好。

(3)編譯型語言和解釋型語言執行流程

如下圖所示:

image

3、知識擴充套件:

(1)擴充套件1

當我們說“下載一個程式(軟體)”時,不同型別的語言有不同的含義:

  • 對於編譯型語言,我們下載到的是可執行檔案,原始碼被作者保留,所以編譯型語言的程式一般是閉源的。
  • 對於解釋型語言,我們下載到的是所有的原始碼,因為作者不給原始碼就沒法執行,所以解釋型語言的程式一般是開源的。

(2)擴充套件2

編譯器就是一個“翻譯工具”,類似於將中文翻譯成英文、將英文翻譯成俄文。但是,翻譯原始碼是一個複雜的過程,大致包括詞法分析、語法分析、語義分析、效能優化、生成可執行檔案等五個步驟,期間涉及到複雜的演算法和硬體架構。直譯器與此類似,有興趣的讀者請參考《編譯原理》一書,本文不再贅述。

(3)擴充套件3

JavaC#是一種比較奇葩的存在,它們是半編譯半解釋型的語言,原始碼需要先轉換成一種中間檔案(位元組碼檔案),然後再將中間檔案拿到虛擬機器(JVM)中執行。Java引領了這種風潮,它的初衷是在跨平臺的同時兼顧執行效率。C# 是後來的跟隨者,但是 C# 一直止步於 Windows 平臺,在其它平臺鮮有作為。

4、關於Python

Python 屬於典型的解釋型語言,所以執行 Python 程式只需要直譯器的支援,只要你在不同的平臺安裝了不同的直譯器,你的程式碼就可以隨處執行,不用擔心任何相容性問題,真正的“一次編寫,到處執行”。

Python 幾乎支援所有常見的平臺,比如 Linux、Windows、Mac OS 等,你所寫的 Python程式碼無需修改,就能在這些平臺上正確執行,Python 的可移植性是很強的。

參考:http://c.biancheng.net/view/4136.html

相關文章