轉載地址:http://blog.csdn.net/zv3e189os5c0tsknrbcl/article/details/78661641
有人在討論 Python 代碼是編譯執行還是解釋執行?這個問題還可以換一種說法: Python 是編譯型語言還是解釋型語言?回答這個問題前,我們先弄清楚什么是編譯型語言,什么是解釋型語言。
所謂編譯執行就是源代碼經過編譯器編譯處理,生成目標機器碼,就是機器能直接運行的二進制代碼,下次運行時無需重新編譯。不過它是針對特定CPU體系的,這些目標代碼只能在特定平台執行,如果這個程序需要在另外一種 CPU 上面運行,這個代碼就必須重新編譯。它不具備可移植性,但是執行速度快,C、C++這類語言屬於編譯型語言。
而解釋型語言是在代碼運行期間逐行翻譯成目標機器碼,下次執行時,還是需要逐行解釋,我們可以簡單認為 Java、Python 都是解釋型語言。
注:
有人說Java是編譯型的。因為所有的Java代碼都是要編譯的,.java不經過編譯就無法執行。
也有人說Java是解釋型的。因為java代碼編譯后不能直接運行,它是解釋運行在JVM上的,所以它是解釋型的。
所以很多地方都說“java是一種半編譯、半解釋執行”的語言;
對於C和C++,它們經過一次編譯之后,可以由操作系統直接執行,所以它們是編譯型語言。而Java不一樣,它首先由編譯器編譯成.class(字節碼)文件,然后在通過JVM從.class文件中讀一行解釋執行一行,所以它是解釋型的語言。也正是由於java對於多種不同的操作系統有不同的JVM,所以實現了真正意義上的跨平台。
編譯型相當於廚師直接做好一桌子菜,顧客來了直接開吃,而解釋型就像吃火鍋,廚師把菜洗好,顧客需要自己動手邊煮邊吃,效率上來說解釋型語言自然比不過編譯型語言,當然也不是絕對了,像 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實現跨平台),只能在兼容的操作系統上運行。
②解釋型:優點:可移植性較好,只要有解釋環境,可在不同的操作系統上運行。
缺點:運行需要解釋環境,運行起來比編譯的要慢,占用資源也要多一些,代碼效率低,代碼修改后就可運行,不需要編譯過程。