Continuation

续体 Continuation 英国作家叶芝说:“教育不是注满一桶水,而是点燃一把火。” 但是你必须先“给桶注一点水“。 ——-《Operating System: Three Easy Pieces》 对于我这样一个PL门外汉来说,读王垠的博客可以用丰收(Harvest)来形容。 如同普罗米修斯为无知的人类带来智慧的火焰,引导人们向未知前进。 很多人说,难以理解Python的generator,难以理解Coroutine。 然而,在我们理解了续体后,一切都迎刃而解,generator不过就是Python团队空造出来的概念罢了;我们甚至可以利用这个概念,构造一个区别于Unix线程概念的操作系统(基于Coroutine的系统)。 什么是续体(Continuation) 任何的过程(procedure)都可以被抽象成一个自动机(Automata)。 过程的组成无非几点: (输入)/输出 一系列动作($state_A \rightarrow state_B$) 一系列状态($state_A,state_B,…,state_N$) 每个过程又被所谓的帧(Frame)包装,以便保存一些状态。 过程具有一个性质:一旦返回,内部的状态不留存。 例如,有如下C函数: int foo(int a) { int b = a + 1; return b; } 当函数返回时,b的值被返回出来,但是b不复存在。 如同插座一样,插头插入电源,电流流出,但插座里面的铁片还在原地。 于是,过程调用者(Caller)的状态可以被一种LIFO的结构,即栈结构保存。 然而,如果人们的认知止步于此,如同人们如果只甘心将数域扩充到有理数,无穷之谜无从解答,解析几何将烟消云散,微积分将失去基石,于是现代物理无从发展…直到计算机也无法发展,阁下将没有机会看到这篇文章 ;( 回归正题,与希帕索斯提出$\sqrt 2$ 一样,有人提出疑问,为什么一个”过程“非得返回就退出了? 如果您玩过电子游戏,直觉会告诉我们,电子游戏暂停之后,怪物们似乎并没有消失或是停止攻击动作… 类比过程,我能否让一个”过程“执行了一半然后先返回? 于是,“续体”的概念被扩充了出来,它是“过程”的泛化(generalization)。 看下面这段python代码: def foo(): i = 0 for j in range(5): yield i; i = i + 1 如果我调用它一次,它只会返回一个值(我不打算解释generator,因为那不重要)。 由于Python generator的机制,我需要利用迭代的方式函数才能得到每个返回值。 for i in foo(): print(i) # outputs: 0 1 2 3 4 实际上,每次循环的时候,都调用了一次foo() 。...

March 8, 2022 · 1 min · Noobi

【碎碎念】读《Java有值类型吗?》有感

观点: 通过实现“值类型”,实现inline优化,又不改变Java全是引用类型的语义。 论据 思想实验: int x = 1; // x指向内存地址A,内容是整数1 int y = x; // (记住这个y) y指向同样的内存地址A,内容是整数1 x = 2; // x指向另一个内存地址B,内容是整数2。y仍然指向地址A,内容是1。 System.out.println(x); System.out.println(y); // out: // 可以看到 // 2 // 1 引用类型特有那些操作? dereference;例如C中*a struct的分量访问和修改;例如,C中的a.foo = 1 而对于「基本类型」,以上操作均不能实现。 前者由于Java不提供;后者由于「基本类型」不是复合类型,也就无法实现。 引用= 的语义? 将引用绑定给一个新的对象。 那么我们的「基本类型」能做什么事情? 读取它的值 修改它的值 那么,实际上,值类型的实现和引用类型的实现本质上的结果完全一致。 由此得出结论,对于「基本类型」,值类型和引用类型等价。 对这篇文章的疑惑 语义上,我们难道不是按照值类型的语义来传递参数的吗? 难道按照引用传递,不属于引用类型的语义吗? public void test() throws Exception{ int x = 2; foo(x); // 传递了值 System.out.println(x); } public static void foo(int x) { x = 3; } // out: // 可以看见传递了值 // 2 参数传递的语义? 值传递:将值拷贝一份绑定给参数。...

February 13, 2022 · 1 min · Noobi