用Python將所有內容粘合在一起
用Python將所有內容粘合在一起
吉多·範羅蘇姆
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(微軟)在第6屆國際Python大會論文集中撰寫的《案例研究:商業環境中的Python》,以及UvA和CMU的Alice VR專案。)
Python在網路上擁有強大的影響力。它適用於CGI程式設計(在所有平臺:Unix、Windows和Mac上);它有與所有主要商業資料庫的介面。Python有一個與主要網際網路和網路協議介面的庫,並有HTML解析和生成工具包。當Infoseek規模較小時,Python是其主要的實現語言。至少有一家公司(Digital Creations)正在銷售一套使用Python的伺服器端工具。最後,Python已被用於實現一個網路瀏覽器(Grail)。
Python在分散式系統領域也表現良好。它是施樂PARC的ILU(Inter-Language Unification;一個相容CORBA的分散式物件系統)支援的主要語言之一,並且許多分散式應用程式已使用ILU用Python構建。Python也被澳大利亞昆士蘭大學的Hector專案使用。
最後,Python與Windows平臺很好地整合。Python程式可以與COM和DCOM服務互動,甚至可以實現新的COM和DCOM服務(這是Visual Basic無法做到的!)。Python還可以作為指令碼引擎在微軟的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%純Java編寫的新Python實現,名為JPython,目前正在開發中;alpha版本可供評估。JPython為Java提供了無縫指令碼編寫。它是Python語言和標準庫的完整實現,增加了對Java類世界的直接訪問。Java程式碼也可以使用Python類——這對於回撥等非常重要。
JPython的主要推動力在於它為Java做了Python已經為C和C++所做的事情:透過提供更動態、更富有表現力的替代方案,為程式設計師在開發時間與執行時間之間提供更多選擇。JPython與Java的整合優於Python與C/C++的整合:由於Java的反射API,JPython可以無需SWIG等包裝器生成器的幫助即可使用任意Java類。(C/C++程式碼必須首先透過Java原生代碼介面提供給Java;一旦它可從Java呼叫,它就可以從JPython呼叫。)
