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

08|函数和栈帧:深入区分函数的静态描述和动态记录

你好,我是海纳。
前几节课我们实现了 Python 虚拟机基本的功能,从这一节课开始,我们将开始实现函数的功能。函数是编程语言最重要的特性,它是对逻辑的封装,也是构成一个复杂软件的基本元素,所以它的重要性可想而知。
在实现函数功能之前,我想通过这一节课把函数和栈帧之间的关系深入地讲解清楚,这样你在实现函数的时候,头脑中才能有清晰的全景图。
我相信,你在工作中肯定遇到过栈溢出(StackOverflow)的错误,比如在写递归函数的时候,当漏掉退出条件,或者退出条件不小心写错了,就会出现栈溢出错误。我们也经常听说缓冲区溢出会带来严重的安全问题,这在日常的工作中都是要避免的。

函数与栈帧

当我们在调用一个函数的时候,CPU 会在栈空间里开辟一小块区域,这个函数的局部变量都在这一小块区域里存活。当函数调用结束的时候,这一小块区域里的局部变量就会被回收。这一小块区域很像一个框子,所以大家就命名它为 stack frame。frame 本身是框子的意思,在翻译的时候被译为帧,现在它的中文名字就是栈帧。
所以我们可以说,栈帧本质上是一个函数的活动记录。当某个函数正在执行时,它的活动记录就会存在,当函数执行结束时,活动记录也会被销毁。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

1. 函数的栈帧是函数执行时在栈空间中开辟的一小块区域,用于存储函数的局部变量,当函数执行结束时,栈帧被销毁。 2. 在函数执行过程中,如果调用了其他函数,会在当前函数的栈帧下方创建新的栈帧,只有当被调用的函数执行结束后,其栈帧才会被销毁。 3. 递归函数的执行过程中会存在多个同时活跃的栈帧,理解递归函数的执行过程有助于深刻理解栈帧与函数的关系。 4. 回溯法是一种广泛应用的算法,可以用于搜索剪枝操作,解决全排列等问题。 5. 在回溯法中,通过使用函数栈来实现全排列,每一层的作用是确定结果数组对应位置的数,通过回溯步骤来生成所有可能的排列。 6. 函数执行时所使用的活动记录遵循后进先出的原则,即后创建的栈帧先被销毁,这正是栈数据结构的特点。 7. 函数栈帧的活跃记录是函数栈的重要组成部分,理解函数栈帧对于理解函数执行过程和内存空间的创建和销毁具有重要意义.

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

全部留言(1)

  • 最新
  • 精选
  • Se7en
    海纳老师,没有编译器相关工作经历该如何去准备面试或者入行,对llvm和gcc还算熟悉
    2024-05-22归属地:北京
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部