JPython訪談錄:從JPython到Jython
盡管 JPython 是一個真正面向社區的成果,但 Barry Warsaw 和 Finn Bock 是當前兩名最活躍的 JPython 開發者。不幸的是,JPython 最初的開發者 Jim Hugunin 不再從事其開發了。
David Mertz:究竟什么是 JPython?
Barry Warsaw:我將用標準的營銷說法來回答這個問題。
JPython 是 Python 編程語言的 100% 純 Java 實現。它可以讓用戶將 Python 源代碼編譯成 Java 字節碼,并在任何 Java 虛擬機上運行產生的字節碼。它是與 Java 的最無縫最平滑的集成。您可以從 Python 訪問所有 Java 庫、構建 Applet、與 Java Bean 集成以及從 Python 中的 Java 類創建子類,反之亦然。JPython 類似于 Python 而不象 Java,它可以交互使用;只需在提示上輸入一些 JPython 代碼就能立刻看到結果。
用更簡單的話來說,JPython 可以為任何一個您需要的 Java 代碼編寫腳本,這樣轉換出的代碼行數比原來要少上 2 到 10 倍。因為 Python 是動態輸入的語言,所以可以更快速地開發錯誤更少的應用,并得到靈活得多的程序。
Mertz:有關 JPython 的開發是如何開始的呢?
Warsaw :JPython 是由 Jim Hugunin 發明的,他現在為 Xerox PARC 的 Aspect Oriented Programming 項目工作。我了解 Jim,他可能主要是對挑戰感興趣。Python 領域中有許多人都認為這是不可實現的。Guido 自己就是一個懷疑論者。Jim 證明他們都錯了!
那么既然遇到挑戰,為什么還要繼續開發 JPython 呢?因為它是大多數 Java 程序員不太了解的最有價值的 Java 工具。到目前為止!
Mertz:您認為是什么刺激了 JPython 的需求?
Warsaw :首先必須理解 JPython 不是 Java 的競爭對手;而是對它的***補充。Java 是靜態輸入的編譯語言。這確保了庫的輸入很安全并且執行速度更快。有一個現象很有趣,就是盡管它是字節碼翻譯的,但大多數人還是將 Java 看作一個傳統的“編寫-編譯-運行-編輯”的程序。當然,Java 利用了軟件世界的絕大部分,因此對于 Java 程序員有許多資源可用。
但相同的靜態輸入和傳統的編程周期在人力資源方面增加了 Java 應用開發的成本。Python 在這方面絕對勝出。因為 Python 是一種小而簡單的語言,所以非常易于掌握。大多數有經驗的程序員可以在大約一天的時間內就學習到足夠的 Python 知識來提高生產力。Python 的設計思想就是代碼的讀比寫要多得多。因此 Python 源代碼易于在大型團體項目中共享。
但更重要的是,Python 是非常高級的動態輸入型語言。這表現在大大節約了執行任務所需的代碼數量。因為使用 Python 所寫的代碼行數較少,可以寫得更快,錯誤更少。對于快速應用開發這簡直太棒了。
Python 還提供一個交互式解釋器,這意味著您可以坐在解釋器提示,導入 Java 代碼,創建 Java 類實例,進行方法調用等等,所有這些都是交互式的。這在訓練程序員如何使用公司 Java 庫或者試驗新 Java API 時是一種***工具。
但以我拙見,所有程序員都應該備有 CPython 和 JPython。
Mertz :照您看,JPython 比 CPython 好在哪里呢?
Bock :JPython 提供了對其底層實現語言的完整訪問。在大多數(可能所有)基于 C 的腳本語言中,C 函數必須封裝在用來將 C 函數暴露給腳本語言的一層簡單的代碼中,這里存在一些好的工具,例如 SWIG,來將這個封裝器代碼的創建自動化。但 JPython 根本就不需要封裝器。所有曾經編寫過的 Java 代碼都可直接從 JPython 使用,集成是雙向的。以 JPython 定義的類和實例可以傳遞給 Java,就如同它們是一般的 Java 類和實例那樣(它們也確實如此)。
嵌入/擴展 API 使從應用程序或模塊中對 JPython 對象的訪問相當精確。這一優點部分來自于 JPython 和 Java 都是面向對象的語言這一事實。Jim 利用了該事實的這一重要優點。
Warsaw :CPython 欠缺的是對世界上大量 Java 代碼的訪問。如果需要使用 Java 庫,JPython 就是答案。反過來說,當然,JPython 也沒有對世界上所有現有 C 庫的簡易訪問。Finn 已完成了通過 JNI 集成如 Tkinter 和 POSIX 模塊這類事物的工作,但那些在 JPython 中總是非標準的,因為我們希望保留 100% 純 Java 認證。
Mertz:依您所見,JPython 的缺點有哪些呢?
Finn Bock :JPython 只提供對 Java 代碼的訪問,而不提供對所有現有 C 模塊的訪問。因此每個以 C 實現的 Python 模塊都必須用 Java 重新實現。而 CPython 則有許多模塊。
另外,對于嵌入/擴展 API,除了源代碼之外沒有任何文檔。
Mertz :您是否在尋找 JPython 優于純 Java 的優點?
Warsaw :我想我們已經談了許多這方面的內容。但現在讓我們談談 JPython 的性能問題。因為 JPython 實現了 Python 的動態語義,所有 JPython 帶有相當廣泛的運行時。這對于某些應用程序有性能影響。例如即時編譯器和 Hotspot 技術這樣的標準 Java 優化可以大大減輕這樣影響(八個月前的基準顯示,使用支持 JIT 的 JVM,JPython 1.1 可以達到,有時還會超過 CPython 1.5.2 速度)。我們將更新這些基準結果,并在推出 JPython 之后集中在性能問題上。
但與 CPython 一樣,您總能用 Java 重寫應用程序中的性能關鍵部分。
Mertz:您認為 JPython 的使用有多廣泛?
Warsaw :我想它的使用正在變得越來越廣泛。人們逐漸發現它對于技術成功非常關鍵。JPython 對于各種任務都有價值,從為最終用戶提供平易近人的腳本創建環境,到簡化為 Java 庫和應用程序創建測試框架。此時 JPython ***的遺憾就是它需要更多宣傳。我希望這篇文章能在這一方面提供幫助。
Mertz :您是否認為 JPython 是試圖跟上 CPython 的嘗試?
Bock :是的。現在,JPython 正嘗試趕上它。幾乎所有新的特性都首先添加到 CPython。(當然,JPython 確實在 CPython 之前具有字符串方法)。JPython 有不足之處是因為 CPython 比 JPython 有多 15 倍的核心開發者。但即使這樣,JPython 版本中存在 CPython 2.0 中幾乎所有新的特性。
但我認為實際上它們幾乎不相上下,即使在現實世界中,誰也不比誰好多少。
Warsaw :我堅決相信在語言級別上,JPython 和 CPython 應該完全兼容。在不可能的情況下,Guido 確定差異是否與實現相關,或者哪一種實現是“多錯”的。我希望看到 CPython 和 JPython 最終成為同等的,JPython 在某些方面推動 CPython 開發和 CPython 推動 JPython 開發一樣。
當前它的一個示例就是 Unicode 支持。JPython 已經是全部 Unicode 化了。另一個示例是類型/類劃分。在 CPython 中,您可以有一些內置類型,例如字符串、字典、列表和數。還有類和實例。內置類型不能繼承。更讓人困惑的一點是,實例既有類型又有類。首先彌補 JPython 中的這一缺憾更容易些,因為其面向對象實現。
Mertz :對于 JPython 和 CPython 之間的不兼容性您是怎么認為的?
Warsaw :在事物工作的方法上有許多細小的差異。它們都在 JPython 的文檔中進行了大致說明。某些作為提供語言定義的可接受差異分類,某些指出某個或其它實現應該被修正的地方。大多數都非常次要。
Bock :某些模塊還沒有或者無法以 JPython 實現。某些模塊又只能作為 JNI 模塊實現,類似的模塊在部署環境中是沒有用的。
Bock :實際上,當我移植自己的腳本和程序(與 IDLE、PySol 和 PMW 工具箱一起)時,我遇到的問題不是無用信息收集的隨機回收或缺少 _del_method。它們是其他人以前沒有遇到過的小問題,例如 CPython 行為。
Warsaw :下一個版本的 JPython 將與 Python 2.0 語言定義兼容,因此***的變化將在庫中。CPython 發行版中任何以純 Python 編寫的標準庫模塊都應該是可移植的。C 擴展模塊不行,除非它們特別通過 JNI 網橋集成或以 Java 重新實現。任何大量使用 Java API 的 JPython 應用程序在移植回 CPython 時都將經過一段艱難時期。
另一方面,兩種系統的庫中有許多公共功能。在有足夠深謀遠慮的前提下,可以將兼容性層構建到應用程序中。
Mertz :對于 JPython 今后的方向有什么想法嗎?
Warsaw :我們已經基于公用 JPython 1.1 發行版創建了 JPython 后繼者 "Jython"。這樣做是為了確保項目的長久性和穩定性。依據 CNRI 的 JPython 1.1.x 許可證實現了所有這些。我們將整個開發過程移到了 SourceForge,并使用對 CPython 非常合適的相同開放過程管理它。Finn 和我兩人無疑要參與 Jython 未來的開發;Jython 將使用 OSI 核準的 CPython 2.0 許可證發行。它與您將獲得的“正式”派生很接近,所以當前的 JPython 社區應該確信 Jython 與它永遠不會相差太多。我們希望它們最終都能遷移到 Jython。
現在代碼仍處在試驗階段,但 Finn 和我將為 Jython 2.0 發行版(已經包含了 Finn 的勘誤表)致力于建立幾個技術性里程碑。CPython 2.0 具有增強的指派和擴展打印等特性(很快還將帶有列表理解)。我們已集成了免費的 Apache Jakarta OROMatcher 代碼,消除了雙許可證的需要,并修正了許多錯誤。我不知道 Jython 2.0 的***個 alpha 發行版何時出現,但當前所有代碼都在 SourceForge CVS 樹中獲得。
【編輯推薦】