Replying to f6XF

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

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

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

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

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

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

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

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

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

《我看过的 Rust 的历史》

Rust 语言最近相当火热,被很多人认为是会在未来取代 C/C++ 的语言。好像是个公司就得用 Rust 做“后端”,没有其它选择了一样。这不得不让我想起 Rust 最早时候的历史,以及最近我发现的 Rust 语言的严重设计问题。

2009 年我还在 IU 的时候,有两个半路出家的同学,本科都不是计算机专业的,在 Dan Friedman 的课上完全迷糊,痛苦不堪那种。每每在课上讲自己对于 Friedman 给的“脑筋转弯题”的结果,我也在场的时候,他们声音都是发颤的,因为他们一本正经好像自己很懂,却又怕被我问出破绽来。他们也声称做出过 CPSer,最后给出的结果却是错的。仔细观察,我发现他们根本不理解里面的原理,只是做了个“样子”,像有那么回事而已。

然而这样的人确实很会拍胸脯,会把握关键词,时机和人际关系。所以后来暑假结束时,我忽然收到通知,他们要给大家做一个关于“Rust 语言”的讲座。原来那个暑假,他们两个去了 Mozilla 实习,项目就是开发 Rust 语言。那就是我第一次听说 Rust 语言。

然而他们做的这个 Rust 的演讲却空洞无物,全是大口号。他们的幻灯片上画了一个大三角形,提出 Rust 的”三大特色“,当然其中包括了”安全“(security),另外两个我不记得了。当时,他们号称 Rust 使用静态分析,实现了完全没有 GC(垃圾回收)的内存管理。整个讲座就像是商业宣传,没有任何实质的技术内容,全是口号。

看了这个讲座,我根本不觉得 Rust 这语言能发展下去。我觉得就是 Mozilla 瞎扯淡一阵子而已,说要用这新的语言开发一个浏览器内核,结果一直也没做出来。Mozilla 有很多类似的“研究项目”,最后都不了了之。之前一篇文章提到过的 DrJS 静态分析也是其中一个例子https://yinwang.org/posts/cfa。

Rust 的设计者是谁,他有什么功底?他对语言理解有多少?我根本看不出来。如果他真的透彻理解了编程语言,他应该不会选择 OCaml 那样的语言来实现 Rust 的第一个版本。

很多年后,虽然浏览器仍然是 C++ 写的,却没想到 Rust 居然在其它地方热门起来了。

后来这其中一个 Rust “先驱”同学开始做一个针对 GPU 的语言,号称要让 GPU 可以实现复杂的,类似树或者图那样的数据结构,实现通用的计算。我一看就不像是可以成功的项目,因为 GPU 设计来就是做非常简单的事情的,不能用来实现复杂一点具有依赖关系的数据结构,否则就不能并行计算了。当然最后那项目根本不能用,但他还是靠那东西拿到了 PhD。后来 Rust 居然热门起来,所以他就在某大公司继续从事 Rust 编译器的开发。

“完全没有 GC,静态的内存管理”,这其实是我那时候最感兴趣的话题。我也不满意 Java 等语言的 GC 带来的随机停顿,所以我花了挺多时间来琢磨内存管理应该如何设计,这样可以完全依靠静态分析,不需要任何动态的垃圾回收。这个理想,就像 Rust 当时所号称的那样。

我琢磨了一段时间,实验了各种内存模型和静态分析。然而最后,这一切的梦想都被 Kent Dybvig 的一句话打破了。我还记得,我在 Kent 的办公室里说:“我想实现这么一个完全依靠静态分析,不用 GC 管理内存的语言。” 结果 Kent 冷静地说:“完全静态的内存管理,这可能吗?内存管理本来就是一个动态过程。“

听了这话,我才开始反省之前的理想。我重新分析了编程语言的内存模型,发现它确实是一个不可计算的动态过程,等价于“停机问题”。这么简单的道理,我为什么没想到呢?

我又提出,也许应该使用自动的引用计数进行内存回收,这样就不会有 GC 的随机停顿了。Kent 又告诉我,引用计数是有比较大开销的,很多时候性能还不如 GC,使用 GC 根本就不是问题,主要看你怎么实现它。

看来我思考过的一切,Kent 都已经思考或者经历过了,毕竟他开发 Chez Scheme 的编译器和 runtime 已经超过 30 年之久。我不得不佩服他的 Chez Scheme 编译器,它不但具有闪电般的编译速度,而且有合理的 GC 设计。它的垃圾回收器不但效率高,而且是可以让用户自己配置的。如果 GC 出现长时间停顿,用户可以通过调整参数改变它的行为。

Chez Scheme 为什么编译速度这么快?Kent 的回答是:因为它不做那些针对“愚蠢代码”的耗时的优化,它假设程序员有基本的素养,只做稍微聪明一点的,不很费时间的优化,而且它选择了正确的数据结构。总的说来,Chez Scheme 只能说是“不傻”而已。

我猜,他没说出来的话是,其它的编译器都比较傻。

所以 Chez Scheme 这一切优势,都来自于设计的智慧,而不只是“聪明”和蛮干。它并没有实现特别高级的“技术”,它的优势来源于选择了正确的方向。

然而看看现在的 Rust 呢?很显然,当年的“完全静态分析”实现内存管理的理想已经破灭,Rust 也需要使用引用计数(Rc,Arc)。就像 Kent 说的,完全静态的内存管理是不可能的。

而且 Rust 还有“unsafe 代码”,因为已有的静态分析造成的限制,让它无法写出所有需要的代码,所以很多时候不得不跳出安全机制,使用“unsafe”关键字,使用没有静态安全保证的代码。最新的 PL 研究,有一些就是针对 Rust 这些 unsafe 区域的,什么 Stack Borrow,Tree Borrow 等概念。然而它们做的其实是加入一些限制,结果你又没法写出应该可以表达的代码了。这很像 Haskell 社区,给 Hindley-Milner 类型系统做出各种“宽容”的改动,稍微放宽表达能力,但仍然无法逃脱它的局限性,反而搞得更难理解。

然而即使一再地后退,又有引用计数,又有 unsafe,Rust 社区却仍然坚持使用“完全静态保证”这样的广告词。如果你指出这些例外情况,他们就改口说:这是 Rust 的哲学。

Rust 社区的“静态保证”口号传播如此广泛,如果你有异议,就连刚入门的编程新手都会来“教育”你。甚至不需要人来教育你,如果你跟 ChatGPT 说这事,它都会跟你说:这就是 Rust 的哲学!你觉得不对那是因为你不懂它的哲学,所以你觉得理解很困难。

“哲学”,好一个高大的词汇。也就是说,这是一个“理想”或者希望做到的事情,一直没有做到,而且把事情越搞越复杂。但这是一种哲学,所以你得崇拜和顺从我们!

这就是为什么我虽然完全理解 Rust 的所谓“借用”,“生命周期”等概念,现在又有了 AI 工具可以帮我折腾,却一直不用 Rust。因为我不需要极致的性能,而且就算我需要,我也不相信 Rust 真的可以取代 C/C++。

在“计算机科学基础班第5期”透彻地教会了大家 Rust 的内存管理机制,甚至用 Rust 写出了函数式语言的解释器这么复杂的代码之后,我却更加欣赏 C 和 C++ 了。如果真有需要极致性能的场合,我会选择 C/C++,而不是 Rust。

Reply to this note

Please Login to reply.

Discussion

No replies yet.