當大多數程式員談到 ”Python“ 時,他們可能想到的是有時稱為 ”CPython“(因為它是以 C 實現的)的這種特定實現。但 Python 作為一種語言規範,已隨著 Guido van Rossum 的參考實現的演變而實現了多次。本文包含對兩種非標準 Python -- Stackless 和 Vyper -- 創始人帶注釋的採訪。developWorks 網站上的 Linux 專區是有關 Linux、Linux 資源和 Linux 開發的開發人員資源。
據我瞭解,現在可以下載並運行四種 Python 的實現,還有一種實現正在建立中。每種實現都有其存在的特殊理由,這些理由可以在這裡從實現開發人員自己的話語裡瞭解到。
對不同的平台重新編譯編譯器或解譯器所產生的實現只是略有不同(可能有少量的條件性編譯和更改),但最有趣的實現(就我而言)是超越平台問題的那些。實際上,我們在這篇文章中將要看到的那些 Python 實現大多本身就是多平台。實現的概念也與 版本的概念有所區別。就語言特性而言,這裡談到的所有實現基本上都處於同一語言版本 (1.5.2)。很明顯,CPython 1.6/2.0/3000 已經有一個部分屬於新的基本實現,但其它實現可以同樣地與那些語言層級的特性一致。
重新實現了哪些程式設計語言,實現的頻率怎樣,出於什麼原因,以及由誰實現?要形容這組語言非常困難。某些與 Python 幾乎處同一地位的流行語言 -- 例如 perl、REBOL 和 PHP -- 只有一種實現(編譯成許多平台)。TCL 與 Perl/PHP 最為相似,但 確實有一種稱為 Jacl 的 Java 平台版本。從另一個極端來看,例如 C、Awk、Cobol、REXX 和 Java 這樣的語言,每個都曾經被無數次地實現。但那些再實現是為了許可和營銷等考慮,而不是出於實現的概念和抽象問題。似乎有特殊學術意味的那些語言重新實現得很多(特別是函數性、邏輯性或超純 OOP 語言,例如Smalltalk 和 Eiffel)。Lisp 沒有幾百個也有幾十個實現和派生。
與我們將要討論的 Python 實現不同,Lisp 的派生在提供新實現的同時往往引入許多新穎的 語言特性。Python 實現在很大程度上實現和主要 CPython 版本 相同的 Python 語言。所有現有的版本都是開放源碼合作努力的結果,這種情況下,創新與市場定位沒有太大關係,甚至與有時導致開放源碼項目分裂的許可證爭鬥也沒有什麼關係。而且,不同的 Python 版本也不是真正傳統意義上的 支流,而集中於不同的概念,正是這些概念證明它本身就是 Python 實現。
兩種沒有詳細說明的實現是 JPython 和 Python.NET。JPython 是以 Java 編寫的編譯器,用於將 Python 原始碼編譯成 Java 位元組碼。Python 應用程式最終是在 JVM(使用者可能不知道它是以 Python 原始碼而不是 Java 編寫的,他們也不需要關心)中啟動並執行。Python.NET 是個還未交付的實現,但它 -- 至少在結構上 -- 將與 JPython 相似。Python.NET 將讓 Python 參與到微軟的 .NET 項目中,該項目基本上接近於一個可以運行以各種語言(例如新的 C#、Visual、Basic、C++,以及 Python)編寫的程式的非 Java VM。請隨時關注這些實現的開發人員發布的資訊。
有兩種從理論角度上講使人著迷的實現,下面,就讓我們聽聽它們的開發人員都說了些什麼:開發 Vyper的 John Max Skaller 和開發 Stackless Python的 Christian Tismer。
Vyper:採訪創始人 John Max Skaller
Vyper 是以函數性語言 Ocaml (3.00) 編寫的 Python 語言的實現。與其它 Python 實現比較,Vyper 提供了一些(可選的)語言擴充:更強大的範圍確定規則和一些新的函數性特性。Vyper 現在不再進行開發,但它以後可能得到增強(請參閱 參考資料獲得 Vyper,以及它的原始碼。)。我問 Vyper 的創始人 John Max Skaller 有關建造 Vyper 的動機。
Skaller:建造 Vyper 有兩個原因:首先,我喜歡 Python,特別是它的簡單性。但我不喜歡它缺乏範圍確定性,凡事都需要做大量更改來取得進展。因此我決定在保留與 Python 相容性的同時,通過建造進階得多的程式設計語言,並在其中建造函數性程式設計語言的某些概念來改正這些問題。
第二個原因是效能。我有一個稱之為 interscript 的主要 Python 程式,一個有讀寫能力的編程 (LP) 工具,它不僅受到 Python 中缺乏良好結構(如上所述),而且還受效能問題的困擾。
Mertz:既然文字編程是建立 Vyper 的一個動機,您是否能簡單介紹一下什麼是有讀寫能力的編程,我想這樣對讀者會有所協助。
Skaller:它的構思是不需要為程式記錄文檔(在編程後),而是編寫 包含程式的文檔。[它]由 Donald Knuth 發明。