一、運作過程。
Python先把代碼(.py檔案)編譯成位元組碼,交給位元組碼虛拟機,然後虛拟機一條一條執行位元組碼指令,進而完成程式的執行。
Python 虛拟機加載并運作位元組碼檔案,運作的過程與作業系統加載運作可執行檔案的方式相似。但是python虛拟機在運作的時候也使用内部建構的棧幀來運作。
二、具體過程。
1.虛拟機啟動,初始化環境。(又是初始化。。。)
2.加載位元組碼檔案,建立棧幀對象。
位元組碼 是PyCodeObject的對象。Python 代碼的編譯結果就是PyCodeObject對象;結構如下:
typedef struct {PyObject_HEADint co_argcount;int co_nlocals;int co_stacksize;int co_flags;PyObject *co_code;PyObject *co_consts;PyObject *co_names;PyObject *co_varnames;PyObject *co_freevars;PyObject *co_cellvars;PyObject *co_filename;PyObject *co_name;int co_firstlineno;PyObject *co_lnotab;void *co_zombieframe;} PyCodeObject;
加載子產品時,子產品對應的PyCodeObject對象被寫入.pyc檔案,pyc 檔案是位元組碼在磁盤的表現形式格式如下。
3.主循環中擷取目前活動線程的狀态對象。
4.擷取線程對象包含的棧幀對象。
5.通過棧幀對象來加載執行位元組碼檔案的指令。
執行位元組碼Python虛拟機的原理就是模拟可執行程式再X86機器上的運作,X86的運作時棧幀如下圖:
Python虛拟機的原理就是模拟上述行為。當發生函數調用時,建立新的棧幀,對應Python的實作就是PyFrameObject對象
執行位元組碼時,會先建立一個棧幀,對應Python的實作就是PyFrameObject對象。
PyFrameObject
typedef struct _frame {
PyObject_VAR_HEAD
struct _frame *f_back;
PyCodeObject *f_code;
PyObject *f_builtins;
PyObject *f_globals;
PyObject *f_locals;
PyObject **f_valuestack;
PyObject **f_stacktop;
......
}
那麼對應Python的運作時棧就是這樣子:
CALL_FUNCTION指令執行時,會建立新的棧幀,并執行相對應的位元組碼指令。
三、 總結。
主要是簡單介紹了,Python虛拟機運作的全過程。主要是那5步。記住就Ok~