手写 Python 虚拟机
海纳
华为资深编译专家,原 Huawei JDK 团队负责人
792 人已学习
新⼈⾸单¥59
手写 Python 虚拟机
15
15
1.0x
00:00/00:00
登录|注册

05|分支语句:控制流让程序具备基本的运算能力

你好,我是海纳。
上一节课,我们让虚拟机成功地加载并执行了标准 Python3.8 版本的字节码,我知道你已经迫不及待想继续实现对象系统,以支持整数和字符串等更多的数据类型了。但只实现完备的对象系统并不能让虚拟机看上去功能更加强大,而控制流却可以让我们做更多的测试,例如,支持了分支和循环语句以后,就可以实现一个计算 fibonacci 数列的程序。所以我们决定实现了控制流之后,再重新思考对象系统。
典型的两种控制流结构是分支选择和循环结构,这节课我们先研究分支语句是如何实现的。

分支语句

为了研究 Python 字节码是如何表达分支结构的,我们先创建一个包含分支语句的测试文件。
# test_if.py
if 2 > 1:
print(2)
else:
print(1)
print(3)
使用以下命令,把上述文件编译成 pyc 文件。
python -m compileall test_if.py
然后通过 show_file.py 查看这个文件结构,得到如下结果:
code
argcount 0
nlocals 0
stacksize 2
flags 0040
code
640064016b04721265006400830101006e08650064018301010065006402
8301010064035300
1 0 LOAD_CONST 0 (2)
2 LOAD_CONST 1 (1)
4 COMPARE_OP 4 (>)
6 POP_JUMP_IF_FALSE 18
2 8 LOAD_NAME 0 (print)
10 LOAD_CONST 0 (2)
12 CALL_FUNCTION 1
14 POP_TOP
16 JUMP_FORWARD 8 (to 26)
4 >> 18 LOAD_NAME 0 (print)
20 LOAD_CONST 1 (1)
22 CALL_FUNCTION 1
24 POP_TOP
6 >> 26 LOAD_NAME 0 (print)
28 LOAD_CONST 2 (3)
30 CALL_FUNCTION 1
32 POP_TOP
34 LOAD_CONST 3 (None)
36 RETURN_VALUE
consts
2
1
3
None
names ('print',)
varnames ()
freevars ()
cellvars ()
filename 'test_if.py'
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

1. 分支语句是控制流结构之一,通过分支选择和循环结构可以实现更多的测试和功能,如计算 fibonacci 数列的程序。 2. 通过分析 Python 字节码的实现,可以了解分支结构的具体实现方式,包括 COMPARE_OP、POP_JUMP_IF_FALSE 和 JUMP_FORWARD 等字节码的作用和参数含义。 3. 实现比较指令时,需要为每种比较操作提供相应的方法,并使用虚函数进行修饰,以实现各个对象的比较方式。 4. 实现跳转功能时,需要对程序计数器进行干预,使其指向期望的地址,从而实现控制流的跳转功能。 5. 分支结构所需的字节码包括 COMPARE_OP、POP_JUMP_IF_FALSE 和 JUMP_FORWARD,通过实现这些字节码可以完成分支结构的功能。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手写 Python 虚拟机》
新⼈⾸单¥59
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)