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

06|循环语句:控制流让虚拟机执行复杂的运算

你好,我是海纳。
上一节课我们介绍了控制流中的第一种基本结构——分支语句。这一节课我们会介绍第二种基本结构——循环语句。
Python 中有两种循环结构,分别是 while 语句和 for 语句。Python 中的 while 语句和其他语言中的 while 语句差不多,但是 for 语句却和 C、C++、Java 等常见语言有很大的区别,Python 中的 for 语句本质上是一个迭代器。我们要等到实现了类机制以后,才能实现迭代器,所以这节课我们的重点是实现 while 循环。

实现变量

要实现循环结构,首先就要实现变量。在每次循环中,变量都应该有所变化,这样才能在若干次循环以后,破坏循环继续的条件,从而跳出这个循环。接下来我们就实现这个变量机制。我们还是从一个最简单的例子开始。
a = 1
b = a + 1
print(a)
print(b)
我们按照以前的方法把它编译成 pyc 文件,然后通过 show_file 工具查看它的字节码。
1 0 LOAD_CONST 0 (1)
2 STORE_NAME 0 (a)
2 4 LOAD_NAME 0 (a)
6 LOAD_CONST 0 (1)
8 BINARY_ADD
10 STORE_NAME 1 (b)
3 12 LOAD_NAME 2 (print)
14 LOAD_NAME 0 (a)
16 CALL_FUNCTION 1
18 POP_TOP
4 20 LOAD_NAME 2 (print)
22 LOAD_NAME 1 (b)
24 CALL_FUNCTION 1
26 POP_TOP
28 LOAD_CONST 1 (None)
30 RETURN_VALUE
consts
1
None
names ('a', 'b', 'print')
varnames ()
freevars ()
cellvars ()
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

1. Python 中的循环结构包括 while 语句和 for 语句,其中 for 语句本质上是一个迭代器,而本节课的重点是实现 while 循环。 2. 实现循环结构需要先实现变量机制,确保在每次循环中变量都有所变化,从而在若干次循环后破坏循环继续的条件,跳出循环。 3. 实现变量机制涉及到字节码的存储和变量表的实现,其中变量表是一个以字符串为键的 map 结构,变量名存储在 CodeObject 的 names 列表中。 4. 为了实现变量表,需要先实现 map 结构,文章提供了一个简单的 map 实现方式,即直接使用数组实现。 5. 在变量表的基础上,进一步支持了 LOAD_NAME 和 STORE_NAME 两个字节码,其中 STORE_NAME 负责在局部变量表 locals 写入变量的值,而 LOAD_NAME 负责从变量表里取出值。 6. 实现了变量的功能后,可以进一步支持循环结构的实现,因为循环结构的实现依赖于循环变量的迭代修改。 7. 实现了循环结构的字节码,包括 POP_JUMP_IF_FALSE 和 JUMP_ABSOLUTE 等指令,以支持循环体的正常执行、continue 和 break 语句的跳转。 8. 通过分析 continue 和 break 语句的实现,以及对应的字节码指令,加深了对循环控制流的理解。 9. 文章总结了实现循环语句的关键步骤和指令,以及对应的字节码指令的作用,为理解虚拟机的计算能力奠定了基础。 10. 思考题提出了老版本的Python字节码中的BREAK_LOOP指令,并引发了对新版本虚拟机中不需要这条指令的思考,为读者提供了进一步思考和探索的机会。

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

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部