簡體   English   中英

有人可以從 python 字節碼解釋 CALL_FUNCTION 和 RETURN_VALUE

[英]Can someone explain CALL_FUNCTION and RETURN_VALUE from python bytecode

我正在嘗試理解 python 字節碼,但遇到了 CALL_FUNCTION 和 RETURN_VALUE。

函數是否有自己的堆棧? 如果不是,文檔中“將 TOS 返回給函數調用者”是什么意思?

抱歉含糊不清

在 CPython 中,每個函數都有自己的堆棧,在 CPython 中稱為框架,它是特定於實現的細節(非常舊的),而其他 Python 實現(如 IronPython 1和 Jython)沒有此功能或以不同方式實現。

為了澄清當我們說堆棧時涉及多個堆棧:

  1. Python堆棧:框架對象的堆棧
  2. 函數值棧:每個frame對象中的值都存放在這個棧中,在這個frame 2的范圍內進行操作
  3. C 堆棧:用於 C 函數調用

當一個函數被調用時,一個新的框架對象首先被創建並放置在Python stack 這個框架對象包含函數的代碼對象、函數可以訪問的全局變量以及函數中定義的局部變量存儲在框架對象中。

您可以使用檢查模塊中提供的實用程序獲取Python 堆棧中的當前幀當前幀

問題在於它是一個 Python 對象,它有自己的類型PyFrame_Type ,它獲取引用計數(從PyVarObject獲取所有標頭)並消耗一些內存,如果我們有一系列函數調用,每次我們都會創建這些幀對象在內存中遍布整個堆。

在 Python 3.11 中,框架對象將被一個沒有對象頭的結構數組替換。 框架對象仍然可用,但inspect.currentframe()是我們使用inspect.currentframe()sys._get_frame()請求它


2函數值棧

我們可以通過訪問函數代碼對象的co_stacksize屬性來檢查函數的堆棧大小,該值是在編譯期間確定的:

>>> def func():
...     a = 1
...     b = 2
...     c = 3
...     d = a + b + c
...
>>> func.__code__.co_stacksize
2

這里的值是 2,因為要對a + b + c求和,它首先在堆棧上加載abLOAD_FAST )並執行求和( BINARY_ADD )並將結果放回堆棧頂部,現在c已加載並求和與ab之和的結果。 因此,特定於該函數的堆棧需要的最大大小為 2。


1:可以在 IronPython 中使用標志X:Frames來啟用 CPython 之類的框架對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM