程序执行模型可视化

执行模型描述程序运行时的含义。源代码是静态文本,执行则包含当前行、名称绑定、对象修改、分支和输出。本组课程先展示这个过程,再为循环、数据结构和递归打基础。

先学会跟踪程序计数器,再区分名称和它指向的对象。这两个概念能解释许多初学时的困惑,也能避免把变量理解成“装着值的盒子”。

如何阅读执行模型课程

每一步都问两个问题:

  • 现在执行哪一行?
  • 程序改变了绑定、修改了对象,还是只读取状态?

当前行指出动作的位置,状态面板或名称与对象图说明动作的结果。两者应当一致,否则执行记录就有问题。

执行模型课程

课程核心概念观察重点
执行轨迹程序计数器移动,语句依次执行循环回跳、退出跳转、变量更新和输出
变量与修改赋值改变名称绑定;修改作用于已有对象修改对象时绑定箭头不动,重新绑定时箭头移动
数组与索引非负索引从 0 开始,长度是越过末尾的第一个索引range(len(values)) 在没有槽位的边界前停止
循环与不变量在检查点成立的条件,把重复更新连接成结果的证明已证明的前缀、下一个候选值,以及变为假的循环条件

先学执行轨迹,认识调试器中的当前行、当前状态和已执行语句记录。

再学变量与修改。程序计数器驱动内存图的变化,共享列表展示别名关系。对比不可变整数,可以看到:仅凭运算符的写法,无法判断更新是否修改了原对象。

接着学数组与索引。在默认的三个槽位中,i 是坐标:0 指向第一个槽位,2 指向最后一个,3 不对应任何槽位。演示先在 3 之前停止,再尝试 values[3],触发 IndexError。由此理解 range(len(values)) 为什么不会访问这个越界位置。

最后学循环与不变量。此时 i 标记证明的边界。扫描最大值时,先为第一个值建立条件,每加入一个候选值就恢复该条件,最后利用循环条件为假,将前缀上的结论扩展到整个列表。错误的 best = 0 版本展示证明在哪一步失效。

全部执行模型可视化课程

选择下面的课程,每次前进一步。除了值如何变化,还要问:这个值属于哪个对象,哪些名称仍然能访问它?