Pypy 砰呸 - Introduction. Pypy and Rpython Translation Toolchain
Python 語言已經是世界上最多人使用的語言之一,Python 官方使用的 Python Virtual Machine 是 Cpython, 但 CPython 被人詬病的除了 GIL 機制,還有在實作方面很難引入 Just in time compilation.。因此有另外一種具有 JIT 性質的 Python Virtual Machine - Pypy. 在此章,會介紹 Pypy 跟 Rpython Translation Toolchain 的那檔事。
# Introduction. Pypy and Rpython Translation Toolchain
# 一、Pypy 簡介
Pypy 是 Python 語言的一個實現,旨在提供更好的執行時性能和更高的效能。它是用 Python (Rpython) 語言本身開發的,並採用了即時(JIT)編譯技術。
傳統的 CPython 是 Python 官方的標準實現,它使用解釋器將 Python 代碼轉換為 Bytecode,然後運行這些 Bytecode。儘管 CPython 可以確保 Python 代碼的穩健運行,但它在某些情況下可能因為 全域解釋器鎖(Global Interpreter Lock,GIL)的存在而導致多線程處理效能不佳。此外,CPython 的執行時性能也有限。
為了克服這些效能限制,PyPy 專注於改進 Python 程式碼的執行速度。它使用 JIT 編譯技術,該技術在執行時將 Python Bytecode 轉換為本機機器碼,從而使得 Python 代碼能夠更有效率地運行。而且,PyPy 也具有更好的多線程處理支援,因為它能夠更好地利用現代多核處理器。
綜合以上,Pypy 具有以下特點
JIT 編譯:PyPy 的核心優勢在於其即時編譯技術。在運行時,PyPy 解析並最佳化 Python Bytecode。然後將其轉換為本機機器碼,從而提高運行時效能。PyPy 的 JIT 編譯技術使得它能夠根據程式碼的實際運行情況進行動態調整和優化,從而進一步提高運行時性能。
兼容性:PyPy 是一個符合 Python 規範的實現,它能夠運行大部分標準的 Python 程式碼。然而,由於一些實現細節和特殊性,一些依賴於 CPython 特定功能或擴展的代碼可能需要進行調整以在 PyPy 上運行。
支援多版本:PyPy 支援 Python 2 和 Python 3,所以你可以在 PyPy 上運行不同版本的 Python 程式碼。
高效能:在某些情況下,PyPy 能夠比 CPython 快數倍,特別是對於計算密集型或高度迴圈嵌套的程式碼。
需要注意的是,雖然 PyPy 提供了優越的性能,但它並不適用於所有情況。在一些特定的場景中,CPython 可能更適合,尤其是當程式碼依賴於特定的 CPython 擴展或函式庫時。某些 Python 擴展可能不與 PyPy 完全相容,並需要特定的 CPython 環境。儘管如此,PyPy 的發展持續進行中,未來它可能會成為更多 Python 程式碼的首選運行環境之一。
# 二、什麼是 Rpython
RPython 是一種名為 RPython (Restricted Python) 的程式語言和工具集(ToolChain)。RPython 是 Python 語言的一個子集,旨在為動態語言(特別是 Python)提供靜態類型檢查和編譯器支援。
RPython 最初是為 PyPy 項目而開發的。PyPy 是 Python 語言的另一個實現,旨在提供更高的運行時性能。PyPy 的特點之一是它可以透過編譯器技術即時(JIT)編譯 Python 代碼,以提高執行速度。 為了使 PyPy 的 JIT 編譯器能夠正確地處理 Python 代碼,開發人員創建了 RPython,這是一種受限制的 Python 子集,具有以下特點:
靜態類型:RPython 要求在程式碼中聲明變數的類型,從而進行靜態類型檢查。這樣做是為了在 JIT(即時編譯)過程中進行優化和生成更高效的機器碼。
限制動態特性:RPython 去除了一些 Python 的動態特性,例如動態屬性和運行時的類型修改。這樣做是為了使得 JIT 編譯器可以更容易地生成有效的機器碼。
JIT 編譯支援:RPython 的最大用途是作為 PyPy 項目的核心,它允許 PyPy 進行 JIT 編譯,從而提高 Python 程式碼的執行性能。
跨平台:RPython 和 PyPy 支援多種主流作業系統,這使得您可以在不同平台上運行和測試您的 Python 程式碼。
雖然 RPython 主要是為 PyPy 項目而創建的,但它也可以用於其他類似的項目,將其他動態語言轉換為編譯的形式。然而,由於 RPython 是 Python 子集,它與標準 Python 語言存在一些差異,因此不是所有的 Python 代碼都能在 RPython 中運行。
# 三、 Rpython Translation Toolchain
原本 Pypy 具有兩個特色
- Python Interpreter 實作
- Dynamic Language Interpreter Framework
在之後已經將一和二的定義切開了,現在 Pypy 只是單純用 Rpython Translation Toolchain 寫的 Python JIT Interpreter。
至於第二個 Compiler Framework,你可以利用 Rpython 這個高階動態語言,撰寫動態語言的直譯器,並編譯成執行檔。(framework for implementing dynamic languages and generating virtual machines for them.)
透過 Rpython 高階動態語言更方便實作直譯器,更進一步利用 Toolchain 去最佳化 用高階語言撰寫的直譯器,可以用更短的時間產生或撰寫出更高效率的直譯器。
但是 RPython 的特點是它的 type 是 inferable 的, 所以雖然一樣不寫出 type,但是可以做到 statically typed, 而 PyPy 的 RPython toolchain 會把 RPython 的 code 轉成 C code 再丟給 GCC 或 Clang 這類 C compiler 來 compile 成 native code, 藉此你可以獲得 native code 的 interpreter,所以會跑的比原本疊在 interpreter 上的 interpreter 來的快 , 在這當中 PyPy 還可以幫你處理 Garbage Collecion 和 JIT。
# 四、 Conclusion
pypy
- 用 RPython 搭配Rpython Translation Toolchain 撰寫的 Python Interpreter with JIT
- 執行時將 Python Bytecode 轉換為本機機器碼
Rpython (Translation Toolchain)
- Dynamic Language Framework,生成動態語言直譯器的動態語言框架
- 撰寫 Dynamic Languages 的 Interpreter 的 framework
- 用 Rpython 寫 interpreter,產生高效率的 interpreter
- 改善用 interpreter 語言實作 interpreter 效能低落的問題
- 幫我們用 Rpython 程式碼轉成 C code 做最佳化
在下一章,我們將使用 Rpython Toolchain 去撰寫 Brainfuck 語言以及最佳化🤣