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


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)中執行。JavaC#引領了這種風潮,它的初衷是在跨平台的同時兼顧執行效率。

4、關於 Python

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

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

最后,一句話介紹Python:Python是解釋型語言,是一個強類型的動態腳本語言。

  • 強類型:不允許不同類型相加。例如:整形+字符串會報類型錯誤。
  • 動態:不用對變量的數據類型進行聲明,且確定一個變量的類型是在第一次給它賦值的時候。
  • 腳本語言:一般是解釋性語言,運行代碼只需要一個解釋器,不需要編譯。

Tips1

動態類型語言和靜態類型語言

(1)什么是動態類型語言和靜態類型語言

  • 動態類型語言:
    動態類型語言是在程序運行時確定數據類型的語言。變量使用之前不需要進行類型聲明,會在你第一次賦值給變量時,在內部記錄數據類型,如Python。

  • 靜態類型語言:
    靜態類型語言是在編譯時變量的數據類型即可確定的語言,多數靜態類型語言要求在使用變量之前必須聲明數據類型,如Java。

(2)兩者優缺點

動態類型語言優缺點:

  • 優點:代碼相對比較簡潔,無需編寫各種類型代碼,方便用戶閱讀;
  • 缺點:調試不方便,代碼命名容易混;

靜態類型語言優缺點:

  • 優點:在調試時比較方便,代碼規范。
  • 缺點:代碼相對繁瑣,需要在定義變量的時候就判斷變量的類型。

Tips2

強類型定義語言和弱類型定義語言

(1)什么是強類型語言和弱類型語言

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

  • 弱類型定義語言:
    數據類型可以被忽略的語言。它與強類型定義語言相反, 一個變量可以賦不同數據類型的值。強類型定義語言在速度上可能略遜色於弱類型定義語言,但是強類型定義語言帶來的嚴謹性能夠有效的避免許多錯誤。

(2)兩者區別

  • 強類型語言是一旦變量的類型被確定,就不能轉化的語言。
  • 弱類型語言則反之,一個變量的類型是由其應用上下文確定的。

(3)優缺點

靜態語言的優勢:

  • 由於類型的強制聲明,使得IDE有很強的代碼感知能力,故在實現復雜的業務邏輯、開發大型商業系統、以及那些生命周期很長的應用中,依托IDE對系統的開發很有保障;
  • 由於靜態語言相對比較封閉,使得第三方開發包對代碼的侵害性可以降到最低;

動態語言的優勢:

  • 思維不受束縛,可以任意發揮,把更多的精力放在產品本身上。
  • 集中思考業務邏輯實現,思考過程即實現過程。

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


免責聲明!

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



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