Python底層是用什麼語言實現的?

2020-07-16 10:05:03
確切地說,本教學介紹的是用 C 語言編寫實現的 Python,又稱為 CPython。平時我們所討論的 Python,指的其實就是 CPython。

隨著程式語言的不斷發展,Python 的實現方式也發生了變化,除了用 C 語言實現外,Python 還有其他的實現方式。例如,用 Java 語言實現的 Python 稱為 JPython,用 .net 實現的 Python 稱為 IronPython 等等。

Python 的這些實現方式雖然誕生比 CPython 晚,但一直在努力地跟上主流,並在不同的生產環境中不斷地使用並推廣 Python。

Python 的實現方式有很多種,Python 官網上介紹了 20 多種語言變體、方言或 C 語言之外的 Python 直譯器實現。其中一些只是實現了語言核心語法、功能和內建擴充套件的一個子集,但至少有幾個與 CPython 幾乎完全相容。更重要的是,在這些不同的實現方式中,雖然有些只是玩具專案或實驗,但大部分都是為了解決某些實際問題而建立的,這些問題要麼使用 CPython 無法解決,要麼需要開發人員花費巨大的精力,這裡舉幾個例子:
  • 在嵌入式系統中執行 Python 程式碼。
  • 與執行框架(如 Java 或 .NET)或其他語言做程式碼整合。
  • 在 Web 瀏覽器中執行 Python 程式碼。

由於受到篇幅的限制,本節僅給大家介紹幾種 Python 開發人員最常用的幾種 Python 實現方式。

Stackless Python

Stackless Python 自稱 Python 增強版。之所以名為 Stackless(無棧),是因為它沒有依賴 C 語言的呼叫棧,實際上就是對 CPython 做了一些修改,新增了一些新的功能。

在新新增的功能中,最重要就是由直譯器管理的微執行緒,用來替代依賴系統核心上下文切換和任務排程的普通執行緒,既輕量化又節約資源。

Stackless Python 最新可用的版本是 2.7.9 和 3.3.5,分別實現的是 Python 2.7 和 3.3。在 Stackless Python 中,所有的額外功能都是內建 stackless 模組內的框架。

Stackless Python 並不是最有名的 Python 實現,但很值得一提,因為它引入的思想對程式語言社群有很大的影響。例如,將 Stackless Python 中的核心切換功能提取出來並作為一個獨立包發布,名為 greenlet,是許多有用的庫和框架的基礎。

此外,Stackless Python 的大部分功能都在 PyPy 中重新實現,PyPy 是另一個 Python 實現,我們將稍後介紹。

JPython

Jython 是 Python 語言的 Java 實現。它將程式碼編譯為 Java 位元組程式碼,開發人員在 Python 模組中可以無縫使用 Java 類。

Jython 允許人們在複雜應用系統(例如 J2EE)中使用 Python 作為頂層指令碼語言,它還將 Java 應用引入到 Python 中,一個很好的例子就是,在 Python 程式中可以使用 Apache Jackrabbit(這是一個基於 JCR 的文件倉庫 API)。

Jython 最新可用的版本是 Jython 2.7,對應的是 Python 2.7 版。它宣稱幾乎實現了 Python 所有的核心標準庫,並使用相同的回歸測試套件。Jython 3.x 版正在開發中。

Jython 與 CPython 實現的主要區別如下所示:
  • 真正的 Java 垃圾回收,而不是參照計數。
  • 沒有全域性直譯器鎖(GlobakInterpreter Lock,GIL),在多執行緒應用中可以充分利用多個核心。

這一語言實現的主要缺點是缺少對 C/Python 擴充套件 API 的支援,因此用 C 語言編寫的 Python 擴充套件在 Jython 中無法執行。這種情況未來可能會發生改變,因為 Jython 3.x 計劃支援 C/Python 擴充套件 API。

某些 Python Web 框架(例如 Pylons)被認為是促進 Jython 的開發,使其可用於 Java 世界。

IronPython

IronPython 將 Python 引入 .NET 框架中,這個專案受到微軟的支援,因為 IronPython 的主要開發人員都在微軟工作。可以這麼說,IronPython 是推廣語言的一種重要實現。

除了 Java,.NET社群是最大的開發者社群之一。

值得一提的是,微軟提供了一套免費開發工具,名為 PTVS(Python Tools for Visual Studio,用於Visual Studio 的 Python 工具),可以將 Visual Studio 轉換為成熟的 Python IDE。這是作為 Visual Studio 的外掛發布的,在 GitHub 可以找到其開原始碼。

IronPython 最新的穩定版本是 2.7.5,與 Python 2.7 相容。與 Jython 類似,Python 3.x 的實現也在開發中,但還沒有可用的穩定版本。

雖然 .NET 主要在微軟 Windows 系統上執行,但是 IronPython 也可以在 Mac OS X 和 Linux 系統上執行,這一點要感謝 Mono,一個跨平台的開源 .NET 實現。

與 CPython 相比,IronPython 的主要區別或優點如下:
  • 與 Jython 類似,沒有全域性直譯器鎖(Global Interpreter Lock,GIL),在多執行緒應用中可以充分利用多個核心。
  • 用 C# 和其他 .NET 語言編寫的程式碼可以輕鬆整合到 IronPython 中,反之亦然。
  • 通過 Silverlight,在所有主流 Web 瀏覽器中都可以執行。

說到弱點,IronPython 也與 Jython 非常類似,因為它也不支援 C/Python 擴充套件 API。對於想要使用主要基於 C 擴充套件的 Python 包(例如 NumPy)的開發人員來說,這一點很重要。

有一個叫作 ironclad 的專案,其目的是在 IronPython 中無縫使用這些擴充套件,其最新支援的版本是2.6,開發已經停止。

PyPy

PyPy 可能是最令人興奮的 Python 實現,因為其目標就是將 Python 重寫為 Python。在 PyPy 中,Python 直譯器本身是用 Python 編寫的。

在 Python 的 CPython 實現中,有一個 C 程式碼層來實現具體細節。但在 PyPy 實現中,這個 C 程式碼層用 Python 完全重寫。這樣,你可以在程式碼執行期間改變直譯器的行為,並實現 CPython 難以實現的程式碼模式。

目前 PyPy 的目的是與 Python 2.7 完全相容,而 PyPy3 則與 Python 3.2.5 版相容。

以前對 PyPy 感興趣主要是理論上的原因,只有喜歡深入鑽研語言細節的人才會對它感興趣。PyPy 通常不用於生產環境,但這些年來這種狀況己經發生改變,PyPy 通常比 CPython 實現要快得多。基於這一特性,使得越來越多的開發人員決定在生產環境中切換到 PyPy。

PyPy 與 CPython 實現的主要區別在於以下幾個方面:
  • 使用垃圾回收,而不是參照計數。
  • 整合跟蹤 JIT 編譯器,可以顯著提高效能。
  • 借鑑 Stackless Python 在應用層的無棧特性。

與幾乎所有其他的 Python 實現類似,PyPy 也缺乏對 C/Python 擴充套件 API 的完全官方支援。但它至少通過 CPyExt 子系統為 C 擴充套件提供了某種程度的支援,雖然文件不完整,功能也尚未完善。此外,社群正在努力將 NumPy 遷移到 PyPy 中,因為這是最需要的功能。