Replying to f6XF

之前有一个对 Matrix 有所了解,却对他们的“科技实力”过度夸大,相信各种夸张的阴谋论的人,对我说:“你这样公开指出 Matrix 的各种太空骗局,疫情骗局,化学尾迹之类,我怕他们会特别「照顾」你……” 他的意思是,他们会暗害我。在疫情封控期间,还有另一些人有类似的说法,建议我别说话。我还真是有点怕有人暗害我,所以有些事情当时没有挑明。

但我现在不怕了。我已经不怕死,他们能奈我何?世界已经被 Matrix 操纵了至少一百年,人类已经沦落到今天的地步。疫情的三年,封控的两月,基本的人身自由和健康权益被以各种借口残酷地侵犯,世界层出不穷的各种怪事,各种大戏继续上演。继续在这样的世界上活下去,本来已经没有了意义,死又有什么可怕的呢?也许“死后”我才发现自己从一个教室样子的地方醒来,全班同学在对我鼓掌,老师对我说:“你真是好样的!祝贺你,以优异的成绩毕业了。这堂课的主题叫做「不要迷信权威」。” 也许,人生就是这样一堂课,一场梦,我们是来学东西的。

所以我感谢这些人的好意,但我觉得他们这样的想法是不明智的,对于大家和自己都不好。我们正在被一个秘密犯罪团伙侵害,却有人觉得我们作为受害者,不应该声张,不应该让其他人知道这件事。这样的畏惧心理,只会让这个团伙更加嚣张,肆无忌惮。这当然不是对待犯罪分子的正确态度。这就像一个女孩子在公交车上遇到流氓,却因为怕被“报复”,所以忍气吞声,不敢公开与之对抗,让大家都来唾骂这流氓,将他绳之以法。如果她当时果断使用防身术,这流氓最后被大家打残废了,事后流氓会报复她吗?不会的,因为流氓也知道自己是流氓,被揭穿,挨打是活该的。

Matrix 的成员当然知道自己是犯罪团伙,他们制造出这些大戏来残害民众,被人看穿,揭发也是活该的。所以实际上没有人会暗害我,也没有人会暗害那些声援我,转述这些信息的人。我只是一个普通的民众,我手里没有任何机密文件,我只是看到一些大家都能看到的事情,我说出来了而已。一旦我说出来,很多人就都知道了,这些事情每个人都看得见。暗害我又有什么用呢?他们不能暗害所有知道这信息的人。要是我们任何人遇到莫名其妙的危害,那其他人就更确信这个犯罪团伙的存在了,就会有更多的人站出来说话。我们的朋友,家人,老师,学生,所有认识我们的人,都不会放过他们。

这就像《皇帝的新装》里的那个小孩,他说:“可是皇帝什么衣服都没穿啊!” 结果大家都知道是怎么回事了。请问,有人会去暗害这个小孩吗?当然不会。

要明白的是,这些人是犯罪分子,他们是见不得光的,而且他们没有很厉害的武器。他们仍然必须假装这个世界是有法律的,所以他们甚至不能妨碍我的日常生活。否则他们就会被察觉,人们就会更加确认他们的存在。甚至微博都不能明显地删除我谈论 Matrix 的帖子,否则就等于承认了微博是 Matrix 的成员之一。“言论自由”是一个假象,但 Matrix 必须继续演出它。至少他们得演出其中的一部分,不能赤裸裸地暴露自己害怕人们知道某些事情,不然人们就会更加确信这些事情是真的。

我曾经还因为这些人的说法,开始胆怯,有段时间不敢用微信跟朋友聊这些事,聊这些事都用 telegram。但后来有个朋友跟我说,干嘛要用 telegram 啊,又不是只有你一个人知道这些事,其实完全没有必要担心的。虽然微信一直在监视信息,但他们不能让大家明显地察觉他们在监视信息,他们也不能根据这些信息进行任何不利于我的动作。他们甚至不能阻止这些信息到达指定的接收者,否则他们在监视信息的事实就会赤裸裸地暴露出来,他们想阻碍人们知道什么样的信息,就会被发现,进而既成事实。所以何必怕在微信说这些事呢,自己给自己添麻烦而已。而且微信上聊这些的人如果多起来,反而会让 Matrix 害怕。因为他们是见不得光的,所以偏要在微信说这些事,就是要让他们知道:“我们都知道!” 听了她的话,我才恍然大悟,我确实没必要担心的。

所以,那些人的“忠告”或者“建议”,让我“保护自己,不要说话”,我觉得其实是在对我变相进行恐吓,是在助长犯罪团伙的气焰。当有人再三给我这样的信息,后果就是被我删除,因为我已经分不清他们是朋友,学生,还是 Matrix 雇佣来封我的嘴的人。我不需要这样的“朋友”,我不需要他们的“建议”,我不认识这样的人。

我知道有很多人看到类似的信息,可能心里已经明白,却因为害怕被暗害,不敢告诉其他人,甚至不敢点赞。我也曾经是这样的人,但是我现在不再畏惧了。如果世界继续这样被 Matrix 操纵,人生本来就没有了意义。人生如戏,把想说的话都说出来,造福世界,又何乐而不为呢?我希望大家也都明白这个道理,我们其实很安全。让越多人知道这些事,我们越是安全。

《回忆 CPSer》http://t.cn/A6Yj3WjI

CPSer 也就是人称“王垠 40 行代码”,是我在 IU 的时候自己独立想出来的“自动 CPS 变换”,而且它没有所谓 administrative redex。换言之,就是生成的代码没有多余的开销。

CPSer 本来是 Dan Friedman 给我们的一个“Brain Teaser 练习”。我辛辛苦苦花了一周时间独立写出来之后,发给 Friedman,结果他都懒得看我的代码。他以为我没什么机会直接做对,所以给我一篇 30 多页的 paper(Olivier Danvy and Andrzej Filinski: Representing Control: A Study of the CPS Transformation),让我去看。

这篇 paper 就是这个“无 administrative redex 自动 CPS 变换”的来源,但作者是从几十年前最老的 Gordon Plotkin CPS 变换出发,经过了太多聪明的“优化”之后得到的。因为我直接得到了他最后的结果,所以我没有心思去看他是怎么一步步从复杂做法得出结果。我并没有认真去读这篇论文,到现在这篇论文还看得我眼花。

因为历史上太多学生(包括我的所有同届博士生同学)做这个练习,都自称写出了 CPSer,结果却都是错的,所以 Friedman 对我声称“独立写出来”也不以为然,他开头以为我肯定也是错的。经历过太多“狼来了”的故事,他已经不相信任何学生能自己把它想出来。毕竟,人家是经过了十多年研究,写了 30 多页的 paper 才说清楚的事情,哪能让你才上第一门课,中间一周就写出来的?

然而我的 CPSer 却是正确的。我很清楚它是正确的,因为我已经把之前手动 CPS 的作业放进去过,它会输出像手写 CPS 代码一样的结果,没有任何多余的部分,而且运行结果正确。它不但是正确的,而且我的思路是直接的。我从来没有写出过 Gordon Plotin 最早的,有很多 administrative redex 的 CPSer,也就是 Danvy 和 Filinski 那篇论文的出发点。

但我有点画蛇添足,因为我的 CPSer 不但能转换 lambda calculus,而且能把完整的 Scheme 代码转换成能运行的 CPS 代码。为此我需要实现针对多参数函数,begin 等构造的转换,而不只是简单的单参数 lambda calculus 函数。

Friedman 的练习说明只说写一个 CPSer,并没说他其实只要求转换 lambda calculus。所以当我把代码给他看的时候,他看都没看就给我打回来,说“太复杂了”。经过一番争辩之后,我才发现原来他只要求我们转换 lambda calculus。于是我就把它删减到只转化 lambda calculus,还加了一点点优化,最后就只剩下 40 行了。

又过了一段时间,Friedman 终于看了我简化后的代码,才认识到我做的是对的。他让我在 B621 (高级编程语言课)上讲我的代码,告诉同学们认真听,对大家说:“好好听,Yin 这个代码价值 100 美元!”

它的价值显然不止 100 美元。后来上 Kent Dybvig 的编译器课,大家都跟着他的方法写转换的时候,我用 CPSer 的思维方式,用一个 pass 就做出了他们好几个 pass 才能完成的变换,而且还顺带实现了他们没法完成的优化。注意其实我不是直接用的 CPS,而是用的它的“思路”,我在编译器里写的东西更像是“ANF 变换”。

逃不掉的 CPSer 思路

2022 年疫情封控期间,我开进阶班讲 CPSer 的时候,自己又去看了一下 IU 的新编译器课程的录像。Kent Dybvig 已经不教课了,是 Jeremy Siek 主讲的。Jeremy Siek 当年也是从 Dybvig 的课程学会的编译器,所以他是按照 Dybvig 的方式来讲课的。当然,他不会假设同学能理解 CPSer。他自己理不理解 CPSer 都是个问题。😄

那我为什么看这录像呢?因为我想复习一下编译器,而且我想知道我上编译器课的时候是不是有点发挥过度,拿着锤子看什么都是钉子。也许其实不用 CPSer 的思路也能写出编译器,而且更简单呢?

当年 Dybvig 的课程助教 Andy Keep 每次看我的作业都头大,后来有次他不经意地提到“一堆复杂烧脑的 evaluation context”,显然就是在说我的代码。所以我后来想,也许他们的做法其实比我的简单呢?也许 Dybvig 在这里其实高我一招呢?世界上这么多编译器,他们的作者显然不懂什么 CPSer,所以不懂 CPSer 应该也能写出编译器来才对啊。也许我当时是 over-engineer 了。

所以我看了一些 Jemery Siek 的课程录像。的确,他的第一步是简单的,根本不需要 CPSer 的思路。但它的变换只得到一个转换到一半的中间结构。我以为从这个中间结构到最后的结果不会很麻烦,结果我错了。接下来的几节课的内容,我就看糊涂了。

因为第一步得到的中间结果,和后来的中间结果,都是一些“没有原则的构造”,所以到后面你就搞不清楚他在做什么了。恍惚中我发现,他后来的某个步骤中,其实用很笨的办法实现了本质是 CPSer 的变换。所以,最后我发现 CPSer 的思想是必不可少的,就算你以为最开头的步骤可以更容易,到后来还是逃不掉,而且更加难以理解。

为什么没人意识到这一点呢?毕竟上过编译器课的人毕业后很少有工作写编译器的。很快也就忘光了。

所以,虽然我承认 CPSer 的思路不容易理解,但不用 CPSer 的编译器其实更难理解。然而一旦你理解了 CPSer,你会发现它非常的优美和简单。

世界上还有谁真会 CPSer?

我发现极少能在网络上找到关于 CPS 变换的信息。除了 Danvy 和 Filinski 那篇看不懂的 paper,你能搜出来的可能就是 Matt Might 的 blog 文章了。他的 blog 里面又是 CPS 又是 ANF 的,写得好像自己很懂的样子。然而你能看懂他在写什么吗?不能。他只是直接给你一个最后的结果,而这可以直接从 Danvy 和 Filinski 的论文里抄来。他从来没有解释这个变换的原理,它的思路是什么。

看了他的几篇文章之后,感觉跟 ChatGPT 的输出挺像的了。这些 blog 文章好像只是为了让人们觉得他懂很多东西,很厉害,而并不是为了让人看懂。我友好地猜测,Matt Might 也许是理解 CPSer 的,他只是不想让别人看懂。

Continuation 专项班讲 CPSer 的原理

所以,大家应该明白 CPSer 的价值了,它显然不止 100 美元。没人愿意免费把它的原理放在网上。我也不愿意让人免费得到这样的知识,这就是为什么我的 Continuation 专项班是收费的。历经了这么多艰辛得到的东西,免费给别人就是对自己的不尊重。

而且 Continuation 专项班是一个有系统的设计,是循序渐进的。我不但告诉你 CPSer 的原理,而且告诉你怎么写 ANFer。这两个东西其实就是编译器的精髓。

当然,Continuation 专项班不止讲 CPS 变换,而且包含了非常简单而高明的并发调度,delimited continuation 等内容。弄明白了之后,Go 语言里的 goroutine 之类都知道如何实现了。我们亲手在解释器里实现 call/cc 和 shift/reset,这都是网络上找不到的信息。

所有这些名牌大学念完博士都学不到的宝贵知识,收费还非常合理。这么好的事情,世界上还有哪里可以找到?😄

Reply to this note

Please Login to reply.

Discussion

No replies yet.