虛擬機器補充

但是,虛擬碼的執行仍然比直譯的方式快上許多,直譯式語言需要解譯樹狀結構,但虛擬機器則只需要解譯虛擬碼,由於虛擬碼通常相當接近機器語言,因此,其解譯速度通常仍較直譯快上數倍到十倍之多,像是 Java 的 JVM 虛擬機就一個虛擬碼的直譯器。

虛擬機器調和了直譯與編譯這兩種極端的情形,讓程式語言既富有彈性,又能快速的執行,採用編譯與直譯的混和方式,就可以讓兩者達成一個平衡,這點在 Java 語言上表現的特別明顯。Java 採用了虛擬機器的技術,先將 Java 程式編譯為中間碼 bytecode,然後再利用虛擬機器 JVM 執行此中間碼,由於中間碼是經過編譯的二進位形式,非常類似機器碼,因此,執行速度會比直譯式快上許多。甚至,在 Java 當中,更使用即時編譯技術 (Just in Time Compiler) (JIT),讓 bytecode 的執行速度進一步提升,使其速度能逼近編譯式的速度,據昇陽公司的實驗數據顯示,JIT 的方法只比編譯式的 C 語言慢一倍,而非像一般直譯式語言,可能慢上數十倍。

近來,微軟公司甚至擴充其 .NET 平台的虛擬機器 Common Language Runtime (CLR),成為可以直接執行 Python、Ruby等動態語言的虛擬機 Dynamic Language Runtime (DLR),這應該會讓這些動態語言的速度進一步的提高,讓這些語言的執行速度追上 Java與 C# 等語言,像是 IronPython 與 IronRuby 就是此一行動下的產品。

虛擬機器的想法並不是由昇陽公司在 Java 上所創造出來的,早在 1966 年的BCPL (Basic Combined Programming Language) 語言上,就使用了一種稱為 O-code 的中間碼在虛擬機上執行,後來Pascal 與 Smalltalk 則都曾使用P-Code 這種虛擬碼在虛擬機上執行。但是,Java 的成功使得許多商業公司重新注意到虛擬機的潛力,並讓虛擬機的概念得以在商業軟體上蓬勃的發展。近來,除了 JVM 與 .NET 的 CLR 兩個虛擬機之外,還有許多用途甚廣的虛擬機器出現,像是 VM Ware、Virtual PC、Virtual Box 等虛擬機??這種虛擬機器應該是模擬器,模擬的是真正存在的硬體,和前面談的虛擬機器不一樣,放在一起談很奇怪??,就常被用來在實體電腦中創造出許多可以同時執行的虛擬電腦,例如使用者可以在 Windows XP 當中安裝 VMWare 後,再安裝 Linux,於是就得到一台同時可以執行 Windows XP 與 Linux 的電腦,類似這樣的虛擬機器應用已經越來越常見了。在本書的第10章當中,我們將詳細的討論有關虛擬機器的主題。

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License