編譯器解釋器區別和工作原理

      網友投稿 1213 2022-05-30

      首先,從Python這種編程語言說起。

      它有以下幾個特點:

      面向對象:簡單來說是指在程序設計中能夠采用封裝、繼承、多態的設計方法。

      動態語言:是在運行時可以改變其結構的語言;例如,在程序運行過程中,給一個類的對象添加原本不存在的屬性。

      動態數據類型:變量不需要指定類型,但需要解釋器執行代碼時去辨別數據類型;這個特點讓編程變得簡單,但代碼執行效率變低。

      高級語言:是指高度封裝了的編程語言,相對于機器語言,更加適合人類編寫與閱讀。

      解釋型語言:是指無需編譯,直接能夠將源代碼解釋為機器語言進行運行的語言。

      從最后一個特點,我們能夠看到Python是解釋型語言,也就是說源代碼需要通過解釋器進行解釋執行。編程語言分為編譯型語言和解釋型語言,我們需要了解它們的區別,才能夠更好的理解編譯器和解釋器的區別。

      相信大家都知道C和C++。這兩種語言都是編譯型語言。編譯型語言的特點是執行速度快,缺點是什么呢?

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

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

      在這個工作流程中,編譯器調用預處理器進行相關處理,將源代碼進行優化轉換(包括清除注釋、宏定義、包含文件和條件編譯),然后,通過將經過預處理的源代碼編譯成目標代碼(二進制機器語言),再通過調用鏈接器外加庫文件(例如操作系統提供的API),從而形成可執行程序,讓機器能夠執行。

      在這個工作流程中,目標代碼要和機器的CPU架構相匹配,庫文件要和操作系統相匹配。

      如果想在不同CPU的機器或者系統上運行C語言的源代碼,就需要針對不同的CPU架構和操作系統進行編譯,這樣才能夠在機器上運行程序。所以,編譯型語言的缺點我們就看到了,它不適合跨平臺。而且,到這里大家應該能知道,為什么CPU一樣,但是exe程序只能Windows中運行,而不能在Mac中運行了。

      如果上面感覺不太好理解,我舉一個貼近生活的例子:一名會多國語言的中國老師教了很多外國學生,這些學生分別來自有英國、美國、法國、德國、韓國。當這名老師給這些學生發放學習資料的時候,都需要把中文資料先進行翻譯,變成英文版、德文版、法文版和韓文版的電子文檔,再分別發給每個國家的學生去學習。這個翻譯的工作非常繁瑣。不僅,要翻譯成每個國家的語言,而且,還要考慮英式英語和美式英語的區別分別翻譯成不同的英文版。再有,就是每次資料更新還都要重新翻譯一遍。

      編譯器與解釋器的區別和工作原理

      在上面的例子中,中國老師就像是編譯型語言的開發人員 , 中文資料就是編譯型語言的源代碼 , 翻譯后的資料就是不同CPU架構的機器語言 , 不同語言的學生就是不同CPU架構的機器 , 美國和英國的學生,就是CPU架構相同但操作系統不同的機器。

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

      提示:建議大家閱讀上述內容時,了解一下預處理器、鏈接器、庫文件(靜態鏈接庫和動態鏈接庫)的相關概念。

      我們繼續看剛才的例子 , 這位累得要死的中國老師,開始想辦法。他想,我干嘛自己去翻譯,給他們一人一個自動翻譯軟件不就好了?于是,老師就給每個學生定制了一個自動翻譯軟件,這個軟件能夠把一頁一頁的原始中文資料翻譯成不同的語言資料給學生看。現在的情況,這名老師工作會輕松很多,不需要再考慮制作各種語言版本的資料,只需要把精力放在制作中文資料就好了。

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

      源代碼無需預先編譯成可執行程序。在程序執行時,解釋器讀取一句源代碼之后,先進行詞法分析和語法分析,再將源代碼轉換為解釋器能夠執行的中間代碼(字節碼),最后,由解釋器將中間代碼解釋為可執行的機器指令。所以,編譯型語言的可執行程序產生的是直接執行機器指令,而解釋型語言的每一句源代碼都要經過解釋器解釋為可以執行的機器指令,相比之下解釋型語言的執行效率會低一些。

      但是,解釋型語言在不同的平臺有不同的解釋器,源代碼跨平臺的目的實現了,開發人員不用再考慮每個平臺如何去編譯,只需要關注代碼的編寫,編寫完的代碼在任何平臺都能無需修改(或少量修改)就能正確執行。例如,Linux系統中執行Python源代碼時支持 fork()函數,而window系統中不支持這個函數,如果將運行在Linux系統中的源代碼移植到Windows系統,這時就需要進行修改。

      理解了編譯型語言和解釋型語言的區別,我們繼續看例子。

      老師雖然給學生定制了翻譯軟件,但是發現這個軟件翻譯每頁內容都很慢,究其原因,這個軟件需要先把每頁內容分析一遍,將內涵復雜的中文(例如成語)轉換成簡單直接能夠直接進行翻譯的中文,再進行向其它國家語言的翻譯。

      看到這個問題之后,軟件的提供商想出了一個解決方案。這個方案就是:第一次打開資料時,讓翻譯軟件把原始資料完整的進行分析轉換,保存成一個能夠直接翻譯的中間文件;然后,翻譯程序再一頁一頁的讀取轉換后的中間文件去翻譯;這樣的話,雖然第一次打開時慢了些,但是,當學生再次打開 資料時,只要原始資料沒有更新,就直接通過保存的中間文件進行翻譯,速度會有很大提升。當然,程序打開時,需要對比一下原始資料是否和中間文件一致,如果有修改,則再次編譯出新的中間文件,覆蓋舊的中間文件。

      Python程序運行時,就像上面的例子一樣,先將源代碼完整的進行轉換,編譯成更有效率的字節碼,保存成后綴為“.pyc”的字節碼文件,然后,翻譯器再通過這個文件一句一句的翻譯為機器語言去執行。

      注意:Shell中執行源代碼時不會生成中間文件,每次都是讀取源代碼,轉化為字節碼后,解釋執行。

      上面的例子還沒結束。軟件供應商提出的方案雖然解決了一些效率問題,但是還無法完全讓人滿意。經過苦思冥想,軟件供應商又想出了一個新的方案。在原始資料中有很多重復的內容;這些重復的內容如果翻譯一次之后,就把它保存,再碰到相同的內容就直接使用保存的翻譯結果。而沒有必要每次都再翻譯。長時間運行程序時,速度就會快上很多。這個例子實際上就是JIT即時編譯器(Just-In-Time Compiler)的比喻。

      無論是使用解釋器進行解釋執行,還是使用編譯器進行編譯后執行,最終源代碼都需要被轉換為對應平臺的本地機器指令。那么,一些重復出現的代碼,就可以將其編譯為本地機器指令,重復使用,從而提高效率。這些重復出現的代碼包括多次調用的方法和多次執行的循環體。JIT即時編譯器比較典型的例子是在JVM(Java虛擬機)中。

      Java程序最初是通過解釋器進行解釋執行的,當Java虛擬機發現某個方法或代碼塊運行特別頻繁的時候,就會認為這是“熱點代碼”(Hot Spot Code)。JIT即時編譯器會將這些“熱點代碼”編譯成與本地機器相關的機器指令,進行各個層次的優化。

      當程序需要迅速啟動和執行的時候,解釋器可以首先發揮作用,省去編譯的時間,立即執行。在程序運行后,隨著時間的推移,編譯器逐漸發揮作用,把越來越多的代碼編譯成本地機器指令之后,可以獲取更高的執行效率。當程序運行環境中內存資源限制較大,可以使用解釋器執行節約內存,反之可以使用編譯執行來提升效率。

      大家都知道,Java程序的運行性能很高,基本上可以和C/C++的程序相媲美。這主要是因為JIT即 時編譯器可以針對那些頻繁被調用的“熱點代碼”做出深度優化,而靜態編譯器無法完全推斷出哪些是運行時的熱點代碼,而不能做出針對性的優化。因此,通過JIT即時編譯器編譯的本地機器指令才會比直接生成的本地機器指令擁有更高的執行效率。

      Python有多種解釋器,比較著名的有CPython、IPython、PyPy、Jython和IronPython 等, 其中CPython是Python官方默認的解釋器,它是用C語言實現Pyhon解釋器。CPython是單純的翻譯器,將源代碼轉化為字節碼之后解釋執行。而另外一款使用Python實現的Python解釋器PyPy,比CPython解釋器更加靈活。因為PyPy采用了JIT技術,在程序的運行性能上PyPy將近是CPython解釋器執行效率的1至5倍。而其它的解釋器都各有特點。

      IPython是基于CPython增強了交互 , Jython是運行在Java平臺上的Python解釋器 , IronPython是運行在.Net平臺上的Python解釋器。

      Python 面向對象編程

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:幼兒園級別的昇騰環境搭建教程--超級詳細
      下一篇:秒懂HTTPS接口(實現篇)
      相關文章
      亚洲AV综合色区无码一二三区| 亚洲人成图片网站| 亚洲欧美日本韩国| 国产v亚洲v天堂a无| 亚洲免费在线观看视频| 亚洲无限乱码一二三四区| 77777_亚洲午夜久久多人| 亚洲天堂久久精品| 亚洲一区影音先锋色资源| 久久久无码精品亚洲日韩蜜臀浪潮| 久久91亚洲精品中文字幕| 亚洲av中文无码乱人伦在线咪咕| 亚洲乱色熟女一区二区三区丝袜| 亚洲理论电影在线观看| 亚洲国产精品成人久久| 亚洲av午夜福利精品一区人妖| 国产亚洲人成网站观看| 亚洲AV无码一区东京热| 亚洲人成依人成综合网| 18gay台湾男同亚洲男同| 亚洲国产成人久久综合一区| 亚洲国产成人无码av在线播放 | 亚洲伊人久久大香线蕉啊| 亚洲中文字幕久久精品无码2021| 久久精品国产亚洲AV久| 亚洲精品国产高清在线观看| 香蕉视频亚洲一级| 国产av无码专区亚洲国产精品| 久久久久亚洲精品天堂久久久久久| 怡红院亚洲怡红院首页| 亚洲成亚洲乱码一二三四区软件| 911精品国产亚洲日本美国韩国| 精品亚洲AV无码一区二区| 亚洲AV色欲色欲WWW| 亚洲免费一区二区| 久久久久久亚洲精品中文字幕| 亚洲首页在线观看| 亚洲性色AV日韩在线观看| 亚洲福利精品一区二区三区| 亚洲午夜久久久久久噜噜噜| 亚洲情a成黄在线观看动漫尤物|