重新创造Lisp1: Rick & Morty

作者:何岩,recreating.org出品,谢绝转载。

0.前言 #

为了表达计算机科学的全局定位感,我将以SICP(Structure and Interpretation of Computer Programs)为内核,用故事的形式来进行重构。

故事的人物原型采用动画片:Rick & Morty

RickAndMorty.jpeg

1.Rick & Morty #

Morty家的车库是Rick的工作室。

木头桌子上,一个发光的立方体,电脑连着立方体,Rick盯着电脑。

“那是什么?” Morty问。

“我做的小宇宙。” Rick说,”给太空船当电池。”

“嗯…怎么有点不正常呢?“,Rick拿出两支蓝牙耳机:”从外面看不出问题,我们得进去一趟了。把这个插在耳朵里。

”这是什么?“,Morty问。

”MI (即,意识转换器,英文全称:Mind Interpreter),用来把我们的意识连入小宇宙。”,Rick说。

两人戴好MI,按下按钮,立刻失去了意识,倒在了地上。

2.BUG来自GC(垃圾回收器) #

Rick和Morty恢复意识的时候,发现已经置身于一家咖啡馆,墙上写着Recreating Cafe。

牛头人端着咖啡,走过来:“Rick,你可来了!最近发生了一些可怕的事情。”

niutouren.png

牛头人是宇宙联邦的通缉犯,为了不连累家族被灭,五年前自首,后被处死,自首之前,Rick帮牛头人把意识上传到了小宇宙之中,牛头人便在小宇宙中开起了咖啡馆。

“什么事?”Rick接过咖啡,品了一口:“ 嗯!牛头人,手艺又进步了!Morty快尝尝全宇宙最好喝的Recreating咖啡!”

Morty喝了一口,心想全世界的咖啡不都一个味吗。

牛头人没有等来Morty的赞叹,继续说:“大概一周前,一些人头顶会莫名的出现一个光环,几天之后,这些人会在同一个时刻…”牛头人打了个响指,“…就那么消失了!”

Rick瞪大了眼睛:“就像天使头上的那种光环吗?”

“对!对!就是那种!“

“Morty!快跑!这里不安全!”Rick摸着耳朵上的MI,按下了退出按钮。

Morty急忙学着做了同样的动作。

三个人面面相觑,什么也没有发生……

“Rick,这个耳机坏了吗!?”Mory问。

“MI没有坏,是小宇宙坏了!”Rick说。

“你可以修好它吗!!?”Morty问。

“不行啊!小宇宙的主程序Matrix并没有问题,问题出在辅助程序GC(垃圾回收器,英文全称:Gabage Collection)上,GC清理任何事物之前都会用光环进行标记。正常情况下只会标记没人用的物品和已经死亡的生命,现在GC好像疯掉了,竟然标记起了活人!”

“GC为什么不能修复呢?”牛头人问

“修复GC必须要在外面的世界,Matrix和GC是两个独立程序,他们同时运行在小宇宙这个硬件盒子里,你可以将他们看作是大盒子(硬件)里的两个平行存在的小盒子(软件),在外面的世界我们可以同时看到他俩,但是现在我们置身其中一个,也就无法看到另一个。”

“如果能回到现实世界,我就能修复它,GC其实很简单,我都能猜到是哪行代码出了问题。两周前我给GC做了升级,看来我还是犯了错误。”

“难道你当时没有进行测试吗?”牛头人问

“GC无法进行DEBUG(调试),只能靠脑子推算” Rick答到。

“Rick那么怎么办。我们会死在这里吗?”Morty问

“也许!GC现在是随机清理,但愿下一轮GC不要标记你吧!哈哈哈!刺激吧!”Rick说:“牛头人,再给我来一杯咖啡吧,死之前我想多喝几杯!”

3.那就重新写一个LISP版本的MI吧 #

“你犯的错误,你得修理好!我可不想死在这里!心里没数还要带我来!”Mory说

“你可是全宇宙最聪明的科学家,没有什么是你搞不定的”牛头人说

“闭嘴!没看到我正在思考吗?”眼珠子在Rick的脸上乱转了起来。

忽然,Rick想起了什么,在一张白纸上写起来:

#RECREATING.ORG
( + 1 2)
=>

几秒钟之后,答案“3”自动出现在了末尾处:

#RECREATING.ORG
( + 1 2)
=>
3

“哈哈哈哈!有救了!”Rick说。

“怎么回事?”Morty问。

Rick解释说:“万幸,Matrix中的Lisp解释器还能用。”
“MI之所以不好使了,是因为MI是用Python编程语言写的,GC将Matrix里的Python解释器搞坏了。Python解释器坏了意味着所有Python应用都变成了无意义的乱码。所以,即便MI自身没问题,也无法运行了。”

“不过幸运的是这里的Lisp解释器还能用,还好之前我在Matrix里给自己留了一个后门,只要出现#RECREATING.ORG这行文字,Matrix就会识别出那是一个Lisp语言,并将其传递给Lisp解释器来运行。这样以来,用Lisp重新写一个MI,我们就可以出去啦,一但出去,我会马上修复GC,牛头人就安全了。”

“希望GC不要再把Lisp解释器搞坏了。我得抓紧时间了!给我多拿些纸来,这里只能用手写代码了”Rick说。

“难道这个世界没有电脑吗?”Morty问。

“没有,这里的人们更怀念计算机发明之前的日子。所以这里被创造成了蒸汽时代。”Rick说。

“难道你不能先做出来一个计算机,然后用计算机来写代码吗?”Morty问。

“你是傻瓜吗?我连计算机都没有,我怎么造出一个计算机来?”

Rick看着一本厚厚的纸,拿起笔,说:“这感觉太糟糕了,一个厨师没有了刀和锅,就只能用石头和石板代替了。”

“那你加油吧!我出去转转,我还没见过蒸汽时代的世界”Morty站起来要走。

“转什么转,给我过来,你要跟着我写代码,还要搞明白这一切,万一在我写完之前就被GC杀死了,你要继续写完!然后到外面用克隆机把我复活!”Rick说

“可是我不会Lisp啊!虽然学校去年开了一门教C语言的编程课”Mory说

“Lisp是这个世界上最简单的语言,你学过C已经够用啦。跟着我,我会给你讲解的,难道你不想活了吗?”Rick说

“好…好吧!”

4.从一个简单的计算器开始 #

“我得想想,当初我是怎么设计的MI”Rick眼珠乱转。

“你不能查看Python版本的MI代码吗?”Morty问

“不能,MI和我们是平行的存在,就像我看不到眼前这只咖啡杯的代码一样”Rick说

Rick想了半天说:“我只能记得大体的设计思路,算了,让我们忘记过去重新开始吧!”

“我们从最基本的地方入手,那就是自然数的运算,从一个简单的计算器开始,然后一步一步,逐步添加更高级的功能,最终达到终点。这可真像是一场徒手攀岩。”

5.后记 #

Rick和Morty明确了自己要做的事,就是重新构建一个MI(意识转换器),首先从一个计算器开始,后面会加入各种复杂的功能,例如有理数的计算,复数的计算,解微积分等。通过构建MI将SICP前三章的精华挂接上来。

 
11
Kudos
 
11
Kudos

Now read this

重新创造比特币15:账本的同步

作者:何岩,由 recreating.org发行。 0.前言 # 上一篇描述了交易的同步,如果光是交易的同步是不够的,还需要考虑账本的同步 交易内存池代表着系统的当下,账本代表着系统的过去。 1.三个节点 # 咖啡馆,老板Bob给中本聪抱来了之前答应过的旧主机。中本聪接过老板怀中的主机,一顿表达感谢。 现在桌子上放着3台主机,由于桌子地方不够用了,第三台机器堆在了另外两台的上面,看起来像个金字塔。 中本聪对Gilfoyle说:“之前的2个节点已经可以正常的提供记账服务了... Continue →