用 Python 將一切粘合在一起
用 Python 將一切粘合在一起
Guido van Rossum
CNRI
1895 Preston White Drive
Reston, VA 20191
電子郵件:guido@cnri.reston.va.us, guido@python.org為 OMG-DARPA-MCC 組合式軟體架構研討會 撰寫的立場檔案,1998 年 1 月 6-8 日,加利福尼亞州蒙特雷。
簡介
Python 是一種高階指令碼語言,它被成功地用於將大型軟體元件粘合在一起。它跨越多個平臺、中介軟體產品和應用領域。Python 是一種面向物件的語言,具有高階資料結構、動態型別和動態繫結。Python 自 1991 年以來一直存在,並且擁有非常活躍的使用者社群。有關更多資訊,請訪問 Python 網站 https://python.club.tw。
像 Tcl 一樣,Python 可以很容易地使用 C/C++/Java 程式碼進行擴充套件,並且可以很容易地嵌入到應用程式中。Python 甚至使用 Tk(Tcl GUI 工具包)作為事實上的標準行動式 GUI 工具包。然而,與 Tcl 不同的是,Python 支援面向物件程式設計。Python 程式設計師可以建立類、使用多重繼承、定義方法、過載運算子等等。
Python 的優勢
在語法上,Python 程式碼看起來像可執行的虛擬碼。使用 Python 進行程式開發比使用 C/C++ 快 5-10 倍,比使用 Java 快 3-5 倍。在許多情況下,可以使用 Python 編寫應用程式原型,而無需編寫任何 C/C++/Java 程式碼。通常,原型具有足夠的功能並且效能足夠好,可以作為最終產品交付,從而節省大量開發時間。其他時候,原型可以部分或全部翻譯成 C++ 或 Java -- Python 的面向物件性質使翻譯過程變得簡單明瞭。
最好的方法通常是在 C++ 或 Java 中只編寫應用程式的效能關鍵部分,並使用 Python 進行所有更高級別的控制和自定義。有一些關於應用程式的軼事,這些應用程式最初是純 C++ 程式碼,後來添加了 Python 作為擴充套件語言,在每個新版本中,用 Python 編寫的應用程式的百分比都在增加,同時也提高了應用程式的整體效能、功能和可靠性。(例如,案例研究:Greg Stein,微軟,在 第六屆國際 Python 會議的論文集 中撰寫的 “商業環境中的 Python”,以及 UvA 和 CMU 的 Alice VR 專案。)
Python 在 Web 上有很強的影響力。它適用於 CGI 程式設計(在所有平臺:Unix、Windows 和 Mac 上);它有到所有主要商業資料庫的介面。Python 有一個介面到主要的 Internet 和 Web 協議的庫,並且具有 HTML 解析和生成工具包。當 Infoseek 規模較小時,Python 是其主要實現語言。至少有一家公司(Digital Creations)正在使用 Python 銷售一套伺服器端工具。最後,Python 已被用於實現 Web 瀏覽器 (Grail)。
Python 在分散式系統領域也很有代表性。它是 Xerox PARC 的 ILU(跨語言統一;一種與 CORBA 相容的分散式物件系統)支援的主要語言之一,並且許多分散式應用程式都是使用 ILU 在 Python 中構建的。Python 也被澳大利亞昆士蘭大學的 Hector 專案使用。
最後,Python 與 Windows 平臺很好地整合在一起。Python 程式可以與 COM 和 DCOM 服務互動,甚至可以實現新的 COM 和 DCOM 服務(這在使用 Visual Basic 時是不可能的!)。Python 還可以用作 Microsoft Active Scripting 架構中的指令碼引擎。
將 Python 用作整合語言
與本次研討會的主題相關,Python 在許多地方被用作整合語言,用於將現有元件粘合在一起(“指導”)。這裡的策略是建立 Python 擴充套件模組(用 C/C++ 編寫),使 C/C++ 編寫的大型元件的功能可供 Python 程式設計師使用。需要擴充套件(“粘合”)模組,因為 Python 不能直接呼叫 C/C++ 函式;粘合擴充套件處理 Python 資料型別和 C/C++ 資料型別之間的轉換以及錯誤檢查,將翻譯錯誤返回值轉換為 Python 異常。
透過 SWIG 的存在,簡化了粘合擴充套件的建立,SWIG 讀取包含函式和方法原型的標頭檔案,並自動生成必要的型別轉換和錯誤檢查程式碼。在底層程式碼(通常是 C 程式碼)不使用面向物件模型的情況下,粘合擴充套件又可以包裝在一個定義了適當類層次結構的 Python 模組中,同時將效能關鍵的操作委託給 C 程式碼。
使用 Python,可以開發更好的應用程式,因為不同型別的程式設計師可以在專案上協同工作。例如,在構建科學應用程式時,C/C++ 程式設計師可以實現高效的數值演算法,而同一專案的科學家可以編寫測試和使用這些演算法的 Python 程式。科學家不必學習低階程式語言,而 C/C++ 程式設計師不需要了解所涉及的科學。
如果沒有 Python,通常需要編寫大量 C/C++ 程式碼,只是為了提供一個足夠靈活的輸入機制,以便科學家可以輸入程式的資料,在實驗設定所要求的各種變體中(例如)。使用 Python,可以使用 Python 在更短的時間內編寫更靈活的輸入機制,或者 Python 本身可以成為最終的靈活輸入機制。作為一個極端的例子,勞倫斯利弗莫爾國家實驗室正在使用 Python 最終取代為此目的在內部開發的指令碼語言 (BASIS);BASIS 最初是 Fortran 程式的簡單輸入機制,並逐漸獲得指令碼語言的許多特性(變數、條件、迴圈、過程等等),但越來越笨拙。
由於 Python 具有到如此多不同應用領域中如此多不同元件的現有介面,因此 Python 非常適合用於特殊的整合任務。它可以將商業資料庫連結到數值計算程式碼;它可以為網路管理工具新增圖形使用者介面;它可以從虛擬現實應用程式傳送電子郵件。
結論
Python 可以在具有較長預期壽命的大型應用程式的設計中發揮重要的整合作用。它允許對使用者需求的變化做出快速響應,這些變化需要調整更高級別的應用程式邏輯,而無需更改基本底層元件。它還允許應用程式快速適應底層元件的變化。
後記:Python 和 Java 整合
一個用 100% Pure Java 編寫的新的 Python 實現,稱為 JPython,目前正在開發中;alpha 版本可用於評估。JPython 為 Java 提供無縫指令碼。它是 Python 語言和標準庫的完整實現,增加了對 Java 類領域的直接訪問。Java 程式碼也可以使用 Python 類 -- 例如,這對於回撥很重要。
JPython 的主要目的是讓 Java 實現 Python 已經為 C 和 C++ 所做的事情:透過提供更動態、更具表現力的替代方案,為程式設計師提供在開發時間和執行時間之間進行權衡的更多選擇。JPython 與 Java 的整合優於 Python 與 C/C++ 的整合:由於 Java 的反射 API,JPython 可以使用任意 Java 類,而無需像 SWIG 這樣的包裝器生成器的幫助。(C/C++ 程式碼必須首先透過 Java 本機程式碼介面提供給 Java;一旦可以從 Java 呼叫,就可以從 JPython 呼叫。)