开发,设计,生活

编程语言

  • 2014-10-19 09:21:31 2014-10-19 14:06:02[U] 编程语言

    python 虚拟机加载并运行字节码文件,运行的过程与操作系统加载运行可执行文件的方式相似。

    在操作系统运行程序的时候,主要以栈的方式组织运行时环境。

    python 虚拟机在运行的时候也使用内部构建的栈帧来运行。


    PyFrameObject 对象

    PyFrameObject 是python内部的一个执行环境,它对应一个代码块的字节码对象,

    也就是 PyCodeObject。

    PyFrameObject 的定义如下

    typedef struct _frame {
        PyObject_VAR_HEAD
        struct _frame *f_back;  // 前一帧环境
        PyCodeObject *f_code;   // PyCodeObject 代码块的字节码对象
        PyObject *f_builtins;   // builtin 名字空间
        PyObject *f_globals;    // global 全局名字空间
        PyObject *f_locals;     // 局部名字空间
        PyObject **f_valuestack;    // 栈底
        PyObject **f_stacktop;  // 栈顶
        PyObject *f_trace;      // 跟踪函数
    
        PyObject *f_exc_type, *f_exc_value, *f_exc_traceback;
    
        PyThreadState *f_tstate; // 帧所在的线程状态对象
        int f_lasti;        // 上一条字节码指令在 f_code的偏移
        
        int f_lineno;       // 当前字节码的源代码行
        PyObject *f_localsplus[1];  // 保存栈空间的动态内存
    } PyFrameObject;
    


    虚拟机的进程和主线程

    python 虚拟机支持多线程,在实现上使用操作系统的原生线程。

    线程的状态通过 PyThreadState 来保存,供虚拟机框架调度使用。

    PyThreadState 的定义如下:

    typedef struct _ts {
        struct _ts *next;
        PyInterpreterState *interp;
    
        struct _frame *frame; // 线程中的函数调用栈帧
        int recursion_depth;
    
        Py_tracefunc c_profilefunc;
        Py_tracefunc c_tracefunc;
        PyObject *c_profileobj;
        PyObject *c_traceobj;
    
        PyObject *curexc_type;
        PyObject *curexc_value;
        PyObject *curexc_traceback;
    
        PyObject *exc_type;
        PyObject *exc_value;
        PyObject *exc_traceback;
    
        PyObject *dict;  /* Stores per-thread state */
    
        /* ... */
    } PyThreadState;
    


    虚拟机运行过程

    1. 虚拟机启动,初始化环境
    2. 加载字节码文件(或编译后加载),创建栈帧对象
    3. 主循环中获取当前活动线程的状态对象
    4. 获取线程状态对象包含的栈帧对象
    5. 通过栈帧对象执行从字节码文件加载的指令