<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # PyPy PyPy是一個Python實現的動態語言實現框架。 本章假定讀者熟悉如字節碼和常量疊算等有關解釋器和編譯器的基本概念。 ## 19.1\. 一點歷史 Python是一種高層次動態編程語言。它是由荷蘭程序員Guido van Rossum在20世紀80年代末發明的。Guido最初的實現是一個用C語言編寫的傳統的字節解釋器,人稱CPython。現在有許多其他的Python實現。其中最引人注目的有用Java編寫的并允許Java代碼接口的Jython,用C#編寫并允許和微軟.NET框架接口的IronPython,以及本章的主題PyPy。 CPython的仍然是使用最廣泛的實現,也是當前唯一支持下一代Python 3語言的實現。本章將談談讓PyPy與其他Python實現乃至其他任何動態語言實現都有所不同的一些設計決策。 ## 19.2\. PyPy概覽 除了微不足道的少量C代碼,PyPy完全是用Python寫成的。PyPy代碼樹包含兩個主要部分:Python解釋器和RPython翻譯工具鏈。 Python解釋器是面向程序員的運行庫,人們使用PyPy來調用Python實現。它實際上是用Python的一個子集——限制Python(通常縮寫為RPython)寫成的。用RPython編寫Python解釋器的目的是讓解釋器可以輸出給PyPy的另一個重要組成部分——RPython翻譯工具鏈。 RPython翻譯器會把RPython代碼轉換為一個選定的低級語言,最常用的是C。這使得PyPy成為一個自我托管的實現,也就是說它是用它自己實現的語言寫成的。我們在本章后文中還會看到,RPython翻譯也讓PyPy成為一個普適的動態語言實現框架。 PyPy強大的抽象使之成為最靈活的Python實現。從不同的垃圾回收到各種翻譯優化參數,它有近200個不同的配置選項。 ## 19.3\. Python解釋器 由于RPython是Python的真子集,PyPy Python解釋器可以不經翻譯地在另一個Python實現上運行。當然,這會非常慢,但這樣我們就可以快速測試解釋器的變化。這也讓我們可以使用普通的Python調試工具來調試解釋其。 PyPy的解釋器的大多數測試可以同時運行在無翻譯和有翻譯的解釋器上。這讓開發時的快速測試成為可能,并保證了有翻譯和無翻譯的解釋器的行為一致。 在大多數情況下,PyPy Python解釋器的細節和CPython非常類似,PyPy和CPython在解釋時使用的字節碼和數據結構幾乎完全一樣。兩者之間的主要區別在于PyPy有一種很聰明的抽象,稱為對象空間(簡稱objspaces)。objspace封裝了代表和操作Python數據類型的所有知識。例如,對兩個Python對象執行二元操作或獲取對象的一個屬性,都完全由objspace處理。這讓解釋器無需知道Python對象的任何實現細節。字節碼解釋器吧Python對象看成是黑盒子,并在需要操作它們時調用objspace方法。例如,下面是`BINARY_ADD`機器碼的一個粗糙的實現,在兩個對象用+運算符結合的時候會調用它。請注意解釋器如何不去檢查運算符;所有處理都立即被委托給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 ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看