CPython, Pypy, MicroPython...還在傻傻分不清楚?
哈嘍大家好,我是咸魚(yú)。
當(dāng)我們說(shuō) Python 時(shí),通常指的是官方實(shí)現(xiàn)的 CPython,但還有很多比如 Pypy、Jython、MicroPython、Brython、RustPython 等 “python”。許多小伙伴看到這些帶 “python” 的概念可能一頭霧水,心想這跟我平時(shí)接觸到的 python 有什么區(qū)別嗎?這些到底是什么?
那么今天這篇文章將跟大家介紹相關(guān)的概念。
為什么會(huì)有這么多的 'python'
在開(kāi)始這篇文章之前,我們首先需要了解一個(gè)東西——python 是什么?
python 實(shí)際上是一個(gè)語(yǔ)言規(guī)范,這個(gè)規(guī)范定義了 Python 這門(mén)語(yǔ)言應(yīng)該具備哪些語(yǔ)言要素,應(yīng)當(dāng)能完成什么樣的任務(wù)。
Python 語(yǔ)言規(guī)范可以用不同的方式實(shí)現(xiàn),可以用 C 實(shí)現(xiàn),也可以用 C++、Java、C#、JavaScript,甚至使用 Python 自己實(shí)現(xiàn)。
python 最初是由龜哥(Guido van Rossum)用 C 編寫(xiě)的(CPython)。
在 python 大獲成功之后,許多其他的項(xiàng)目開(kāi)始用其他的編程語(yǔ)言或者不同的目標(biāo)去重新編寫(xiě) python,那么這些項(xiàng)目中的每一個(gè) python 實(shí)現(xiàn)都需要一個(gè)名字去區(qū)別于最初的那個(gè) python。
所以這就是 Pypy、MicroPython、Iron Python、Jython 和 Pyston 等豐富多彩的名字出現(xiàn)的原因。
各種 'python' 介紹
CPython
當(dāng)我們?cè)谟懻?python 的時(shí)候,99% 的情況下指的是 CPython,CPython 指的是用 C 編寫(xiě)的 pyhton 實(shí)現(xiàn)。
CPython 是標(biāo)準(zhǔn) python,可以將 Python 源碼編譯成 CPython 字節(jié)碼,由虛擬機(jī)解釋執(zhí)行這些字節(jié)碼。
一般情況下,CPython 是最常用的 python 實(shí)現(xiàn),大多數(shù)開(kāi)發(fā)人員基本不會(huì)使用到 CPython 之外的 python 實(shí)現(xiàn),甚至都不會(huì)去討論。
Pypy
Pypy 是最著名的 CPython 替代品,它是用 python 編寫(xiě)的(你沒(méi)聽(tīng)錯(cuò),用 python 編寫(xiě)的 python 實(shí)現(xiàn)),實(shí)際上 Pypy 是由 RPython 實(shí)現(xiàn)的,RPython 是 Python 的一個(gè)子集。
Pypy 使用即時(shí)編譯(JIT)技術(shù),可以在運(yùn)行時(shí)將 Python 代碼動(dòng)態(tài)地編譯成機(jī)器碼,從而提供更高的執(zhí)行速度。
雖然 Pypy 執(zhí)行速度要比 CPython 快,但是它的啟動(dòng)速度要比 CPython 慢,如果運(yùn)行的時(shí)間足夠長(zhǎng)的話,就會(huì)變得越來(lái)越快,這使得它對(duì)于長(zhǎng)時(shí)間運(yùn)行的進(jìn)程特別有用,例如守護(hù)進(jìn)程、任務(wù)隊(duì)列和web服務(wù)器。
還有一個(gè)缺點(diǎn)就是 Pypy 與許多使用 C 編寫(xiě)的 Python 拓展庫(kù)不兼容。
雖然 Pypy 提供了一些與 CPython C API 兼容的接口,但并不能保證所有的 C 拓展都能無(wú)縫運(yùn)行。
Stackless Python
Stackless Python 是一種 Python 的變體,它是在 CPython 的基礎(chǔ)上進(jìn)行擴(kuò)展和改進(jìn)的版本。
與傳統(tǒng)的 CPython 相比,Stackless Python 提供了一些額外的特性,其中最重要的是支持協(xié)程(coroutine)和微線程(microthreads)。
協(xié)程是一種輕量級(jí)的線程,它允許在同一個(gè)線程內(nèi)的多個(gè)協(xié)程之間進(jìn)行切換,從而實(shí)現(xiàn)并發(fā)執(zhí)行
Stackless Python 的協(xié)程實(shí)現(xiàn)基于任務(wù)切換的概念,可以方便地編寫(xiě)異步、非阻塞的代碼,提高程序的并發(fā)性和響應(yīng)性。
微線程是 Stackless Python 中的另一個(gè)概念,它是一種更輕量級(jí)的線程單位,可以在一個(gè)進(jìn)程內(nèi)并發(fā)地執(zhí)行多個(gè)微線程,微線程與操作系統(tǒng)線程的切換開(kāi)銷較小,可以更高效地處理大量的并發(fā)任務(wù)。
Stackless Python 并不是 Python 的官方版本,它是由 Christian Tismer 和其他貢獻(xiàn)者開(kāi)發(fā)和維護(hù)的一個(gè)項(xiàng)目。
Stackless Python 的一個(gè)簡(jiǎn)單應(yīng)用:
Jython
Jython(Java Python 的縮寫(xiě))由 Java 編寫(xiě),運(yùn)行在 Java 虛擬機(jī)上( Java Virtual Machine,JVM),它允許開(kāi)發(fā)人員使用 Python 語(yǔ)言編寫(xiě)和執(zhí)行 Java 應(yīng)用程序,可以在Jython中直接訪問(wèn)Java類和方法,它提供了對(duì) Java 類和庫(kù)的無(wú)縫集成,使得開(kāi)發(fā)人員可以利用 Java 平臺(tái)的功能和生態(tài)系統(tǒng)。
Jython 廣泛應(yīng)用于 Java 開(kāi)發(fā)中,尤其是需要結(jié)合 Python 腳本和 Java 代碼的場(chǎng)景。
Jython 的一個(gè)簡(jiǎn)單應(yīng)用:
IronPython
IronPython 與 Jython 類似,它是 .NET 框架的 python 實(shí)現(xiàn),它使用了微軟開(kāi)發(fā)的動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí)(DLR)和公共語(yǔ)言運(yùn)行時(shí)(CLR),能夠與.NET框架無(wú)縫集成,開(kāi)發(fā)人員可以在 .NET 平臺(tái)上編寫(xiě)和執(zhí)行 Python 代碼,利用 .NET 框架的功能和資源。
IronPython 的一個(gè)簡(jiǎn)單應(yīng)用:
MicroPython
根據(jù)字面意思可以得知—— MicroPython 是一種精簡(jiǎn)版的 python 實(shí)現(xiàn),它只包含了 python 標(biāo)準(zhǔn)庫(kù)中的一小部分并經(jīng)過(guò)優(yōu)化,以適應(yīng)資源受限的環(huán)境,專為嵌入式系統(tǒng)和物聯(lián)網(wǎng)設(shè)備而設(shè)計(jì)。
MicroPython具有以下特點(diǎn):
- 小巧
- 支持硬件交互
- 垃圾回收和內(nèi)存管理
- 交互式開(kāi)發(fā)
- 跨平臺(tái)支持
總結(jié)一下
- Python 實(shí)際上是一個(gè)語(yǔ)言規(guī)范,可以用不同的方式實(shí)現(xiàn)
- 為了能夠?qū)崿F(xiàn)在特定的應(yīng)用場(chǎng)景中具有不同的優(yōu)勢(shì)和用途,開(kāi)發(fā)人員用其他語(yǔ)言設(shè)計(jì)了不同的 python 實(shí)現(xiàn)
- CPython 是最常用的 Python 實(shí)現(xiàn),它是官方用 C 編寫(xiě)的 python 實(shí)現(xiàn)
- 除此之外還有像 jython、Pypy、Iron Python、Stackless Python 等