JAVA的可移植性
JAVA在可移植性方面的特點使它在Internet上具有廣泛的應用前景。同時它本身具有的防病毒的能力也使它在需要高可靠性的應用中佔有一席之地。
作為一種程式語言:原始碼可移植性
作為一種程式語言,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++程式了。
作為一個虛擬機器:CPU可移植性
大多數編譯器產生的目標程式碼只能執行在一種CPU上(如Intel的x86系列),即使那些能支援多種CPU的編譯器也不能同時產生適合多種CPU的目的碼。如果你需要在三種CPU(如x86、SPARC和MIPS)上運行同一程式,就必須編譯三次。
但JAVA編譯器就不同了。JAVA編譯器產生的目的碼(J-Code)是針對一種並不存在的CPU–JAVA虛擬機器 (JAVAVirtualMachine),而不是某一實際的虛擬機器能掩蓋不同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的好處在於可運行於各種機器上,而缺點是它不如本機程式碼執行的速度快。
作為一種虛擬的作業系統(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可移植性的應用
AVA可移植性廣泛應用。軟體可移植性指與軟體從某一環境轉移到另一環境下的難易程度。為獲得較高的可移植性,在設計過程中常採用通用的程式設計語言和執行支撐環境。儘量不用與系統的底層相關性強的語言。下面介紹JAVA -
java的可拓展性
下面我將以兩個例子來充分闡述java中多型的可拓展性,作為一名優秀的程式設計師,就必須瞭解程式的可拓展性,非常利於程式後續的開發。 第一個例子:利用電腦的主機板來作為例子,就我們所熟悉的電腦的主機板,裡面是不是有很多模組,網 -
經典Java面試題之Java中Char型別的運算
char在java中稱為字元型,佔2個位元組。本文是本站小編搜尋整理的關於經典Java面試題之Java中Char型別的運算,有需要的小夥伴可以參考一下,希望對大家有所幫助!想了解更多相關資訊請持續關注我們應屆畢業生考試網! [面試 -
JAVA認證開源技術:關於Java的物件equals方法
在學習JAVA認證過程中,每個人會遇到每個人不同的問題,或小或大,下面yjbys小編為大家分享的是關於Java的物件equals方法,希望對大家學習JAVA有幫助!不是所有的equals都是比較整個物件的。 #1.普通Object類:先看原始碼:publi -
Java類庫及其組織結構(Java API)
Java語言是一種適用於網路程式設計的語言,它的基本結構與C++極為相似,但卻簡單得多。下面小編給大家分享Java類庫及其組織結構(Java API),歡迎大家閱讀!更多相關資訊請關注相關欄目!Java 官方為開發者提供了很多功能強大的類,這 -
Java替代C語言的可能性有多大
Java是一個面向物件的程式語言,容易理解。很多人會問那麼Java會不會代替C語言呢?小編收集了以下的相關回答,歡迎閱讀!CSDN曾經刊登了一篇《C語言已經死了》的文章,引起了一些爭論。其實那篇文章是從Ed Buette的部落格上轉載 -
Java 8中你可能沒用過的10個特性
lambda表示式,lambda表示式,還是lambda表示式。一提到Java 8就只能聽到這個,但這不過是其中的一個新功能而已,Java 8還有許多新的特性——有一些功能強大的新類或者新的用法,還有一些功能則是早就應該加到Java裡了。這裡我 -
Java 2.1 java基本型別的轉換和運算子
導語:Java是一門面向物件程式語言,不僅吸收了C++語言的各種優點,還摒棄了C++裡難以理解的多繼承、指標等概念,因此Java語言具有功能強大和簡單易用兩個特徵。下面我們來看看Java 2.1 java基本型別的轉換和運算子,希望對大 -
JavaScript與java語言的區別
java和JavaScript是兩個不同的語言。那麼這兩個語言有什麼不同呢?下面是小編為大家整理的JavaScript與java語言的區別,歡迎參考~ 1 語言特點:1.1 弱型別:JavaScript在變數宣告的時候並不嚴格區分資料型別,(var 變數名) -
Java認證考試知識點:Java時間類的函式
學習是一條慢長而艱苦的道路,不能靠一時激情,也不是熬幾天幾夜就能學好的`,必須養成平時努力學習的習慣,Java也不例外,下面小編為大家整理了Java裡時間類以及函式的相關文章: 1Calendar和Date的轉化(1)Calendar轉化