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