Java、Python分別是解釋型還是編譯型語言?
python 解釋型(函式寫在呼叫前)
java 編譯型(請求次數多)+解釋型(請求次數少)
解釋性語言定義:
程式不需要編譯,在執行程式的時候才翻譯,每個語句都是執行的時候才翻譯。這樣解釋性語言每執行一次就需要逐行翻譯一次,效率比較低。
現代解釋性語言通常把源程式編譯成中間程式碼,然後用直譯器把中間程式碼一條條翻譯成目標機器程式碼,一條條執行。
編譯性語言定義:
編譯性語言寫的程式在被執行之前,需要一個專門的編譯過程,把程式編譯成為機器語言的檔案,比如exe檔案,以後要執行的話就不用重新翻譯了,直接使用編譯的結果就行了(exe檔案),因為翻譯只做了一次,執行時不需要翻譯,所以編譯型語言的程式執行效率高。
Python工作過程:
python 是解釋型的程式語言。也可以把python指令碼編譯成pyc檔案,不然編譯後也是一種python虛擬指令,在python中執行。
Python先把程式碼編譯成位元組碼,在對位元組碼解釋執行。位元組碼在python虛擬機器程式裡對應的是PyCodeObject物件,pyc檔案是位元組碼在磁碟上的表現形式。
pyc的建立時機是模組載入的時候,即import。
python test.py會對test.py進行編譯成位元組碼並解釋執行,但是不會生成test.pyc。
Java工作過程:
JAVA的第一道工序是javac編譯,當然目標檔案是BYTECODE(位元組碼)。後續可能有三種處理方式:
1. 執行時,BYTECODE由JVM逐條解釋執行;
2. 執行時,部分程式碼可能由JIT翻譯為目標機器指令(以method為翻譯單位,還會儲存起來,第二次執行就不用翻譯了)直接執行;
3. RTSJ。繼JAVAC之後執行AOT二次編譯,生成靜態的目標平臺程式碼(典型的就是IBM WEBSHPERE REAL TIME)。
其實,現在用編譯型、解釋型來分類程式語言已經有點力不從心了。總體來講,java的編譯結果是被jvm“解釋執行”的,所以這麼說也能說通,而其實這個“是編譯還是解釋”這個概念在這裡已經有點模糊了,理解它的過程就行了,不必下一個“精確”的定義;
而我自己仍然贊成“java是編譯型語言
位元組碼和機器碼:
位元組碼和機器碼(或者native code)的區別:
C程式碼被編譯成機器碼,將在處理器上直接執行。每一條指令控制CPU工作。
Java程式碼被編譯成位元組碼,將在Java虛擬機器(JVM)這個抽象的計算機上執行。每一條指令由JVM處理,JVM同計算機本身之間互動。
簡而言之:機器碼快的多,但位元組碼更易遷移,也更安全。
Java-JIT:
大家都知道本地機器碼的速度比位元組碼的速度快很多。那麼,如果我們能將一些位元組碼直接編譯成本地機器碼再去執行它會怎樣呢?我們必須花費一些代價(比如時間)在編譯位元組碼到本地機器碼上,如果最終的執行時間更快,那麼這個代價就是值得的。這就是JIT編譯器的動機,一種混合瞭解釋器和編譯器好處的技術。簡單來講,JIT就是想通過編譯技術提升指令碼直譯器系統的速度。
例如, 被JIT(及時編譯)採用的通用方法:標識被經常執行的位元組碼;把其編譯成本地的機器碼;快取該結果;當同樣的的位元組碼再次被執行的時候,會取預編譯的機器碼,得到好處(例如速度提升)。
PyPy:
把JIT代入Python語言 (參看前面成果的附錄).當然也有其他目的: PyPy 目標是成為一個跨平臺,輕記憶體,支援stackless(譯註:stackless為python提供微執行緒擴充套件,具有併發特性)。 但是及時編譯才是它真正的賣點。 基於一系列時間測試的平均, 據說效能上能提高6.27倍。