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

09|函数对象 :函数是依赖什么成为第一类公民的?

你好,我是海纳。
上一节课我们介绍了函数的静态代码和动态记录之间的区别,以及通过递归函数的执行过程,深入介绍了栈帧的组织结构,这一节课我们就通过编写代码实现相应的功能。
在 Python 中,函数(function)和方法(method)的意义是不同的。类中定义的成员函数被称为方法,不在类中定义的函数才是我们平常所说的狭义的函数。方法是建立在类机制上的,所以函数比方法要简单一些,这节课我们就从函数开始实现。

实现函数功能

我们先从一个最简单的例子开始,定义一个函数,让它打印一个字符串。
def foo():
print("hello")
foo()
将这段代码存为一个文件,名为 func.py,然后使用 python -m compileall func.py 命令,把这个文件编译成 func.pyc 文件。再使用 show_file.py 工具,查看 func.pyc 文件的构造。
1 0 LOAD_CONST 0 (<code object fo>)
2 LOAD_CONST 1 ('foo')
4 MAKE_FUNCTION 0
6 STORE_NAME 0 (foo)
4 8 LOAD_NAME 0 (foo)
10 CALL_FUNCTION 0
12 POP_TOP
14 LOAD_CONST 2 (None)
16 RETURN_VALUE
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

1. Python 中函数(function)和方法(method)的意义不同,方法是建立在类机制上的,函数比方法要简单一些。 2. 实现函数功能时,需要关注字节码的构造和实现 MAKE_FUNCTION 和 CALL_FUNCTION 这两个字节码。 3. 在虚拟机执行器中,需要实现 FrameObject 数据结构来记录函数的调用过程,每次函数调用都会创建一个 FrameObject,每次函数执行结束,相应的 FrameObject 也会被销毁。 4. FrameObject 对一些状态变量进行封装,包括代码执行时的 pc、locals 等变量。 5. Interpreter 的 run 方法需要修改,将相关变量转移到 FrameObject 中,如 stack 等. 6. 创建 FunctionObject 有了代表栈帧的 FrameObject 和代表代码的 CodeObject,分别用于描述动态的活动记录和静态的代码信息,对于普通的编程语言就已经够了。 7. FunctionObject 是一个真正的虚拟机对象,可以被变量引用,也可以被添加到列表中,所有可以对普通对象进行的操作,都可以施加到 FunctionObject 上。 8. 一个 CodeObject 可以对应多个 FunctionObject。 9. MAKE_FUNCTION 的实现通过 CodeObject 创建一个 FunctionObject.

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手写 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
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)