關於JAVA的可移植性(轉)
關於JAVA的可移植性(轉)[@more@] 概述:Sun的JAVA技術的強大的可移植性(portability)主要表現在三個各自獨立的方面。本文討論了這三種可移植性的特點和它們的不足。
1.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++程式了。
2.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的好處在於可執行於各種機器上,而缺點是它不如本機程式碼執行的速度快。
3.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上具有廣泛的應用前景。同時它本身具有的防病毒的能力也使它在需要高可靠性的應用中佔有一席之地。
1.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++程式了。
2.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的好處在於可執行於各種機器上,而缺點是它不如本機程式碼執行的速度快。
3.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上具有廣泛的應用前景。同時它本身具有的防病毒的能力也使它在需要高可靠性的應用中佔有一席之地。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-959723/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ANSI C定義的一些關於可移植性的術語說明
- 關於SAP的故事(轉)
- 可移植性
- java 關於fileinputstream的使用Java
- (轉)git中關於fetch的使用Git
- 求 PHP 轉 java 的相關教程PHPJava
- 關於java.net.URLEncoder.encode()將空格轉成+問題Java
- 關於Java的File.separatorJava
- 關於Java中的equals方法Java
- 關係錶轉dooris 的java 指令碼Java指令碼
- 關於轉儲Oracle索引資訊的相關命令Oracle索引
- Java-關於ThreadJavathread
- 關於Java中的@Deprecated註解Java
- 關於Java中的反射機制Java反射
- 關於 Java 中的 RMI-IIOPJava
- Java 中關於protected的介紹Java
- 【主流技術】日常工作中關於 JSON 轉換的經驗大全(Java)JSONJava
- 關於Java中進位制轉換以及位運算問題Java
- 關於資料隱私的文化轉變
- 關於java中的i++和++iJava
- 關於java中的類載入器Java
- 關於Java異常的分類示例Java
- Java基礎7:關於Java類和包的那些事Java
- 關於java的引用和c++的區別JavaC++
- 關於Java的取時間方法的爭論Java
- Java關於IO的一個小工具Java
- 關於Java兩點需要更新的知識Java
- Java--- 關於null的處理若干方法JavaNull
- 關於Java中的類和物件筆記Java物件筆記
- 關於java中Excel的匯入匯出JavaExcel
- 關於JAVA中順序IO的基本操作Java
- 一個關於JAVA GC的小實驗JavaGC
- Java 面試題關於方法的重寫Java面試題
- 關於Java註解(annotation)的簡單理解Java
- 關於MongoDB的簡單理解(二)--Java篇MongoDBJava
- 關於 a 標籤跳轉問題
- 說說你對程式碼可移植性的理解
- 關於單連結串列反轉的一點整理
- WebSecurityConfigurerAdapter 關於成功之後頁面跳轉的配置WebAPT