關於JAVA的可移植性

天 津 大 學 電 子 系 範 仲 方
(E-mail: [email protected])
概 述:Sun 的JAVA 技 術 的 強 大 的 可 移 植 性(portability) 主 要 表 現 在 三 個 各 自 獨 立 的 方 面。 本 文 討 論 了 這 三 種 可 移 植 性 的 特 點 和 它 們 的 不 足。

1. JAVA 作 爲 一 種 編 程 語 言: 源 代 碼 可 移 植 性
作 爲 一 種 編 程 語 言,JAVA 提 供 了 一 種 最 簡 單 同 時 也 是 人 們 最 熟 悉 的 可 移 植 性-- 源 代 碼 移 植。 這 意 味 着 任 意 一 個JAVA 程 序, 不 論 它 運 行 在 何 種CPU、 操 作 系 統 或JAVA 編 譯 器 上, 都 將 產 生 同 樣 的 結 果。 這 並 不 是 一 個 新 的 概 念。 人 們 使 用C、C++ 也 可 以 產 生 同 樣 的 效 果。 但 是 使 用C 或C++ 編 程 人 們 可 以 有 太 多 的 選 擇, 在 許 多 細 節 上 它 都 沒 有 嚴 格 定 義, 如: 未 初 始 化 變 量 的 值、 對 已 釋 放 的 內 存 的 存 取、 浮 點 運 算 的 尾 數 值 等 等。 所 以 除 非 你 一 開 始 就 嚴 格 按 照 系 統 無 關 的 概 念 來 進 行 設 計, 否 則 這 種 可 移 植 性 只 能 是 一 種 理 論 上 的 設 想 而 不 能 形 成 實 踐。 總 之, 盡 管C 和C++ 有 嚴 密 的 語 法 定 義, 它 們 的 語 意(symantics) 定 義 還 不 是 標 準 的。 這 種 語 意 上 的 不 統 一 使 得 同 一 段 程 序 在 不 同 的 系 統 環 境 下 會 產 生 不 同 的 結 果。 有 時 即 使 系 統 情 況 完 全 相 同 而 僅 僅 由 於 編 譯 器 的 設 置 不 同 也 會 產 生 令 人 意 想 不 到 的 結 果。 而JAVA 就 不 同 了。 它 定 義 了 嚴 密 的 語 意 結 構, 而 使 編 譯 器 不 承 擔 這 方 面 的 工 作。 另 外,JAVA 對 程 序 的 行 爲 的 定 義 也 比C 和C++ 嚴 格, 如: 它 提 供 了 內 存 自 動 回 收 功 能(Garbage Collection), 使 程 序 不 能 訪 問 越 界 內 存; 它 對 未 初 始 化 的 變 量 提 供 確 定 值 等 等。 它 的 這 些 特 性 能 夠 減 小 在 不 同 平 臺 上 運 行 的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 虛 擬 機(JAVA Virtual Machine), 而 不 是 某 一 實 際 的CPU。JAVA 虛 擬 機 能 掩 蓋 不 同CPU 之 間 的 差 別, 使J-Code 能 運 行 於 任 何 具 有JAVA 虛 擬 機 的 機 器 上。

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

作 爲 一 種 虛 擬 的CPU,JAVA 虛 擬 機 對 於 源 代 碼(Source Code) 來 說 是 獨 立 的。 我 們 不 僅 可 以 用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 程 序 有 很 大 的 差 別, 所 以 除 非 將 全 套Windows API 移 植 到 其 它 操 作 系 統 上, 否 則 重 編 譯 的 程 序 仍 不 能 運 行。

JAVA 採 用 了 提 供 一 套 與 平 臺 無 關 的 庫 函 數( 包 括AWT、UTIL、LANG 等 等) 的 方 法 來 解 決 這 個 問 題。 就 象JVM 提 供 了 一 個 虛 擬 的CPU 一 樣,JAVA 庫 函 數 提 供 了 一 個 虛 擬 的GUI 環 境。JAVA 程 序 僅 對JAVA 庫 函 數 提 出 調 用, 而 庫 函 數 對 操 作 系 統 功 能 的 調 用 由 各 不 同 的 虛 擬 機 來 完 成。JAVA 也 在 它 的OS/GUI 庫 中 使 用 了 一 種“ 罕 見 名 稱 符”(least-commom-denominator) 來 提 供 對 某 種 特 定 操 作 系 統 的 功 能 調 用, 即 此 功 能 只 在 特 定 環 境 下 生 效 而 在 其 它 操 作 系 統 下 則 被 忽 略。 這 樣 做 的 好 處 在 於 可 以 針 對 某 操 作 系 統 生 成 擁 有 人 們 熟 悉 的 界 面 的 應 用 程 序 而 同 時 此 程 序 又 能 在 其 它 系 統 下 運 行。 缺 點 則 是 系 統 中 的 某 些 功 能 調 用 有 很 強 的 依 賴 性 因 而 在JAVA 的 虛 擬OS/API 中 難 以 實 現。 遇 到 這 種 情 況, 程 序 員 就 只 能 寫 不 可 移 植 的 程 序 了。

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

作 者: 範 仲 方 天 津 大 學 電 子 工 程 系
地 址: 天 津 市 常 德 道24 號 郵 編:300050

摘自中國計算機世界日報

整理髮布

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章