專注搜索競價代運(yùn)營

成長之選 ,效果之道!

免費(fèi)咨詢熱線:17636682598

Python是編譯型語言還是解釋型語言,兩者有什么不同之處

今天我們來聊聊Python是編譯型語言還是解釋型語言,兩者有什么不同之處,以下3個關(guān)于Python是編譯型語言還是解釋型語言,兩者有什么不同之處的觀點(diǎn)希望能幫助到您找到想要的資訊。

計算機(jī)怎么理解人類語言

我們編寫的源代碼是人類語言,我們自己能夠輕松理解;但是對于計算機(jī)硬件(CPU),源代碼就是天書,根本無法執(zhí)行,計算機(jī)只能識別某些特定的二進(jìn)制指令,在程序真正運(yùn)行之前必須將源代碼轉(zhuǎn)換成二進(jìn)制指令。

所謂的二進(jìn)制指令,也就是機(jī)器碼,是 CPU 能夠識別的硬件層面的“代碼”,簡陋的硬件(比如古老的單片機(jī))只能使用幾十個指令,強(qiáng)大的硬件(PC 和智能手機(jī))能使用成百上千個指令。

然而,究竟在什么時候?qū)⒃创a轉(zhuǎn)換成二進(jìn)制指令呢?不同的編程語言有不同的規(guī)定:

有的編程語言要求必須提前將所有源代碼一次性轉(zhuǎn)換成二進(jìn)制指令,也就是生成一個可執(zhí)行程序(Windows 下的 .exe),比如C語言、C++、Golang、Pascal(Delphi)、匯編等,這種編程語言稱為編譯型語言,使用的轉(zhuǎn)換工具稱為編譯器。

有的編程語言可以一邊執(zhí)行一邊轉(zhuǎn)換,需要哪些源代碼就轉(zhuǎn)換哪些源代碼,不會生成可執(zhí)行程序,比如 Python、JavaScript、PHP、Shell、MATLAB 等,這種編程語言稱為解釋型語言,使用的轉(zhuǎn)換工具稱為解釋器。

簡單理解,編譯器就是一個“翻譯工具”,類似于將中文翻譯成英文、將英文翻譯成俄文。但是,翻譯源代碼是一個復(fù)雜的過程,大致包括詞法分析、語法分析、語義分析、性能優(yōu)化、生成可執(zhí)行文件等五個步驟,期間涉及到復(fù)雜的算法和硬件架構(gòu)。解釋器與此類似,有興趣的讀者請參考《編譯原理》一書,本文不再贅述。

Java 和 C# 是一種比較奇葩的存在,它們是半編譯半解釋型的語言,源代碼需要先轉(zhuǎn)換成一種中間文件(字節(jié)碼文件),然后再將中間文件拿到虛擬機(jī)中執(zhí)行。Java 引領(lǐng)了這種風(fēng)潮,它的初衷是在跨平臺的同時兼顧執(zhí)行效率;C# 是后來的跟隨者,但是 C# 一直止步于 Windows 平臺,在其它平臺鮮有作為。

解釋型語言

對于解釋型語言,每次執(zhí)行程序都需要一邊轉(zhuǎn)換一邊執(zhí)行,用到哪些源代碼就將哪些源代碼轉(zhuǎn)換成機(jī)器碼,用不到的不進(jìn)行任何處理。每次執(zhí)行程序時可能使用不同的功能,這個時候需要轉(zhuǎn)換的源代碼也不一樣。

因?yàn)槊看螆?zhí)行程序都需要重新轉(zhuǎn)換源代碼,所以解釋型語言的執(zhí)行效率天生就低于編譯型語言,甚至存在數(shù)量級的差距。計算機(jī)的一些底層功能,或者關(guān)鍵算法,一般都使用 C/C++ 實(shí)現(xiàn),只有在應(yīng)用層面(比如網(wǎng)站開發(fā)、批處理、小工具等)才會使用解釋型語言。

在運(yùn)行解釋型語言的時候,我們始終都需要源代碼和解釋器,所以說它無法脫離開發(fā)環(huán)境。

當(dāng)我們說“下載一個程序(軟件)”時,不同類型的語言有不同的含義:

對于編譯型語言,我們下載到的是可執(zhí)行文件,源代碼被作者保留,所以編譯型語言的程序一般是閉源的。

對于解釋型語言,我們下載到的是所有的源代碼,因?yàn)樽髡卟唤o源代碼就沒法運(yùn)行,所以解釋型語言的程序一般是開源的。

相比于編譯型語言,解釋型語言幾乎都能跨平臺,“一次編寫,到處運(yùn)行”是真實(shí)存在的,而且比比皆是。那么,為什么解釋型語言就能跨平臺呢?

這一切都要?dú)w功于解釋器!

我們所說的跨平臺,是指源代碼跨平臺,而不是解釋器跨平臺。解釋器用來將源代碼轉(zhuǎn)換成機(jī)器碼,它就是一個可執(zhí)行程序,是絕對不能跨平臺的。

官方需要針對不同的平臺開發(fā)不同的解釋器,這些解釋器必須要能夠遵守同樣的語法,識別同樣的函數(shù),完成同樣的功能,只有這樣,同樣的代碼在不同平臺的執(zhí)行結(jié)果才是相同的。

你看,解釋型語言之所以能夠跨平臺,是因?yàn)橛辛私忉屍鬟@個中間層。在不同的平臺下,解釋器會將相同的源代碼轉(zhuǎn)換成不同的機(jī)器碼,解釋器幫助我們屏蔽了不同平臺之間的差異。

編譯型語言

對于編譯型語言,開發(fā)完成以后需要將所有的源代碼都轉(zhuǎn)換成可執(zhí)行程序,比如 Windows 下的.exe文件,可執(zhí)行程序里面包含的就是機(jī)器碼。只要我們擁有可執(zhí)行程序,就可以隨時運(yùn)行,不用再重新編譯了,也就是“一次編譯,無限次運(yùn)行”。

在運(yùn)行的時候,我們只需要編譯生成的可執(zhí)行程序,不再需要源代碼和編譯器了,所以說編譯型語言可以脫離開發(fā)環(huán)境運(yùn)行。

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

編譯型語言不能跨平臺表現(xiàn)在兩個方面:

1) 可執(zhí)行程序不能跨平臺

可執(zhí)行程序不能跨平臺很容易理解,因?yàn)椴煌僮飨到y(tǒng)對可執(zhí)行文件的內(nèi)部結(jié)構(gòu)有著截然不同的要求,彼此之間也不能兼容。不能跨平臺是天經(jīng)地義,能跨平臺反而才是奇葩。

比如,不能將 Windows 下的可執(zhí)行程序拿到 Linux 下使用,也不能將 Linux 下的可執(zhí)行程序拿到 Mac OS 下使用(雖然它們都是類 Unix 系統(tǒng))。

另外,相同操作系統(tǒng)的不同版本之間也不一定兼容,比如不能將 x64 程序(Windows 64 位程序)拿到 x86 平臺(Windows 32 位平臺)下運(yùn)行。但是反之一般可行,因?yàn)?64 位 Windows 對 32 位程序作了很好的兼容性處理。

2) 源代碼不能跨平臺

不同平臺支持的函數(shù)、類型、變量等都可能不同,基于某個平臺編寫的源代碼一般不能拿到另一個平臺下編譯。我們以C語言為例來說明。

【實(shí)例1】在C語言中要想讓程序暫??梢允褂?ldquo;睡眠”函數(shù),在 Windows 平臺下該函數(shù)是 Sleep(),在 Linux 平臺下該函數(shù)是 sleep(),首字母大小寫不同。其次,Sleep() 的參數(shù)是毫秒,sleep() 的參數(shù)是秒,單位也不一樣。

以上兩個原因?qū)е率褂脮和9δ艿腃語言程序不能跨平臺,除非在代碼層面做出兼容性處理,非常麻煩。

【實(shí)例2】雖然不同平臺的C語言都支持 long 類型,但是不同平臺的 long 的長度卻不同,例如,Windows 64 位平臺下的 long 占用 4 個字節(jié),Linux 64 位平臺下的 long 占用 8 個字節(jié)。

我們在 Linux 64 位平臺下編寫代碼時,將 0x2f1e4ad23 賦值給 long 類型的變量是完全沒有問題的,但是這樣的賦值在 Windows 平臺下就會導(dǎo)致數(shù)值溢出,讓程序產(chǎn)生錯誤的運(yùn)行結(jié)果。

讓人苦惱的,這樣的錯誤一般不容易察覺,因?yàn)榫幾g器不會報錯,我們也記不住不同類型的取值范圍。
Python 屬于典型的解釋型語言,所以運(yùn)行 Python 程序需要解釋器的支持

本文分類:營銷學(xué)院

瀏覽次數(shù):82次瀏覽

發(fā)布日期:2022-07-03 17:00:33

本文鏈接:http://www.godcuan.com/edu/2409.html