ios上的安卓虛擬機步驟:安卓虛擬機有哪些

看到Stackoverflow上有個問題在討論Java和Python的對比,其中就有人問答為啥Java的運行環境被稱之為JVM,而Python的只能叫做Interpreter。

憑啥Java的運行環境稱虛擬機,Python的只能稱解釋器

(題圖來自:gfi.com)

這個問題估計想過的人不多,先找維基百科看一下虛擬機的定義。

虛擬機的定義有2個,一種是類似Vmware的系統虛擬機,另一種是虛擬機稱之為程序虛擬機,諸如JVM,CLR就是最常見到的虛擬機。

程序虛擬機也稱作託管運行時環境,運行這個虛擬機時,就好比普通的OS中的一個進程。當這個進程啟動時,虛擬機啟動,當進程銷毀時,虛擬機銷毀。使用虛擬機的目的就是提供一個和平台無關的編程環境。

JVM中的執行引擎只能處理編譯後的Java位元組碼,位元組碼處理引擎其實包含一個位元組碼解釋器和一個JIT編譯器(和.net的CLR中JIT差別很大),解釋器逐條的執行位元組碼指令,速度稍慢。JIT編譯器則會將熱點代碼編譯緩存起來,因此執行速度加快。

解釋器的概念比較簡單,它可以將代碼翻譯,並運行,不需要經過編譯,JVM中的解釋器正式這樣的,JVM中解釋的就是位元組碼。解釋器運行程序的方法有3種:

  1. 直接運行高級編程語言(如Shell內置的解釋器)
  2. 轉換高級編程語言碼到一些有效率的位元組碼(Bytecode),並運行這些位元組碼
  3. 以解釋器包含的編譯器對高級語言編譯,並指示處理器運行編譯後的程序(例如:JIT)

其中Python的解釋器就是屬於第二種,Python代碼在首次運行時,它會將Python代碼編譯成位元組碼,如果可以的話,它會將這個位元組碼保存到.pyc文件中,這樣下次啟動的時候就不會再編譯這些代碼而是直接解釋運行位元組碼。事實上,這種機制正在模糊解釋器和編譯器之間的界限,或者說是模糊了解釋型語言和編譯型語言的界限。

通過JVM和解釋器的概念澄清,似乎還是不明白為啥JVM就被稱為虛擬機,JVM中有運行的是位元組碼,它可能直接被解釋執行,也可能被再次編譯成目標語言,Python中的解釋器也會先預編譯Python代碼為位元組碼,再解釋執行。那麼到底有啥區別?

很多人參與了討論,分別從不同的角度去闡述區別。

有人認為虛擬機是和語言無關的,JVM為例,除了Java之外,Scala,Clojure,甚至Python藉助於Jython工具,也可以運行在JVM上,而沒聽說什麼語言能有Python解釋器解釋執行,除了Python。

也有人從語言的類型上,Java為靜態類型的語言,而Python為動態語言。這使得Java位元組碼既可以被解釋執行也可以被編譯成機器指令再執行。而Python則複雜多了,它雖然讓程序員可以不去關注變量的類型,但解釋器不得不去推斷數據類型,這一定程度上影響性能。

還有觀點認為解釋器是一個歷史遺留術語,現代語言中虛擬機和解釋器的分界已經很模糊甚至不存在。

事實上,筆者在《Learning Python》一書中,看到把作者把Python的解釋器稱為PVM,基於這個事實來講,本人更認同的是解釋器和虛擬機的區別正在越來越小,已經是我中有你,你中有我的地步。獨立的分割來看,可能還能區分這幾步是解釋器行為,這幾步是虛擬機的行為,但是作為一個整體來看,兩者的區別確實沒那麼明顯。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/225957.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:47
下一篇 2024-12-09 14:47

相關推薦

發表回復

登錄後才能評論