补全:CALL

(每道题开头都有同一段:06 的词法/语法/show、Env、RunError;本条加的 compile_expr / compile_stmt / compile_block / compile_program(树 → 指令列表)、lis

开始练习 →

补全:RETURN 和 MAKE_FN

(每道题开头都有同一段:06 的词法/语法/show、Env、RunError;本条加的 compile_expr / compile_stmt / compile_block / compile_program(树 → 指令列表)、lis

开始练习 →

补全:记下最长的帧名串

(每道题开头都有同一段:06 的词法/语法/show、Env、RunError;本条加的 compile_expr / compile_stmt / compile_block / compile_program(树 → 指令列表)、lis

开始练习 →

运行时是什么

VM 之外还有一堆东西在替程序干活:分配对象的内存、回收没人用的、维护调用栈、报错。这一整套叫「运行时」。它和 VM 的关系是【0】。

开始练习 →

引用计数怎么回收

(这一节用一个自造的小堆 Heap 模拟运行时:alloc(名) 造对象,link(持有者, 名) 让持有者引用它(持有者 None 表示「根」,比如一个变量),unlink 解除引用;计数归零就 free,free 会连带解除它对别人的引

开始练习 →

引用计数的死角

(这一节用一个自造的小堆 Heap 模拟运行时:alloc(名) 造对象,link(持有者, 名) 让持有者引用它(持有者 None 表示「根」,比如一个变量),unlink 解除引用;计数归零就 free,free 会连带解除它对别人的引

开始练习 →

看计数归零

(这一节用一个自造的小堆 Heap 模拟运行时:alloc(名) 造对象,link(持有者, 名) 让持有者引用它(持有者 None 表示「根」,比如一个变量),unlink 解除引用;计数归零就 free,free 会连带解除它对别人的引

开始练习 →

真的环,真的回收器

用真 Python 看引用环:两个对象互相引用、外面的名字都删掉,弱引用还活着吗?gc.collect() 之后呢?(弱引用不计数,对象没了它就变成 None;列表不能被弱引用,所以用一个小类) import gc, weakref c

开始练习 →

补全:释放的连锁

(这一节用一个自造的小堆 Heap 模拟运行时:alloc(名) 造对象,link(持有者, 名) 让持有者引用它(持有者 None 表示「根」,比如一个变量),unlink 解除引用;计数归零就 free,free 会连带解除它对别人的引

开始练习 →

补全:从根出发标记

(这一节用一个自造的小堆 Heap 模拟运行时:alloc(名) 造对象,link(持有者, 名) 让持有者引用它(持有者 None 表示「根」,比如一个变量),unlink 解除引用;计数归零就 free,free 会连带解除它对别人的引

开始练习 →