久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

編譯器與解釋器的區(qū)別和工作原理

 價(jià)值發(fā)現(xiàn) 2020-10-04

這篇教程,,我們一起來(lái)了解編譯器和解釋器的工作原理,,這對(duì)我們提升能力很重要。

我一直認(rèn)為概念或理論知識(shí)是非常重要的,,讓我們能夠?qū)⒑芏嗄:恼J(rèn)知關(guān)聯(lián)起來(lái),,變得更加清楚,從而打開視野,,上升到新的層次,。

但是,一般來(lái)說,,在剛剛?cè)腴T的時(shí)候,,接觸一些概念性、理論性的內(nèi)容,,不但非??菰铮译y以理解,。

而在一定時(shí)間的學(xué)習(xí)接觸之后,,再來(lái)看這些東西,則會(huì)變得更加容易領(lǐng)悟,,理解的更透徹,。

這篇教程會(huì)包含很多專業(yè)術(shù)語(yǔ),我會(huì)對(duì)其中一些專業(yè)術(shù)語(yǔ)進(jìn)行解釋,,對(duì)于一些未做解釋的專業(yè)術(shù)語(yǔ),,建議大家通過搜索引擎進(jìn)行理解。

首先,,從Python這種編程語(yǔ)言說起,。

它有以下幾個(gè)特點(diǎn):

  • 面向?qū)ο螅涸诒菊镜摹禤ython3萌新入門筆記》中有專門的文章,簡(jiǎn)單來(lái)說是指在程序設(shè)計(jì)中能夠采用封裝,、繼承,、多態(tài)的設(shè)計(jì)方法。
  • 動(dòng)態(tài)語(yǔ)言:是在運(yùn)行時(shí)可以改變其結(jié)構(gòu)的語(yǔ)言,;例如,,在程序運(yùn)行過程中,給一個(gè)類的對(duì)象添加原本不存在的屬性,。
  • 動(dòng)態(tài)數(shù)據(jù)類型:變量不需要指定類型,,但需要解釋器執(zhí)行代碼時(shí)去辨別數(shù)據(jù)類型;這個(gè)特點(diǎn)讓編程變得簡(jiǎn)單,,但代碼執(zhí)行效率變低,。
  • 高級(jí)語(yǔ)言:是指高度封裝了的編程語(yǔ)言,,相對(duì)于機(jī)器語(yǔ)言,更加適合人類編寫與閱讀,。
  • 解釋型語(yǔ)言:是指無(wú)需編譯,,直接能夠?qū)⒃创a解釋為機(jī)器語(yǔ)言進(jìn)行運(yùn)行的語(yǔ)言。

從最后一個(gè)特點(diǎn),,我們能夠看到Python是解釋型語(yǔ)言,,也就是說源代碼需要通過解釋器進(jìn)行解釋執(zhí)行。

編程語(yǔ)言分為編譯型語(yǔ)言和解釋型語(yǔ)言,,我們需要了解它們的區(qū)別,,才能夠更好的理解編譯器和解釋器的區(qū)別。

相信大家都知道C和C++,。

這兩種語(yǔ)言都是編譯型語(yǔ)言,。

編譯型語(yǔ)言的特點(diǎn)是執(zhí)行速度快,缺點(diǎn)是什么呢,?

編譯型語(yǔ)言需要編譯器處理,,主要工作流程如下:

源代碼 (source code) → 預(yù)處理器 (preprocessor) → 編譯器 (compiler) → 目標(biāo)代碼 (object code) → 鏈接器 (Linker) → 可執(zhí)行程序 (executables)

在這個(gè)工作流程中,編譯器調(diào)用預(yù)處理器進(jìn)行相關(guān)處理,,將源代碼進(jìn)行優(yōu)化轉(zhuǎn)換(包括清除注釋,、宏定義、包含文件和條件編譯),,然后,,通過將經(jīng)過預(yù)處理的源代碼編譯成目標(biāo)代碼(二進(jìn)制機(jī)器語(yǔ)言),再通過調(diào)用鏈接器外加庫(kù)文件(例如操作系統(tǒng)提供的API),,從而形成可執(zhí)行程序,,讓機(jī)器能夠執(zhí)行。

在這個(gè)工作流程中,,目標(biāo)代碼要和機(jī)器的CPU架構(gòu)相匹配,,庫(kù)文件要和操作系統(tǒng)相匹配。

如果想在不同CPU的機(jī)器或者系統(tǒng)上運(yùn)行C語(yǔ)言的源代碼,,就需要針對(duì)不同的CPU架構(gòu)和操作系統(tǒng)進(jìn)行編譯,,這樣才能夠在機(jī)器上運(yùn)行程序。

所以,,編譯型語(yǔ)言的缺點(diǎn)我們就看到了,,它不適合跨平臺(tái)。

而且,,到這里大家應(yīng)該能知道,為什么CPU一樣,,但是exe程序只能Windows中運(yùn)行,,而不能在Mac中運(yùn)行了,。

如果上面感覺不太好理解,我舉一個(gè)貼近生活的例子:

一名會(huì)多國(guó)語(yǔ)言的老師教了很多外國(guó)學(xué)生,,這些學(xué)生分別來(lái)自有英國(guó),、美國(guó)、法國(guó),、德國(guó),、韓國(guó)。

當(dāng)這名老師給這些學(xué)生發(fā)放學(xué)習(xí)資料的時(shí)候,,都需要把中文資料先進(jìn)行翻譯,,變成英文版、德文版,、法文版和韓文版的電子文檔,,再分別發(fā)給每個(gè)國(guó)家的學(xué)生去學(xué)習(xí)。

這個(gè)翻譯的工作非常繁瑣,。

不僅,,要翻譯成每個(gè)國(guó)家的語(yǔ)言,而且,,還要考慮英式英語(yǔ)和美式英語(yǔ)的區(qū)別分別翻譯成不同的英文版,。

再有,就是每次資料更新還都要重新翻譯一遍,。

在上面的例子中,,中國(guó)老師就像是編譯型語(yǔ)言的開發(fā)人員,中文資料就是編譯型語(yǔ)言的源代碼,,翻譯后的資料就是不同CPU架構(gòu)的機(jī)器語(yǔ)言,,不同語(yǔ)言的學(xué)生就是不同CPU架構(gòu)的機(jī)器,美國(guó)和英國(guó)的學(xué)生,,就是CPU架構(gòu)相同但操作系統(tǒng)不同的機(jī)器,。

注意:這里涉及到跨平臺(tái)的概念,平臺(tái)可以理解為不同CPU架構(gòu)(例如X86,、ARM等)的機(jī)器和同種CPU但不同的操作系統(tǒng)(例如Unix,、Windows等)的機(jī)器。

提示:建議大家閱讀上述內(nèi)容時(shí),,了解一下預(yù)處理器,、鏈接器、庫(kù)文件(靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù))的相關(guān)概念,。

我們繼續(xù)看剛才的例子,。

這位累得要死的中國(guó)老師,開始想辦法。

他想,,我干嘛自己去翻譯,,給他們一人一個(gè)自動(dòng)翻譯軟件不就好了?

于是,,老師就給每個(gè)學(xué)生定制了一個(gè)自動(dòng)翻譯軟件,,這個(gè)軟件能夠一頁(yè)一頁(yè)的原始中文資料翻譯成不同的語(yǔ)言資料給學(xué)生看。

現(xiàn)在的情況,,這名老師工作會(huì)輕松很多,,不需要再考慮制作各種語(yǔ)言版本的資料,只需要把精力放在制作中文資料就好了,。

早期的解釋器就是這樣的工作流程:源代碼 (source code) → 解釋器 (interpreter) ,。

源代碼無(wú)需預(yù)先編譯成可執(zhí)行程序。

在程序執(zhí)行時(shí),,解釋器讀取一句源代碼之后,,先進(jìn)行詞法分析和語(yǔ)法分析,再將源代碼轉(zhuǎn)換為解釋器能夠執(zhí)行的中間代碼(字節(jié)碼),,最后,,由解釋器將中間代碼解釋為可執(zhí)行的機(jī)器指令。

所以,,編譯型語(yǔ)言的可執(zhí)行程序產(chǎn)生的是直接執(zhí)行機(jī)器指令,,而解釋型語(yǔ)言的每一句源代碼都要經(jīng)過解釋器解釋為可以執(zhí)行的機(jī)器指令,相比之下解釋型語(yǔ)言的執(zhí)行效率會(huì)低一些,。

但是,,解釋型語(yǔ)言在不同的平臺(tái)有不同的解釋器,源代碼跨平臺(tái)的目的實(shí)現(xiàn)了,,開發(fā)人員不用再考慮每個(gè)平臺(tái)如何去編譯,,只需要關(guān)注代碼的編寫,編寫完的代碼在任何平臺(tái)都能無(wú)需修改(或少量修改)就能正確執(zhí)行,。

例如,,Linux系統(tǒng)中執(zhí)行Python源代碼時(shí)支持 fork()函數(shù),而window系統(tǒng)中不支持這個(gè)函數(shù),,如果將運(yùn)行在Linux系統(tǒng)中的源代碼移植到Windows系統(tǒng),,這時(shí)就需要進(jìn)行修改。

理解了編譯型語(yǔ)言和解釋型語(yǔ)言的區(qū)別,,我們繼續(xù)看例子,。

老師雖然給學(xué)生定制了翻譯軟件,但是發(fā)現(xiàn)這個(gè)軟件翻譯每頁(yè)內(nèi)容都很慢,,究其原因,,這個(gè)軟件需要先把每頁(yè)內(nèi)容分析一遍,,將內(nèi)涵復(fù)雜的中文(例如成語(yǔ))轉(zhuǎn)換成簡(jiǎn)單直接能夠直接進(jìn)行翻譯的中文,再進(jìn)行向其它國(guó)家語(yǔ)言的翻譯,。

看到這個(gè)問題之后,,軟件的提供商想出了一個(gè)解決方案,。

這個(gè)方案就是:第一次打開資料時(shí),,讓翻譯軟件把原始資料完整的進(jìn)行分析轉(zhuǎn)換,保存成一個(gè)能夠直接翻譯的中間文件,;然后,,翻譯程序再一頁(yè)一頁(yè)的讀取轉(zhuǎn)換后的中間文件去翻譯;這樣的話,,雖然第一次打開時(shí)慢了些,,但是,當(dāng)學(xué)生再次打開資料時(shí),,只要原始資料沒有更新,,就直接通過保存的中間文件進(jìn)行翻譯,速度會(huì)有很大提升,。當(dāng)然,,程序打開時(shí),需要對(duì)比一下原始資料是否和中間文件一致,,如果有修改,,則再次編譯出新的中間文件,覆蓋舊的中間文件,。

Python程序運(yùn)行時(shí),,就像上面的例子一樣,先將源代碼完整的進(jìn)行轉(zhuǎn)換,,編譯成更有效率的字節(jié)碼,,保存成后綴為“.pyc”的字節(jié)碼文件,然后,,翻譯器再通過這個(gè)文件一句一句的翻譯為機(jī)器語(yǔ)言去執(zhí)行,。

注意:Shell中執(zhí)行源代碼時(shí)不會(huì)生成中間文件,每次都是讀取源代碼,,轉(zhuǎn)化為字節(jié)碼后,,解釋執(zhí)行。

上面的例子還沒結(jié)束,。

軟件供應(yīng)商提出的方案雖然解決了一些效率問題,,但是還無(wú)法完全讓人滿意。

經(jīng)過苦思冥想,,軟件供應(yīng)商又想出了一個(gè)新的方案,。

在原始資料中有很多重復(fù)的內(nèi)容;

這些重復(fù)的內(nèi)容如果翻譯一次之后,就把它保存,,再碰到相同的內(nèi)容就直接使用保存的翻譯結(jié)果,。

而沒有必要每次都再翻譯。

長(zhǎng)時(shí)間運(yùn)行程序時(shí),,速度就會(huì)快上很多,。

這個(gè)例子實(shí)際上就是JIT即時(shí)編譯器(Just-In-Time Compiler)的比喻。

無(wú)論是使用解釋器進(jìn)行解釋執(zhí)行,,還是使用編譯器進(jìn)行編譯后執(zhí)行,,最終源代碼都需要被轉(zhuǎn)換為對(duì)應(yīng)平臺(tái)的本地機(jī)器指令。

那么,,一些重復(fù)出現(xiàn)的代碼,,就可以將其編譯為本地機(jī)器指令,重復(fù)使用,,從而提高效率,。

這些重復(fù)出現(xiàn)的代碼包括多次調(diào)用的方法和多次執(zhí)行的循環(huán)體。

JIT即時(shí)編譯器比較典型的例子是在JVM(Java虛擬機(jī))中,。

Java程序最初是通過解釋器進(jìn)行解釋執(zhí)行的,,當(dāng)Java虛擬機(jī)發(fā)現(xiàn)某個(gè)方法或代碼塊運(yùn)行特別頻繁的時(shí)候,就會(huì)認(rèn)為這是“熱點(diǎn)代碼”(Hot Spot Code),。JIT即時(shí)編譯器會(huì)將這些“熱點(diǎn)代碼”編譯成與本地機(jī)器相關(guān)的機(jī)器指令,,進(jìn)行各個(gè)層次的優(yōu)化。

當(dāng)程序需要迅速啟動(dòng)和執(zhí)行的時(shí)候,,解釋器可以首先發(fā)揮作用,,省去編譯的時(shí)間,立即執(zhí)行,。在程序運(yùn)行后,,隨著時(shí)間的推移,編譯器逐漸發(fā)揮作用,,把越來(lái)越多的代碼編譯成本地機(jī)器指令之后,,可以獲取更高的執(zhí)行效率。當(dāng)程序運(yùn)行環(huán)境中內(nèi)存資源限制較大,,可以使用解釋器執(zhí)行節(jié)約內(nèi)存,,反之可以使用編譯執(zhí)行來(lái)提升效率。

大家都知道,,Java程序的運(yùn)行性能很高,,基本上可以和C/C++的程序相媲美。這主要是因?yàn)镴IT即時(shí)編譯器可以針對(duì)那些頻繁被調(diào)用的“熱點(diǎn)代碼”做出深度優(yōu)化,,而靜態(tài)編譯器無(wú)法完全推斷出哪些是運(yùn)行時(shí)的熱點(diǎn)代碼,,而不能做出針對(duì)性的優(yōu)化,。因此,通過JIT即時(shí)編譯器編譯的本地機(jī)器指令才會(huì)比直接生成的本地機(jī)器指令擁有更高的執(zhí)行效率,。

Python有多種解釋器,,比較著名的有CPython、IPython,、PyPy,、Jython和IronPython等。

其中CPython是Python官方默認(rèn)的解釋器,,它是用C語(yǔ)言實(shí)現(xiàn)Pyhon解釋器,。

CPython是單純的解釋器,將源代碼轉(zhuǎn)化為字節(jié)碼之后解釋執(zhí)行,。

而另外一款使用Python實(shí)現(xiàn)的Python解釋器PyPy,比CPython解釋器更加靈活,。因?yàn)镻yPy采用了JIT技術(shù),,在程序的運(yùn)行性能上PyPy將近是CPython解釋器執(zhí)行效率的1至5倍。

而其它的解釋器都各有特點(diǎn),。

IPython是基于CPython增強(qiáng)了交互,。

Jython是運(yùn)行在Java平臺(tái)上的Python解釋器。

IronPython是運(yùn)行在.Net平臺(tái)上的Python解釋器,。

以上就是對(duì)編譯器和解釋器區(qū)別和工作原理的講述,,因?yàn)闆]有找到現(xiàn)成的資料,所以,,其中內(nèi)容參考了很多網(wǎng)上的資料,,多番查證后,進(jìn)行了融合,。如果有解釋錯(cuò)誤,,或者講解不透徹的地方,歡迎大家指正并提出建議,。

原文https://www.cnblogs.com/clemente/p/10413618.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多