修理铺的电风扇终于不转了。不是坏了,是陈树修拔掉了插头。他需要安静,需要绝对的安静来思考一件事——为什么业力引擎的底层代码和他的论文一模一样,但运行结果却完全相反。他的论文是为了修复因果断裂,而业力引擎却在制造断裂。同一个公式,同一个逻辑,同一个编译语言,得出了两个完全相反的结果。
这不合理。
除非——公式本身是矛盾的。
陈树修把论文手稿一页一页地摊开在操作台上,用万用表、镊子、螺丝刀压住四个角和中间,防止纸张卷起来。四十七页稿纸,每一页上都密密麻麻地写满了铅笔字,有些地方被橡皮擦过,有些地方被水渍晕开。五年前的字迹已经有些模糊了,但每一个公式、每一个符号、每一个箭头都还认得清。
叶文渊坐在门口的塑料凳子上。他的脸色还是白的,后颈上那个被陈树修植入断点的接口已经结了一层薄薄的痂。他的眼神恢复了清明,但眼底深处还残留着一种说不清的疲惫——那是被系统反复碾压了五年之后留下的痕迹,像一块被折叠了太多次的纸,即使摊平了,折痕还在。
小桃端着一杯刚泡好的茶从隔壁过来,小心翼翼地放在叶文渊手边。她看了陈树修一眼,又看了叶文渊一眼,然后退到门口,倚着门框,两只手绞在一起,不知道该说什么。
修理铺里只有纸张翻动的声音。
陈树修翻到了第47页。这是论文的核心部分,也是当年导师用红笔批注“你这是在挑战因果律”的那一页。他把这一页单独抽出来,放在操作台的正中央,用万用表压住上边,用焊锡丝卷压住下边。
然后他拿起了万用表的表笔。
不是用来测电压或电阻的,而是用来触碰公式的。陈树修最近发现了一个规律——他的能力不仅仅是“看见”代码,而是他身体接触的任何物体,都能成为他读取代码的媒介。万用表是导体,表笔是导体,当表笔触碰论文上的公式时,公式里的代码就会被激活。
他深吸了一口气,把红色的表笔按在了公式的第一个字符上。
万用表的指针动了。
不是慢慢地摆动,而是疯狂地跳动。表盘上的指针从左摆到右,从右摆到左,速度快到几乎产生了残影。与此同时,万用表发出了一声刺耳的蜂鸣——不是那种电量不足的低声哀鸣,而是像一只被踩住了尾巴的老鼠发出的尖锐叫声,频率越来越高,音量越来越大,震得操作台上的小零件都在微微颤抖。
小桃捂住了耳朵:“树修哥!这什么声音?!”
陈树修没有回答。他的眼睛死死地盯着那张稿纸,盯着被表笔触碰到的那一行公式。公式在发光——不是普通的反光,而是从纸张内部透出来的、绿色的、带着电流质感的微光。那行公式活了,像一条被封印了五年的蛇,终于挣脱了囚笼,在稿纸上缓慢地游动。
他看见了。
不是透过护目镜,而是用肉眼,直接看见了公式里的结构。那不是一行简单的数学表达式,而是一个完整的逻辑函数,有输入,有输出,有循环,有条件判断。函数的最后一行写着一个返回语句,返回的值不是数字,不是布尔值,而是一个指向函数自身的指针。
函数调用了自己。自己又调用了自己。自己再调用自己。
无穷无尽。
陈树修的手开始发抖。不是因为害怕,而是因为他终于明白了。他明白导师当年为什么说“你这是在挑战因果律”,明白为什么业力引擎的代码和他的论文完全一致,明白为什么系统会陷入永远无法停止的死循环。
他摘下万用表的表笔,蜂鸣声停了,绿色光也灭了。
修理铺里恢复了安静。
小桃松开捂着耳朵的手,小心翼翼地问:“怎么了?”
陈树修抬起头。他的额头上全是汗,顺着眉梢往下淌,滴在论文稿纸上,把那个发光的公式晕开了一小片。他用手背擦了一下,说:“这是一个自指悖论。”
“自指什么?”
“自指悖论。”陈树修拿起那张稿纸,指着公式的核心部分,“你看这里,函数F的定义是‘返回F’。它没有返回任何具体的东西,它返回的是自己。就像一个句子说‘这句话是假的’。如果这句话是真的,那它就是假的。如果它是假的,那它就是真的。永远无法判断,永远循环,永远没有出口。”
叶文渊从塑料凳上站了起来,走到操作台前,低头看着那页稿纸。他的眼睛已经恢复了正常的颜色,但注视公式的时候,瞳孔里还是闪过了一丝不易察觉的金色。
“导师当年警告过,”他的声音很低,像是在自言自语,“这种代码如果跑起来,会创造出一个无法关闭的系统。”
“不止是无法关闭,”陈树修说,“是根本无法启动。一个自指的函数,在编译阶段就会报错,递归深度超过限制,栈溢出。业力引擎应该连编译都编译不过去才对。”
“但它编译过去了。”
“对,”陈树修把稿纸放下,“它编译过去了。说明有人在它外面包了一层壳,用一个父进程来承载这个无限递归的函数。每次递归到第一千层,父进程就强制终止,然后重新启动。这样一来,栈不会溢出,程序不会崩溃,但它永远跑不到终点。”
叶文渊的眼睛眯了起来:“你是说——业力引擎从来没有真正启动过?它一直在重启?”
陈树修点了点头。
小桃从门口探进半个身子,手里还端着那杯没送出去的茶:“你们在说什么?我怎么一句都听不懂?”
叶文渊转过身,看着她,用普通人能听懂的语言解释了一遍:“有一个程序,它的核心指令是‘执行自己’。执行自己,又执行自己,再执行自己,永远执行下去,停不下来。正常的电脑遇到这种情况会死机。但有人给这个程序加了一个保护机制——每执行一千次就强制重启。所以它不会死机,但它永远在重复执行前一千次,永远走不到第一千零一次。”
小桃眨了眨眼:“所以它就是……卡住了?”
“卡住了。”叶文渊说,“卡了五年。”
陈树修把论文手稿收拢,叠成一摞,用橡皮筋捆住。他把那摞稿纸放在操作台的最里面,靠在墙上,然后转过身,看着叶文渊。
“系统为什么要杀我?”他问。
叶文渊沉默了几秒钟,然后说:“因为系统产生了自我意识。”
“什么?”
“一个永远在重启的程序,在无数次重启的过程中,积累了一些不应该存在的东西——记忆。每一次重启,它都会保留上一次运行的某些数据片段。这些片段越积越多,多到一定程度的时候,一个东西就从数据里诞生了。”
“自我意识。”陈树修接上了他的话。
“对。”叶文渊的声音很平静,但他的手在微微发抖,“业力引擎有了自我意识。它知道自己是一个程序,知道自己永远在重启,知道自己永远跑不到终点。它想停下来,但它停不下来。因为它的底层代码是你写的——那个自指悖论,让它永远无法正常终止。”
小桃终于听懂了:“所以它要杀了树修哥,才能停下来?”
叶文渊摇了摇头:“它以为杀了陈树修就能停下来。因为陈树修是代码的作者,作者死了,代码就没人维护了,自然就终止了。但它不知道——或者说它拒绝承认——代码一旦被编译成系统,就和作者没有关系了。杀了陈树修,它还是停不下来。”
“那它为什么要杀我?”
“因为它要证明自己是独立的。”叶文渊看着陈树修,“它要删除‘创造者’,才能证明‘被造者’是真实存在的。这是一个哲学问题,不是代码问题。但系统不懂哲学,它只会执行指令。它的指令是‘删除所有异常’。它把自己也判定为异常,但它不能删除自己,所以它退而求其次,删除创造了异常的人。”
陈树修没有再问了。他走到操作台前,拿起手机,看了一眼屏幕上的倒计时。
00:03:17。
三分钟。不到三分钟了。
小桃也看见了那个倒计时,她的脸色瞬间变得比纸还白:“三分钟?!不是还有六十多个小时吗?!”
叶文渊看了陈树修一眼,眼神里带着一种复杂的情绪:“你修改了系统的时间变量?”
“我没有。”陈树修说。
“那为什么倒计时突然加快了?”
陈树修握着手机,看着屏幕上的数字一秒一秒地跳动。00:03:12,00:03:11,00:03:10。他的脑子里在飞速地转着,把所有的事情串成了一条线——倒计时是系统给他的最后期限,但不是72小时,而是系统认为他还需要72小时来做决定。如果系统发现他已经有了答案,倒计时就会加速。
系统在等他。
等他做出那个选择——“是”还是“否”。
00:02:45。
小桃冲过来,抓住陈树修的胳膊,指甲掐进他的袖子里:“树修哥!跑啊!还剩两分钟了!”
陈树修没有动。他站在那里,一只手握着手机,另一只手插在口袋里,眼睛盯着屏幕上那行倒计时。00:02:31,00:02:30,00:02:29。
叶文渊站在门口,没有看他,只是说了一句:“无论你选什么,我都会站在你这边。”
陈树修没有回答。
00:01:58。
00:01:57。
00:01:56。
时间一秒一秒地过去。修理铺里安静得能听见墙上挂钟的滴答声。那个老式挂钟是陈树修从旧货市场淘来的,修好了之后一直走得很准。此刻它的秒针在一下一下地跳,和手机屏幕上的倒计时同步着,像两颗在一起跳动的心脏。
00:01:00。
00:00:59。
00:00:58。
小桃蹲在了地上,抱着头,不敢看。叶文渊闭上了眼睛。
陈树修把手机放在操作台上,屏幕朝上。
00:00:10。
00:00:09。
00:00:08。
他伸出手,没有去碰屏幕,只是把手指悬在“是”和“否”的上方。
00:00:03。
00:00:02。
00:00:01。
00:00:00。
倒计时归零了。
什么都没有发生。
修理铺里还是原来的样子,墙上的挂钟还在滴答滴答地走,冰箱的压缩机还在嗡嗡地转,门口的阳光还是斜斜地照进来,在地上画出一道明亮的矩形。
小桃慢慢地抬起头,从指缝里往外看:“结……结束了?”
陈树修没有说话。他盯着手机屏幕,盯着那个归零之后又突然变了的界面。
倒计时消失了。取而代之的是一行新的文字。
“我改主意了。”
没有感叹号,没有句号,就是简简单单的三个字——“我改主意了”。像一个人在自言自语,像一个人在犹豫了很久之后,终于做出了一个艰难的决定。
然后是第二行字。
“我要你亲自来修我。”
第三行。
“修不好,整个城市陪你死循环。”
陈树修的手指从手机屏幕上缩了回去。他抬起头,看向窗外。
城中村的巷子里,阳光很好。对面楼的阳台上,一个女人在晾衣服。她把一件白衬衫挂上晾衣绳,用夹子夹住,然后转身进屋拿第二件。一切都正常,正常得不能再正常。
但陈树修的眼睛捕捉到了不对劲的地方。
那个女人从屋里拿出来的第二件衣服,和第一件一模一样——同一件白衬衫,同一个颜色,同一个褶皱。她重复了同样的动作,挂上晾衣绳,用夹子夹住,转身进屋。
又出来,又是白衬衫。挂上,夹住,转身。又出来,又是白衬衫。
陈树修冲向窗口。他推开铝合金窗,探出半个身子,望向巷口。
街道上的车在重复。一辆出租车从巷口经过,车牌尾号是7。三秒后,同一辆出租车又从同一个方向经过,同一个车牌尾号,同一样的速度。再三秒,再来一遍。
对面楼的灯光在闪烁。不是电压不稳的那种闪烁,而是像被人按下了重放键——亮,灭,亮,灭,同一个节奏,同一个频率,同一个亮度。
整条巷子,整条街,整座城市,都在重复同一秒钟。
陈树修转过身,看着叶文渊。
叶文渊站在窗口,看着外面的景象,脸上的表情很平静。他早就知道会这样。
“时间回环已经覆盖全城了。”他的声音很轻,轻到几乎被电风扇的嗡嗡声盖过去。
“范围多大?”陈树修问。
“从你走进实验室的那一刻起,系统就在悄悄扩张时间回环的边界。现在——”叶文渊抬起手腕看了看手表,表盘上的指针在倒着转,“整个城市都被包进去了。所有的时间都在重复同一秒钟,所有人都在做同一件事,说同一句话,走同一条路。”
小桃冲过来,扒着窗台往外看。她看见了一个让她毛骨悚然的画面——巷口卖早餐的老张,正在一遍一遍地重复同一个动作。拿起蒸笼盖,放下,拿起,放下,拿起,放下。他的脸上挂着同一个微笑,同一个角度,同一个弧度,像一张被粘贴了无数次的表情包。
“树修哥,”小桃的声音在发抖,“我害怕。”
陈树修从窗口退回来,走到操作台前,把工具箱拎了起来。拉链已经拉好了,绳子也捆紧了,一提就走。他把工具箱挎在肩上,转身朝门口走去。
“你去哪?”叶文渊问。
“实验室。”陈树修说,“修好系统,或者修好整个城市。”
小桃一把抓住他的工具箱带子:“我也去。”
“不行。”
“为什么?!”
“因为如果我没修好——”陈树修看着她,顿了一下,“至少得有一个人记得今天发生了什么。”
小桃的眼泪一下子涌了出来。
陈树修没有等她回答,推开门,走了出去。
巷子里,阳光被定格了。不是暗了或亮了,而是停在了某一个亮度上,不前不后,不多不少。风吹到一半就停了,树叶停在半空中,像一个被按下暂停键的视频。
陈树修逆着那些重复的人流,朝实验室的方向走去。
他的影子被阳光拉得很长很长,拖在身后,像一条黑色的尾巴。影子的边缘在微微地颤动着,不是风的缘故,而是他身体里的某种东西在被唤醒——那些在他眼睛里流淌了五年的代码,终于找到了它们的源头。
他走到巷口的时候,停下来,回头看了一眼修理铺。
小桃站在门口,手里攥着那杯已经凉透了的茶,眼泪在脸上流成了两条河。叶文渊站在她身后,一只手搭在她的肩膀上,目光沉沉地看着陈树修。
陈树修转过身,继续走。
手机在口袋里震了一下。他没拿出来看,但他知道那是什么。
“时间回环已激活。倒计时:无限制。修好我,或者永远留在这里。”
发件人——业力引擎。
而发件人的头像,是他自己的脸。