JAVA可移植性廣泛應用

張繼123發表於2016-04-19

一、JAVA作為一種程式語言:原始碼可移植性
作為一種程式語言,JAVA提供了一種最簡單同時也是人們最熟悉的可移植性–原始碼移植。這意味著任意一個JAVA程式,不論它執行在何種CPU、作業系統或JAVA編譯器上,都將產生同樣的結果。這並不是一個新的概念。人們使用C、C++也可以產生同樣的效果。

但是使用C或C++程式設計人們可以有太多的選擇,在許多細節上它都沒有嚴格定義,如:未初始化變數的值、對已釋放的記憶體的存取、浮點運算的尾數值等等。所以除非你一開始就嚴格按照系統無關的概念來進行設計,否則這種可移植性只能是一種理論上的設想而不能形成實踐。

總之,儘管C和C++有嚴密的語法定義,它們的語意(symantics)定義還不是標準的。這種語意上的不統一使得同一段程式在不同的系統環境下會產生不同的結果。有時即使系統情況完全相同而僅僅由於編譯器的設定不同也會產生令人意想不到的結果。而JAVA就不同了。它定義了嚴密的語意結構,而使編譯器不承擔這方面的工作。

另外,JAVA對程式的行為的定義也比C和C++嚴格,如:它提供了記憶體自動回收功能(GarbageCollection),使程式不能訪問越界記憶體;它對未初始化的變數提供確定值等等。它的這些特效能夠減小在不同平臺上執行的JAVA程式之間的差異,也使得JAVA具有即使沒有JAVA虛擬機器的存在的情況下比C和C++更好的平臺無關性。

然而,這些特點也有它不利的一面。JAVA設想執行於具有32位位元組長度且每位元組為8位的計算機上,這就使得那些8位字長的計算機和一些巨型機不能有效的執行JAVA程式。在這樣的平臺上就只能執行那些可移植的C和C++程式了。
二、JAVA作為一個虛擬機器:CPU可移植性
大多數編譯器產生的目的碼只能執行在一種CPU上(如Intel的x86系列),即使那些能支援多種CPU的編譯器也不能同時產生適合多種CPU的目的碼。如果你需要在三種CPU(如x86、SPARC和MIPS)上執行同一程式,就必須編譯三次。

但JAVA編譯器就不同了。JAVA編譯器產生的目的碼(J-Code)是針對一種並不存在的CPU–JAVA虛擬機器(JAVAVirtualMachine),而不是某一實際的CPU.JAVA虛擬機器能掩蓋不同CPU之間的差別,使J-Code能執行於任何具有JAVA虛擬機器的機器上。

虛擬機器的概念並不是JAVA所特有的:加州大學幾年前就提出了PASCAL虛擬機器的概念;廣泛用於Unix伺服器的Perl指令碼也是產生與機器無關的中間程式碼用於執行。但針對Internet應用而設計的JAVA虛擬機器的特別之處在於它能產生安全的不受病毒威脅的目的碼。正是由於Internet對安全特性的特別要求才使得JVM能夠迅速被人們接受。當今主流的作業系統如OS/2、MacOS、Windows95/NT都已經或很快提供對J-Code的支援。

作為一種虛擬的CPU,JAVA虛擬機器對於原始碼(SourceCode)來說是獨立的。我們不僅可以用JAVA語言來生成J-Code,也可以用Ada95來生成。

事實上,已經有了針對若干種原始碼的J-Code編譯器,包括Basic、Lisp和Forth.原始碼一經轉換成J-Code以後,JAVA虛擬機器就能夠執行而不區分它是由哪種原始碼生成的。這樣做的結果就是CPU可移植性。

將源程式編譯為J-Code的好處在於可執行於各種機器上,而缺點是它不如本機程式碼執行的速度快。
三、JAVA作為一種虛擬的作業系統(OS)和圖形使用者介面(GUI):作業系統可移植性
即使經過重新編譯,大多數的用C和C++編寫的Windows程式也不能在Unix或Macintosh系統上執行。這是為什麼呢?因為程式設計師在編寫Windows程式時使用了大量的WindowsAPI和中斷呼叫,而Windows程式對系統功能的呼叫與Unix和Macintosh程式有很大的差別,所以除非將全套WindowsAPI移植到其它作業系統上,否則重編譯的程式仍不能執行。

JAVA採用了提供一套與平臺無關的庫函式(包括AWT、UTIL、LANG等等)的方法來解決這個問題。

就象JVM提供了一個虛擬的CPU一樣,JAVA庫函式提供了一個虛擬的GUI環境。JAVA程式僅對JAVA庫函式提出呼叫,而庫函式對作業系統功能的呼叫由各不同的虛擬機器來完成。

JAVA也在它的OS/GUI庫中使用了一種“罕見名稱符”(least-commom-denominator)來提供對某種特定作業系統的功能呼叫,即此功能只在特定環境下生效而在其它作業系統下則被忽略。

這樣做的好處在於可以針對某作業系統生成擁有人們熟悉的介面的應用程式而同時此程式又能在其它系統下執行。缺點則是系統中的某些功能呼叫有很強的依賴性因而在JAVA的虛擬OS/API中難以實現。遇到這種情況,程式設計師就只能寫不可移植的程式了。

總之,JAVA在可移植性方面的特點使它在Internet上具有廣泛的應用前景。同時它本身具有的防病毒的能力也使它在需要高可靠性的應用中佔有一席之、

相關文章