轉載地址:http://blog.csdn.net/zv3e189os5c0tsknrbcl/article/details/78661641java
有人在討論 Python 代碼是編譯執行仍是解釋執行?這個問題還能夠換一種說法: Python 是編譯型語言仍是解釋型語言?回答這個問題前,咱們先弄清楚什麼是編譯型語言,什麼是解釋型語言。編程
所謂編譯執行就是源代碼通過編譯器編譯處理,生成目標機器碼,就是機器能直接運行的二進制代碼,下次運行時無需從新編譯。不過它是針對特定CPU體系的,這些目標代碼只能在特定平臺執行,若是這個程序須要在另一種 CPU 上面運行,這個代碼就必須從新編譯。它不具有可移植性,可是執行速度快,C、C++這類語言屬於編譯型語言。jvm
而解釋型語言是在代碼運行期間逐行翻譯成目標機器碼,下次執行時,仍是須要逐行解釋,咱們能夠簡單認爲 Java、Python 都是解釋型語言。spa
注:操作系統
有人說Java是編譯型的。由於全部的Java代碼都是要編譯的,.java不通過編譯就沒法執行。.net
也有人說Java是解釋型的。由於java代碼編譯後不能直接運行,它是解釋運行在JVM上的,因此它是解釋型的。翻譯
因此不少地方都說「java是一種半編譯、半解釋執行」的語言;3d
對於C和C++,它們通過一次編譯以後,能夠由操做系統直接執行,因此它們是編譯型語言。而Java不同,它首先由編譯器編譯成.class(字節碼)文件,而後在經過JVM從.class文件中讀一行解釋執行一行,因此它是解釋型的語言。也正是因爲java對於多種不一樣的操做系統有不一樣的JVM,因此實現了真正意義上的跨平臺。blog
編譯型至關於廚師直接作好一桌子菜,顧客來了直接開吃,而解釋型就像吃火鍋,廚師把菜洗好,顧客須要本身動手邊煮邊吃,效率上來講解釋型語言天然比不過編譯型語言,固然也不是絕對了,像 JIT 的效率就很高資源
以上是對編譯型語言和解釋型語言的一個簡單粗暴的區分,可是 Python(這裏主要是指CPython)並非嚴格的解釋型語言,由於 Python 代碼在運行前,會先編譯(翻譯)成中間代碼,每一個 .py 文件將被換轉成 .pyc 文件,.pyc 就是一種字節碼文件,它是與平臺無關的中間代碼,無論你放在 Windows 仍是 Linux 平臺均可以執行,運行時將由虛擬機逐行把字節碼翻譯成目標代碼。
咱們安裝Python 時候,會有一個 Python.exe 文件,它就是 Python 解釋器,你寫的每一行 Python 代碼都是由它負責執行,解釋器由一個編譯器和一個虛擬機構成,編譯器負責將源代碼轉換成字節碼文件,而虛擬機負責執行字節碼,因此,解釋型語言其實也有編譯過程,只不過這個編譯過程並非直接生成目標代碼,而是中間代碼(字節碼),而後再經過虛擬機來逐行解釋執行字節碼。
總結
Python代碼首先會編程一個字節碼文件,再由虛擬機逐行解釋,把每一行字節碼代碼翻譯成目標指令給CPU執行。
編譯型語言和解釋型語言的優缺點:
編譯型語言在程序執行以前,有一個單獨的編譯過程,將程序翻譯成機器語言就不用再進行翻譯了。
解釋型語言,是在運行的時候將程序翻譯成機器語言,因此運行速度相對於編C/C++ 等都是編譯型語言,而Java,C#等都是解釋型語言。
雖然Java程序在運行以前也有一個編譯過程,可是並非將程序編譯成機器語言,而是將它編譯成字節碼(能夠理解爲一箇中間語言)。在運行的時候,由JVM將字節碼再翻譯成機器語言。
注:腳本語言通常都有相應的腳本引擎來解釋執行。 他們通常須要解釋器才能運行。JAVASCRIPT,ASP,PHP,PERL,Nuva都是腳本語言。C/C++編譯、連接後,可造成獨立執行的exe文件。
①編譯型:優勢:運行速度快,代碼效率高,編譯後的程序不可修改,保密性較好。
缺點:代碼須要通過編譯方可運行,可移植性差(java可移植性好,java利用jvm實現跨平臺),只能在兼容的操做系統上運行。
②解釋型:優勢:可移植性較好,只要有解釋環境,可在不一樣的操做系統上運行。 缺點:運行須要解釋環境,運行起來比編譯的要慢,佔用資源也要多一些,代碼效率低,代碼修改後就可運行,不須要編譯過程。