国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?

這篇具有很好參考價值的文章主要介紹了深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?

在本篇文章當中主要給大家分析 python 當中與控制流有關的字節(jié)碼,通過對這部分字節(jié)碼的了解,我們可以更加深入了解 python 字節(jié)碼的執(zhí)行過程和控制流實現原理。

控制流實現

控制流這部分代碼主要涉及下面幾條字節(jié)碼指令,下面的所有字節(jié)碼指令都會有一個參數:

  • JUMP_FORWARD,指令完整條指令會將當前執(zhí)行字節(jié)碼指令的位置加上這個參數,然后跳到對應的結果繼續(xù)執(zhí)行。
  • POP_JUMP_IF_TRUE,如果棧頂元素等于 true,將字節(jié)碼的執(zhí)行位置改成參數的值。將棧頂元素彈出。
  • POP_JUMP_IF_FALSE,這條指令和 POP_JUMP_IF_TRUE 一樣,唯一差別就是判斷棧頂元素是否等于 true。
  • JUMP_IF_TRUE_OR_POP,如果棧頂元素等于等于 true 則將字節(jié)碼執(zhí)行位置設置成參數對應的值,并且不需要將棧頂元素彈出。但是如果棧頂元素是 false 的話那么就需要將棧頂元素彈出。
  • JUMP_IF_FALSE_OR_POP,和JUMP_IF_TRUE_OR_POP一樣只不過需要棧頂元素等于 false 。
  • JUMP_ABSOLUTE,直接將字節(jié)碼的執(zhí)行位置設置成參數的值。

總的來說,這些跳轉指令可以讓 Python 的解釋器在執(zhí)行字節(jié)碼時根據特定條件來改變執(zhí)行流程,實現循環(huán)、條件語句等基本語言結構。

現在我們使用一個例子來深入理解上面的各種指令的執(zhí)行過程。

import dis


def test_control01():
    a = 1

    if a > 1:
        print("a > 1")
    elif a < 1:
        print("a < 1")
    else:
        print("a == 1")

if __name__ == '__main__':
    dis.dis(test_control01)

上面的程序輸出結果如下所示:

  6           0 LOAD_CONST               1 (1)
              2 STORE_FAST               0 (a)

  8           4 LOAD_FAST                0 (a)
              6 LOAD_CONST               1 (1)
              8 COMPARE_OP               4 (>)
             10 POP_JUMP_IF_FALSE       22

  9          12 LOAD_GLOBAL              0 (print)
             14 LOAD_CONST               2 ('a > 1')
             16 CALL_FUNCTION            1
             18 POP_TOP
             20 JUMP_FORWARD            26 (to 48)

 10     >>   22 LOAD_FAST                0 (a)
             24 LOAD_CONST               1 (1)
             26 COMPARE_OP               0 (<)
             28 POP_JUMP_IF_FALSE       40

 11          30 LOAD_GLOBAL              0 (print)
             32 LOAD_CONST               3 ('a < 1')
             34 CALL_FUNCTION            1
             36 POP_TOP
             38 JUMP_FORWARD             8 (to 48)

 13     >>   40 LOAD_GLOBAL              0 (print)
             42 LOAD_CONST               4 ('a == 1')
             44 CALL_FUNCTION            1
             46 POP_TOP
        >>   48 LOAD_CONST               0 (None)
             50 RETURN_VALUE

我們現在來模擬一下上面的字節(jié)碼執(zhí)行過程,我們使用 counter 表示當前字節(jié)碼的執(zhí)行位置:

在字節(jié)碼還沒開始執(zhí)行之前,棧空間和 counter 的狀態(tài)如下:

深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?

現在執(zhí)行第一條字節(jié)碼 LOAD_CONST,執(zhí)行完之后 counter = 2,因為這條字節(jié)碼占一個字節(jié),參數棧一個字節(jié),因此下次執(zhí)行的字節(jié)碼的位置在 bytecode 的低三個位置,對應的下標為 2,因此 counter = 2 。

深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?

現在執(zhí)行第二條字節(jié)碼 STORE_FAST,讓 a 指向 1 ,同樣的 STORE_FAST 操作碼和操作數各占一個字節(jié),因此執(zhí)行完這條字節(jié)碼之后??臻g沒有數據,counter = 4 。

深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?

接下來 LOAD_FAST 將 a 指向的對象也就是 1 加載進入棧中,此時的 counter = 6,LOAD_CONST 將常量 1 加載進行入??臻g當中,此時 counter = 8,在執(zhí)行完這兩條指令之后,??臻g的變化如下圖所示:

深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?

接下來的一條指令是 COMPARE_OP ,這個指令有一個參數表示比較的符號,這里是比較 a > 1,并且會將比較的結果壓入棧中,比較的結果是 false ,因為 COMPARE_OP 首先會將棧空間的兩個輸入彈出,因此在執(zhí)行完這條指令之后棧空間和 counter 的值如下:

深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?

下面一條指令為 POP_JUMP_IF_FALSE,根據前面的字節(jié)碼含義,這個字節(jié)碼會將棧頂的 false 彈出,并且會進行跳轉,并且將 counter 的值直接編程參數的值,這里他的參數是 22 ,因此 counter = 22,在執(zhí)行完這條指令之后,結果如下:

深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?

因為現在已經跳轉到了 22 ,因此接下來執(zhí)行的指令為 LOAD_FAST,將變量 a 加載進入??臻g,LOAD_CONST 將常量 1 加載進入??臻g,在執(zhí)行完這兩條執(zhí)行之后,變化情況如下:

深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?

在次執(zhí)行 POP_JUMP_IF_FALSE,這回的結果也是 false ,因此繼續(xù)執(zhí)行 POP_JUMP_IF_FALSE,這次的參數是 40,直接將 counter 的值設置成 40 。

深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?

接下來 LOAD_GLOBAL 加載一個全局變量 print 函數 counter 變成 42 ,LOAD_CONST 加載字符串 "a == 1" 進入??臻g,counter = 44,此時狀態(tài)如下:

深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?

CALL_FUNCTION 這個字節(jié)碼有一個參數,表示調用函數的參數的個數,這里是 1,因為 print 函數只有一個參數,然后輸出字符串 "a== 1",但是這里需要注意的是 print 函數會返回一個 None,因此執(zhí)行完 CALL_FUNCTION 之后狀態(tài)如下:

深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?

至此差不多上面的函數差不多執(zhí)行完了,后面幾條字節(jié)碼很簡單,就不再進行敘述了。

總結

在 Python 中,控制流指令可以讓解釋器根據特定條件改變執(zhí)行流程,實現循環(huán)、條件語句等基本語言結構。Python 中與控制流有關的字節(jié)碼指令包括 JUMP_FORWARD、POP_JUMP_IF_TRUE、POP_JUMP_IF_FALSE、JUMP_IF_TRUE_OR_POP、JUMP_IF_FALSE_OR_POP 和 JUMP_ABSOLUTE 等。這些指令都有一個參數,主要是用來計算跳轉的目標位置等。通過對這些指令的了解,我們可以更深入地理解 Python 字節(jié)碼的執(zhí)行過程和控制流實現原理。


本篇文章是深入理解 python 虛擬機系列文章之一,文章地址:https://github.com/Chang-LeHung/dive-into-cpython

更多精彩內容合集可訪問項目:https://github.com/Chang-LeHung/CSCore

關注公眾號:一無是處的研究僧,了解更多計算機(Java、Python、計算機系統(tǒng)基礎、算法與數據結構)知識。文章來源地址http://www.zghlxwxcb.cn/news/detail-409760.html

到了這里,關于深入理解 python 虛擬機:字節(jié)碼教程(2)——控制流是如何實現的?的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 《深入理解Java虛擬機》讀書筆記:基于棧的字節(jié)碼解釋執(zhí)行引擎

    《深入理解Java虛擬機》讀書筆記:基于棧的字節(jié)碼解釋執(zhí)行引擎

    ??虛擬機是如何調用方法的內容已經講解完畢,從本節(jié)開始,我們來探討虛擬機是如何執(zhí)行方法中的字節(jié)碼指令的。上文中提到過,許多Java虛擬機的執(zhí)行引擎在執(zhí)行Java代碼的時候都有 解釋執(zhí)行(通過解釋器執(zhí)行) 和 編譯執(zhí)行(通過即時編譯器產生本地代碼執(zhí)行) 兩種選

    2024年02月11日
    瀏覽(51)
  • 深入理解JVM虛擬機第二篇:虛擬機概念和JVM整體架構以及字節(jié)碼的執(zhí)行路線

    深入理解JVM虛擬機第二篇:虛擬機概念和JVM整體架構以及字節(jié)碼的執(zhí)行路線

    ?????? 學習交流群: ??1:這是孫哥suns給大家的福利! ??2:我們免費分享Netty、Dubbo、k8s、Mybatis、Spring...應用和源碼級別的視頻資料 ????3:QQ群:583783824 ? ???? ?工作微信:BigTreeJava 拉你進微信群,免費領取! ????4:本文章內容出自上述:Spring應用課程!????

    2024年02月09日
    瀏覽(33)
  • 深入理解JVM虛擬機第二十七篇:詳解JVM當中InvokeDynamic字節(jié)碼指令,Java是動態(tài)類型語言么?

    深入理解JVM虛擬機第二十七篇:詳解JVM當中InvokeDynamic字節(jié)碼指令,Java是動態(tài)類型語言么?

    ????? 學習交流群: ??1:這是孫哥suns給大家的福利! ?? 2:我們免費分享Netty、Dubbo、k8s、Mybatis、Spring...應用和源碼級別的視頻資料 ????3:QQ群: 583783824 ? ???? ?工作微信: BigTreeJava 拉你進微信群,免費領?。?????4:本文章內容出自上述:Spring應用課程!????

    2024年02月04日
    瀏覽(22)
  • 深入理解 python 虛擬機:魔術方法之數學計算

    在本篇文章當中主要給大家介紹在 python 當中一些常見的魔術方法,本篇文章主要是關于與數學計算相關的一些魔術方法,在很多科學計算的包當中都使用到了這些魔術方法。 當我們在Python中定義自己的類時,可以通過重寫一些特殊方法來改變對象的比較行為。這些特殊方法

    2024年02月05日
    瀏覽(18)
  • 深入理解python虛擬機:程序執(zhí)行的載體——棧幀

    深入理解python虛擬機:程序執(zhí)行的載體——棧幀

    棧幀(Stack Frame)是 Python 虛擬機中程序執(zhí)行的載體之一,也是 Python 中的一種執(zhí)行上下文。每當 Python 執(zhí)行一個函數或方法時,都會創(chuàng)建一個棧幀來表示當前的函數調用,并將其壓入一個稱為調用棧(Call Stack)的數據結構中。調用棧是一個后進先出(LIFO)的數據結構,用于管

    2023年04月25日
    瀏覽(20)
  • 深入理解 python 虛擬機:花里胡哨的魔術方法

    在本篇文章當中主要給大家介紹在 cpython 當中一些比較花里胡哨的魔術方法,以幫助我們自己實現比較花哨的功能,當然這其中也包含一些也非常實用的魔術方法。 在 Python 中, __hash__() 方法是一種特殊方法(也稱為魔術方法或雙下劃線方法),用于返回對象的哈希值。哈希

    2024年02月06日
    瀏覽(20)
  • 深入理解python虛擬機:調試器實現原理與源碼分析

    深入理解python虛擬機:調試器實現原理與源碼分析

    調試器是一個編程語言非常重要的部分,調試器是一種用于診斷和修復代碼錯誤(或稱為 bug)的工具,它允許開發(fā)者在程序執(zhí)行時逐步查看和分析代碼的狀態(tài)和行為,它可以幫助開發(fā)者診斷和修復代碼錯誤,理解程序的行為,優(yōu)化性能。無論在哪種編程語言中,調試器都是一

    2023年04月26日
    瀏覽(38)
  • 深入理解JVM虛擬機第十五篇:虛擬機棧常見異常以及如何設置虛擬機棧的大小

    深入理解JVM虛擬機第十五篇:虛擬機棧常見異常以及如何設置虛擬機棧的大小

    ???? 學習交流群: ??1:這是 孫哥suns 給大家的福利! ??2:我們免費分享Netty、Dubbo、k8s、Mybatis、Spring...應用和源碼級別的視頻資料 ????3:QQ群: 583783824 ? ???? ?工作微信: BigTreeJava 拉你進微信群,免費領??! ????4:本文章內容出自上述:Spring應用課程!????

    2024年02月06日
    瀏覽(28)
  • 深入理解 python 虛擬機:破解核心魔法——反序列化 pyc 文件

    深入理解 python 虛擬機:破解核心魔法——反序列化 pyc 文件

    在前面的文章當中我們詳細的對于 pyc 文件的結構進行了分析,pyc 文件主要有下面的四個部分組成:魔術、 Bite Filed 、修改日期和 Code Object 組成。在前面的文章當中我們已經對前面三個部分進行了字節(jié)角度的分析,直接從 pyc 文件當中讀取對應的數據并且打印出來了。而在本

    2024年02月05日
    瀏覽(23)
  • 深入理解try...catch(字節(jié)碼層面)

    深入理解try...catch(字節(jié)碼層面)

    我們工作中常用try...catch來解決程序中出現的異常情況,但是你真的了解它的實現原理嗎?今天我就帶著大家從字節(jié)碼層面理解try...catch 我們首先需要準備好異常類和對應的測試類方便我們觀察。 異常類: 測試類: 在idea中編譯后,使用jclasslib插件即可查看對應的字節(jié)碼,字

    2024年02月02日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包