W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
PyPy是一個Python實現(xiàn)的動態(tài)語言實現(xiàn)框架。
本章假定讀者熟悉如字節(jié)碼和常量疊算等有關(guān)解釋器和編譯器的基本概念。
Python是一種高層次動態(tài)編程語言。它是由荷蘭程序員Guido van Rossum在20世紀80年代末發(fā)明的。Guido最初的實現(xiàn)是一個用C語言編寫的傳統(tǒng)的字節(jié)解釋器,人稱CPython?,F(xiàn)在有許多其他的Python實現(xiàn)。其中最引人注目的有用Java編寫的并允許Java代碼接口的Jython,用C#編寫并允許和微軟.NET框架接口的IronPython,以及本章的主題PyPy。 CPython的仍然是使用最廣泛的實現(xiàn),也是當前唯一支持下一代Python 3語言的實現(xiàn)。本章將談?wù)勛孭yPy與其他Python實現(xiàn)乃至其他任何動態(tài)語言實現(xiàn)都有所不同的一些設(shè)計決策。
除了微不足道的少量C代碼,PyPy完全是用Python寫成的。PyPy代碼樹包含兩個主要部分:Python解釋器和RPython翻譯工具鏈。 Python解釋器是面向程序員的運行庫,人們使用PyPy來調(diào)用Python實現(xiàn)。它實際上是用Python的一個子集——限制Python(通??s寫為RPython)寫成的。用RPython編寫Python解釋器的目的是讓解釋器可以輸出給PyPy的另一個重要組成部分——RPython翻譯工具鏈。 RPython翻譯器會把RPython代碼轉(zhuǎn)換為一個選定的低級語言,最常用的是C。這使得PyPy成為一個自我托管的實現(xiàn),也就是說它是用它自己實現(xiàn)的語言寫成的。我們在本章后文中還會看到,RPython翻譯也讓PyPy成為一個普適的動態(tài)語言實現(xiàn)框架。
PyPy強大的抽象使之成為最靈活的Python實現(xiàn)。從不同的垃圾回收到各種翻譯優(yōu)化參數(shù),它有近200個不同的配置選項。
由于RPython是Python的真子集,PyPy Python解釋器可以不經(jīng)翻譯地在另一個Python實現(xiàn)上運行。當然,這會非常慢,但這樣我們就可以快速測試解釋器的變化。這也讓我們可以使用普通的Python調(diào)試工具來調(diào)試解釋其。 PyPy的解釋器的大多數(shù)測試可以同時運行在無翻譯和有翻譯的解釋器上。這讓開發(fā)時的快速測試成為可能,并保證了有翻譯和無翻譯的解釋器的行為一致。
在大多數(shù)情況下,PyPy Python解釋器的細節(jié)和CPython非常類似,PyPy和CPython在解釋時使用的字節(jié)碼和數(shù)據(jù)結(jié)構(gòu)幾乎完全一樣。兩者之間的主要區(qū)別在于PyPy有一種很聰明的抽象,稱為對象空間(簡稱objspaces)。objspace封裝了代表和操作Python數(shù)據(jù)類型的所有知識。例如,對兩個Python對象執(zhí)行二元操作或獲取對象的一個屬性,都完全由objspace處理。這讓解釋器無需知道Python對象的任何實現(xiàn)細節(jié)。字節(jié)碼解釋器吧Python對象看成是黑盒子,并在需要操作它們時調(diào)用objspace方法。例如,下面是BINARY_ADD
機器碼的一個粗糙的實現(xiàn),在兩個對象用+運算符結(jié)合的時候會調(diào)用它。請注意解釋器如何不去檢查運算符;所有處理都立即被委托給objspace。
def BINARY_ADD(space, frame):
object1 = frame.pop() # pop left operand off stack
object2 = frame.pop() # pop right operand off stack
result = space.add(object1, object2) # perform operation
frame.push(result) # record result on stack
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: