Python虚拟机

1 Python运行机理

运行之前:运行时环境的初始化,与执行环境有区别

运行之中:虚拟机的运行框架(具体实现过程)+运行时环境

编译----->虚拟机运行

Python虚拟机是否就在编译过程中生成PyCodeObject对象上进行所有操作?

不是,PyCodeObject对象有字节码指令序列以及关于程序的所有静态信息,但是缺少程序运行的动态信息:名字空间、运行时栈、变长对象等。

2 字节码指令序列

2.1复习FrameObject框架

1.PyCodeObject:co_code、co_consts、co_names

2._PyInterpreterFrame命名空间(动态):f_locals、f_globals、f_builtins

2.2举例

LOAD_VALUE:找到指定的数据进行压栈,根据tuple的第二个元素(指令的参数)从常量表找

ADD_TWO_VALUES:加法操作弹出栈中的两个数,将它们相加并将结果压入栈中

PRINT_RESULT:弹出栈中元素并打印

STORE_NAME:存储变量值,将栈顶的内容存入变量中

LOAD_NAME:读取变量值(从变量名列表找),将变量的内容压栈。

#假设object_operated_by_interpreter是编译结果(字典里嵌套列表,列表里嵌套元组)
object_operated_by_interpreter={
        #PyCodeObject中的co_code
        "co_code":[("LOAD_VALUE",0),#co_const中第一个值入栈
                   ("STORE_NAME",0),#出栈,将值赋给co_name中第一个变量
                   ("LOAD_VALUE",1),#co_const中第二个值入栈
                   ("STORE_NAME",1),#出栈,将值赋给co_name中第二个变量
                   ("LOAD_NAME",0),#从co_name中拿第一个值入栈
                   ("LOAD_NAME",1),#从co_name中拿第二个值入栈
                   ("ADD_TWO_VALUES",None),#出栈两个值,相加结果7入栈
                   ("PRINT_RESULT",None)],#打印7
        #先不考虑命名空间
        #PyCodeObject中的co_consts
        "co_const":[6,1],
        #PyCodeObject中的co_names
        "co_names":["a","b"]
}

解释器就是解释字节码指令序列,设计常量列表与变量名列表,用两个列表存储不同类型指令,常量列表的指令存储在bytecode_number_list里

3 Python虚拟机底层具体实现

对应PyEval_EvalFrameEx函数

//python3.12.4/python/ceval.c
PyObject *
PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
{
    //获取当前活动线程对应的线程状态对象--运行时环境
    PyThreadState *tstate = _PyThreadState_GET();
    return _PyEval_EvalFrame(tstate, f->f_frame, throwflag);
}
  • 运行时环境初始化(与原生操作系统线程有关

PyFrameObject中的域+堆栈的栈顶指针

------待具体写

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值