專(zhuān)注搜索競(jìng)價(jià)代運(yùn)營(yíng)

成長(zhǎng)之選 ,效果之道!

免費(fèi)咨詢(xún)熱線(xiàn):17636682598

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

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

計(jì)算機(jī)怎么理解人類(lèi)語(yǔ)言

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

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

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

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

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

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

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

解釋型語(yǔ)言

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

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

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

當(dāng)我們說(shuō)“下載一個(gè)程序(軟件)”時(shí),不同類(lèi)型的語(yǔ)言有不同的含義:

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

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

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

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

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

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

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

編譯型語(yǔ)言

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

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

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

編譯型語(yǔ)言不能跨平臺(tái)表現(xiàn)在兩個(gè)方面:

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

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

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

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

2) 源代碼不能跨平臺(tái)

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

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

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

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

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

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

本文分類(lèi):營(yíng)銷(xiāo)學(xué)院

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

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

本文鏈接:http://www.ozone-depletion.net/edu/2409.html