[深入理解Java虛擬機器]第六章 無關性的基石

Coding-lover發表於2015-10-20

如果計算機的CPU指令集只有x86一種 ,作業系統也只有Windows—種 ,那也許Java語言就不會出現 。 Java在剛剛誕生之時曾經提出過一個非常著名的宣傳 口 號 :“ 一 次 編 寫 ,到 處 運 行 ( Write Once,Run Anywhere ) ”,這句話充分表達了軟體開發人員對衝破平臺界限的渴求。在無時無刻不充滿競爭的IT領域,不可能只有Wintel存在,我們也不希望只有Wintel存 在 ,各種不同的硬體體系結構和不同的作業系統肯定會長期並存發展。“與平臺無關”的理想最終實現在作業系統的應用層上:Sun公司以及其他虛擬機器提供商釋出了許多可以執行在各 種不同平臺上的虛擬機器,這些虛擬機器都可以載入和執行同一種平臺無關的位元組碼,從而實現了程式的次編寫,到處執行”。

各種不同平臺的虛擬機器與所有平臺都統一使用的程式儲存格式— 位元組碼( ByteCode ) 是構成平臺無關性的基石,但本節標題中刻意省略了“平臺”二 字 ,那是因為筆者注意到虛擬 機的另外一種中立特性— 語言無關性正越來越被開發者所重視。到目前為止,或許大部分 程式設計師都還認為Java虛擬機器執行Java程式是一件理所當然和天經地義的事情。但在Java發展之初 ,設計者就曾經考慮過並實現了讓其他語言執行在Java虛擬機器之上的可能性,他們在釋出規範文件的時候,也刻意把Java的規範拆分成了Java語言規範《 The Java Language Specification》及Java虛奴機規範《 The Java Virtual Machine Specification》。並且在1997年釋出的第一版Java虛擬機器中就曾經承諾過 : “In the future,we will consider bounded extensions
to the Java virtual machine to provide better support for other languages” (在未來,我們會對Java 虛擬機器進行適當的擴充套件,以便更好地支援其他語言執行於JVM之 上 ),當Java虛擬機器發展到 JDK 1.7〜1.8的時候,JVM設計者通過JSR-292基本兌現了這個承諾。

時至今日,商業機構和開源機構已經在Java語言之外發展出一大批筆Java虛擬機器之上執行的語言,如Clojure、Groovy、JRuby、Jython、Scala等。使用過這些語言的開襲者可能還不是非常多,但是聽說過的人肯定已經不少,隨著時間的推移,誰能保證日後Java虛擬機器在語言無關性上的優勢不會趕上甚至超越它在平臺無關性上的優勢呢?

實現語言無關性的基礎仍然是虛擬機器和位元組碼儲存格式。Java虛擬機器不和包括Java在內的任何語言繫結,它只與“Class檔案”這種特定的二進位制檔案格式所關聯,Class檔案中包含了Java虛擬機器指令集和符號表以及若干其他輔助資訊。基於安全方面的考慮,Java虛擬機器規範要求在Class檔案中使用許多強制性的語法和結構化約束,但任一門功能性語言都可以表示 為一個能被Java虛擬機器所接受的有效的Class檔案。作為一個通用的、機器無關的執行平臺, 任何其他語言的實現者都可以將Java虛擬機器作為語言的產品交付媒介。例如 ,使用Java編譯 器可以把Java程式碼編譯為儲存位元組碼的Class文 件 ,使用JRuby等其他語言的編譯器_ 樣可以 把程式程式碼編譯成Class文 件 ,虛擬機器並不關心Class的來源是何種語言,如圖6-1所示。

Java語言中的各種變數、關鍵字和運算子號的語義最終都是由多條位元組碼命令組合而成的 ,因此位元組碼命令所能提供的語義描述能力肯定會比Java語言本身更加強大。因此,有一些Java語言本身無法有效支援的語言特性不代表位元組碼本身無法有效支援,這也為其他語言實現一些有別於Java的語言特性提供了基礎。

相關文章