重新创造Lisp1: Rick & Morty
作者:何岩,recreating.org出品,谢绝转载。
0.前言 #
为了表达计算机科学的全局定位感,我将以SICP(Structure and Interpretation of Computer Programs)为内核,用故事的形式来进行重构。
故事的人物原型采用动画片:Rick & Morty
1.Rick & Morty #
Morty家的车库是Rick的工作室。
木头桌子上,一个发光的立方体,电脑连着立方体,Rick盯着电脑。
“那是什么?” Morty问。
“我做的小宇宙。” Rick说,”给太空船当电池。”
“嗯…怎么有点不正常呢?“,Rick拿出两支蓝牙耳机:”从外面看不出问题,我们得进去一趟了。把这个插在耳朵里。
”这是什么?“,Morty问。
”MI (即,意识转换器,英文全称:Mind Interpreter),用来把我们的意识连入小宇宙。”,Rick说。
两人戴好MI,按下按钮,立刻失去了意识,倒在了地上。
2.BUG来自GC(垃圾回收器) #
Rick和Morty恢复意识的时候,发现已经置身于一家咖啡馆,墙上写着Recreating Cafe。
牛头人端着咖啡,走过来:“Rick,你可来了!最近发生了一些可怕的事情。”
牛头人是宇宙联邦的通缉犯,为了不连累家族被灭,五年前自首,后被处死,自首之前,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前三章的精华挂接上来。