天天看點

Python虛拟機運作過程

一、運作過程。 

      Python先把代碼(.py檔案)編譯成位元組碼,交給位元組碼虛拟機,然後虛拟機一條一條執行位元組碼指令,進而完成程式的執行。

      Python 虛拟機加載并運作位元組碼檔案,運作的過程與作業系統加載運作可執行檔案的方式相似。但是python虛拟機在運作的時候也使用内部建構的棧幀來運作。

二、具體過程。

1.虛拟機啟動,初始化環境。(又是初始化。。。)

2.加載位元組碼檔案,建立棧幀對象。

         位元組碼 是PyCodeObject的對象。Python 代碼的編譯結果就是PyCodeObject對象;結構如下:

    typedef struct {
  PyObject_HEAD
  int 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 檔案是位元組碼在磁盤的表現形式格式如下。

Python虛拟機運作過程

3.主循環中擷取目前活動線程的狀态對象。

4.擷取線程對象包含的棧幀對象。

5.通過棧幀對象來加載執行位元組碼檔案的指令。

    執行位元組碼Python虛拟機的原理就是模拟可執行程式再X86機器上的運作,X86的運作時棧幀如下圖:

Python虛拟機運作過程

          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的運作時棧就是這樣子:

Python虛拟機運作過程

          CALL_FUNCTION指令執行時,會建立新的棧幀,并執行相對應的位元組碼指令。

三、 總結。

       主要是簡單介紹了,Python虛拟機運作的全過程。主要是那5步。記住就Ok~