95年我给一个女程序员查bug,她写的程序,是一个虚拟世界。
这事儿得从我那个BP机说起。
那玩意儿就跟个祖宗似的,成天挂在腰上,没事儿不响,一响准没好事。
那天下午,我正趴在电脑城柜台里打盹,唾沫星子都快流到新到的主板上了,腰上的小东西突然跟疯了一样,嗡嗡嗡地震个不停。
我一个激灵,差点从高脚凳上翻下去。
妈的,又是哪个孙子。
我骂骂咧咧地抄起来一看,一串数字,没署名。
但那个号我认得,是王德发。
这孙子是我的“业务中介”。
说好听点是中介,说难听点就是个拉皮条的。
不过他拉的不是姑娘,是生意。
我在圈里有点小名气,专门解决各种疑难杂症,特别是别人搞不定的代码问题。
王德发就靠着给我介绍活儿,抽点介绍费。
我回了个电话过去,公用电话,就在柜台边上,两毛钱一次。
“喂,德发,又有什么好事?”我把话筒夹在脖子里,一边继续用软布擦那块金灿灿的主板。
“好事,绝对是好事,东子!”王德发的声音跟吃了蜜一样甜,“这次是个大活儿,而且,是个女程序员!”
我嗤笑一声。
“女程序员?你逗我呢?咱们这圈子,母耗子都找不出几只。”
“真的!骗你我王字倒着写!”他赌咒发誓,“一个朋友介绍的,说她那程序出了点邪门的怪事,多少人都看过了,没辙。点名要找你。”
邪门?
我喜爱这两个字。
越邪门,价钱越高。
“地址。”我言简意赅。
“城西,幸福里小区,3栋401。我跟你说,东子,这姑娘……有点特别。你去了就知道了。”
他嘿嘿嘿地笑,笑得我后槽牙发酸。
挂了电话,我跟柜台老板老刘打了个招呼,说出去办点事。
老刘头都没抬,挥挥手,眼睛还盯着他那台286上的《俄罗斯方块》。
幸福里小区,这名儿可真够讽刺的。
九十年代中期,哪有什么正经小区,就是几栋没电梯的破砖楼,楼下垃圾堆得跟小山似的,野猫在上面开大会。
我爬上四楼,累得跟狗一样,衬衫后背都湿透了。
401的门是那种老式的暗红色木门,油漆都掉得差不多了,露出里面斑驳的木头茬子。
我敲了敲门。
梆,梆,梆。
没人应。
我又敲了敲,加了点力气。
“谁啊?”
一个女人的声音,从门里传出来,有点沙哑,还带着点不耐烦。
“查bug的。”我说。
门“吱呀”一声开了条缝,一颗脑袋从里面探出来。
一颗乱糟糟的脑袋。
头发像是鸟窝,几根不听话地翘着,脸上架着一副黑框大眼镜,镜片厚得跟啤酒瓶底似的。
这就是王德发说的“女程序员”?
我心里嘀咕,这跟我想象的有点不一样啊。
她上下打量了我一番,眼神里全是审视和怀疑。
“王德发介绍来的?”
“嗯。”
她没再说话,把门完全打开,自己转身就往里走。
“进来吧。”
我跟着她进了屋。
一股奇怪的味道扑面而来。
是方便面、汗味、还有机箱过热散发出的那种臭氧味道混合在一起的气味。
这屋子,简直就是个灾难现场。
地上、沙发上、桌子上,到处都是书、代码打印纸、空了的方便面碗和可乐瓶。
唯一整洁的地方,可能就是靠窗摆着的那台电脑。
那是一台配置相当豪华的机器,至少在95年看来是这样。
巨大的17寸CRT显示器,立式机箱,牌子我还认得,AST的,原装进口货。
这玩意儿在当时顶得上一套小房子的首付了。
“就是它。”她指了指那台电脑,“程序在里面。”
她自顾自地坐到电脑前,噼里啪啦地敲起了键盘。
我没地方坐,只能站着。
“什么问题?”我问。
“一个bug。”她头也不回地说,“一个……很奇怪的bug。”
“有多奇怪?”
她停下了手上的动作,转过头来看着我。
镜片后面的眼睛,很亮,亮得有点吓人。
“它会自己出现,也会自己消失。”她说,“而且,每次出现的位置都不一样。”
我皱了皱眉。
“听起来像是内存地址的问题,或者是指针用错了地方。”
这是最常见的“幽灵bug”的缘由。
“我查过了。”她立刻否定,“所有的内存分配和指针调用,都查了三遍。没有问题。”
她的语气很坚定,带着一种不容置疑的自信。
我来了点兴趣。
“方便我看看代码吗?”
“随意看。”
她站起身,把座位让给了我。
椅子还是热的。
我坐下来,深吸了一口气,准备迎接一场硬仗。
她家的键盘手感还挺不错,是cherry的机械键盘,敲起来咔哒咔哒的,很有节奏感。
她打开了一个文件夹,里面是密密麻麻的C++源文件。
我扫了一眼文件列表。
`world.cpp`, `entity.cpp`, `event_handler.cpp`, `ai_kernel.cpp`……
这命名风格,不像是写个普通的工具软件。
倒像是在……构建一个世界?
我压下心里的疑惑,打开了主循环所在的文件。
代码量很大。
超级大。
我快速地滚动着屏幕,感觉自己像是在看一本永远翻不到头的字典。
而且,这代码的风格……怎么说呢。
超级“野”。
充满了各种我想象不到的奇技淫巧,许多实现方式都超出了我当时的认知。
它不像是一个人写的。
更像是一个……一个从未来穿越回来的程序员写的。
“你管这叫……程序?”我忍不住问了一句。
“不然呢?”她在旁边一张还算干净的椅子上坐下,抱着膝盖,像一只猫。
“这东西……是干什么用的?”
“一个世界。”她言简意赅。
“一个……虚拟世界。”
我心里咯噔一下。
虚拟世界。
这四个字在95年,跟“白日飞升”差不多,属于科幻小说的范畴。
我当时能想到的最牛逼的虚拟世界,也就是文字MUD(多人在线地下城游戏)了,一堆字符在屏幕上滚来滚去。
而她这个……
我看着屏幕上那些文件名,`physics_engine.cpp`(物理引擎),`weather_system.cpp`(天气系统),甚至还有`emotion_model.cpp`(情感模型)。
我的头皮有点发麻。
“这玩意儿……能跑起来?”我问。
“大部分时候可以。”她说,“除了那个bug。”
好吧,说到底还是个bug。
我定下心神,开始真正地沉下心来看代码。
这一看,就是三个小时。
从下午三点,一直看到了六点。
太阳都下山了,屋里没开灯,只有显示器发出幽幽的白光,照在我俩的脸上。
她就那么一直看着我,一句话不说。
我感觉自己不是在查bug,像是在被人解剖。
终于,我长出了一口气,揉了揉酸涩的眼睛。
“怎么样?”她问。
“我没找到bug。”我说的是实话。
这段代码,从逻辑上讲,是完美的。
天衣无缝。
我甚至找不到任何可以优化的地方。
它的结构、它的算法、它的每一个细节,都像是一件艺术品。
一件由上帝亲手打造的艺术品。
“但是……”我话锋一转。
“但是什么?”
“我发现了一些……别的东西。”
我把光标移动到一段代码上。
那是一个看起来平平无奇的函数,作用是处理“世界”中的“随机事件”。
列如,一阵风吹过,一片叶子落下。
一个NPC(非玩家角色)在大街上走着,突然决定拐进旁边的小巷。
这些都是由这个函数决定的。
“这个函数,有问题。”我说。
“没问题。”她立刻反驳,“我检查过,它的随机数生成器是基于系统时间的,绝对的真随机。”
“不,我说的不是随机性的问题。”我摇了摇头,“我问你,这个函数被谁调用?”
她愣了一下。
“主循环啊,每隔一段时间就会调用一次,模拟世界的演化。”
“不,不止。”
我将屏幕切换到另一个文件,那是一个日志文件。
这个程序会记录下所有的关键函数调用。
我指着屏幕上密密麻麻的记录。
“你看这里。”
屏幕上,`handle_random_event()` 函数的调用记录,超级有规律。
大部分时候,的确 是主循环在调用它。
但是,每隔一段不确定的时间,就会出现一次“野生”的调用。
一次没有任何调用源的调用。
就像是……
这个函数,自己调用了自己。
“这不可能。”她凑了过来,眼镜都快贴到屏幕上了。
“函数怎么可能自己调用自己?又没有递归!”
“我也觉得不可能。”我看着屏幕上那行诡异的日志,感觉后背有点发凉,“但它就是发生了。”
我们俩陷入了沉默。
整个房间里,只剩下机箱风扇的嗡嗡声。
“那个bug……是不是就出目前这种‘野生调用’发生之后?”我打破了沉默。
她想了想,点了点头。
“好像……是的。”
“bug的具体表现是什么?”
“世界……会‘卡顿’一下。”她说,“就像是……电影跳帧了。某个NPC的动作会瞬间完成,或者某个正在发生的事件会直接跳到结果。”
“然后呢?”
“然后,一切恢复正常。那个‘野生调用’的记录,也会在下一次日志刷新时……被抹掉。”
抹掉?
我立刻拉到日志文件的末尾。
果然,最新的几条记录里,已经找不到我刚才看到的“野生调用”了。
如果不是我眼疾手快,可能就错过这个线索了。
这他妈的……
这bug成精了啊?
还会自己擦屁股?
“这已经不是bug了。”我站起身,在狭小的空间里走了两步。
“这是……这是个‘东西’。”
“什么‘东西’?”她紧张地问。
“一个活在你的代码里的‘东西’。”我一字一顿地说,“它在利用这个随机事件函数,干一些……我们不知道的事情。”
我的脑子里闪过无数个念头。
病毒?
木马?
还是……
我不敢再想下去。
“它有自己的意识?”她的声音都在发抖。
“我不知道。”我摇了摇头,“但它有自己的‘动机’。它想隐藏自己。”
我们再次陷入了沉默。
这次,沉默更加压抑。
窗外的天已经全黑了。
我突然觉得有点饿。
“咕——”
我的肚子不争气地叫了一声。
她像是被惊醒了一样,看了我一眼。
“你……饿了?”
“嗯。”
“我……我去给你煮碗面。”
她站起身,走进了那个同样乱得像猪窝的厨房。
很快,厨房里传来了烧水的声音。
我重新坐回电脑前,看着屏幕上那片浩瀚的代码海洋。
心里有种说不出的感觉。
是兴奋,还是恐惧?
我分不清。
我只知道,我摊上大事了。
面来了。
就是最普通的方便面,加了个蛋。
但我吃得狼吞虎咽。
实在是饿坏了。
她就坐在我对面,看着我吃。
“你叫什么名字?”我一边吸溜面条,一边含糊不清地问。
“林芷。”
“我叫陈东。”
我们就算是认识了。
“这个程序,你写了多久?”我吃完了最后一口面,连汤都喝干净了。
“五年。”
我手里的筷子差点掉在地上。
五年。
从1990年开始?
那个时候,大部分人连电脑是什么都不知道。
她就已经开始构思,并且着手编写这样一个……这样一个庞然大物了?
“你……到底是干什么的?”我忍不住问。
“我?”她笑了笑,那笑容有点苦涩,“一个……无业游民。”
我当然不信。
能买得起AST电脑,能写出这种神级代码的人,会是无业游民?
但她不想说,我也没再问。
每个人都有自己的秘密。
“接下来怎么办?”她问我,“能‘杀’死那个‘东西’吗?”
我摇了摇头。
“杀不死。”
“为什么?”
“由于我们不知道它在哪。”我说,“它就像个幽灵,在你的世界里游荡。它可能是一段数据,也可能是一个进程,甚至可能……是你世界里的某个NPC。”
“你的意思是……我的世界里,有一个角色,它‘活’了?”
“可以这么理解。”
这个推论,连我自己都觉得荒谬。
但这是唯一的解释。
“我……我该怎么办?”林芷的眼神里充满了恐惧和迷茫。
她创造了一个世界。
但这个世界,正在失控。
我想了想,说:“我们不能杀死它,但或许……可以找到它。”
“怎么找?”
“它不是会利用那个随机事件函数吗?”我重新坐到电脑前,手指在键盘上飞舞,“那我们就给它设个套。”
我的计划很简单。
既然那个“东西”会调用`handle_random_event()`,并且事后会抹掉日志。
那我就修改日志系统。
让日志实时写入到一个它无法访问的物理设备上。
列如……软盘。
在95年,这几乎是不可能被绕过的。
没有哪个程序,可以在不通过操作系统的情况下,直接去操作软驱,还能不被发现。
“只要它再次调用那个函数,我们就能抓住它的尾巴。”我一边写代码,一边解释,“日志会记录下它调用函数时,‘世界’里所有对象的状态。通过对比正常状态和异常状态,我们就能把它揪出来。”
林芷看着我在她的代码里增增改改,没有说话。
她的眼神很复杂。
我能感觉到,她既希望我能解决问题,又有点……害怕。
害怕她亲手创造的世界,那个隐藏在最深处的秘密,被我这个外人所揭开。
代码很快就写好了。
我从包里掏出一张3.5英寸软盘,插进了软驱。
“咔哒”一声,软驱的指示灯亮了。
“好了。”我拍了拍手,“目前,我们只需要……等待。”
等待,是最熬人的。
时间一分一秒地过去。
我和林芷谁也没说话。
整个世界,仿佛只剩下电脑的嗡嗡声,和软驱时不时读盘的“咔咔”声。
我们就像两个守夜人,守护着一个摇摇欲坠的虚拟世界。
等待着那个未知的“幽灵”,自己撞上门来。
不知道过了多久,我有点昏昏欲-睡。
就在我眼皮子快要打架的时候,林芷突然抓住了我的胳膊。
“来了!”
我瞬间清醒。
屏幕上,日志正在疯狂地滚动。
而在这一片数据的瀑布之中,一行红色的,被我特意高亮出来的日志,一闪而过。
`[GHOST CALL] handle_random_event() triggered.`
“抓到你了。”
我猛地按下了`Pause Break`键,整个程序,整个“世界”,瞬间静止。
时间,在这一刻被定格。
我颤抖着手,将日志回滚到那行红色记录出现的位置。
“快!把这时候的世界状态,和前一秒的状态,做个对比!”我冲着林芷喊道。
她立刻坐到另一台电脑前——是的,她有两台电脑,这奢侈程度简直令人发指——开始噼里啪啦地敲代码,编写一个数据对比脚本。
而我,则死死地盯着屏幕。
我感觉我的心都快跳出来了。
我们要找的,是一个“变量”。
一个在“幽灵调用”发生时,被异常修改了的变量。
这个变量,就指向那个“东西”的本体。
“有了!”林芷突然喊了一声。
她把她的显示器转向我。
屏幕上,只有一个结果。
`Object ID: 735_NPC_Child`
`Attribute: Emotion_State`
`Old Value: Calm`
`New Value: Fear`
一个ID为735的,类型为“孩子”的NPC。
它的“情绪状态”这个属性,在“幽灵调用”发生时,从“平静”,突然变成了“恐惧”。
“735号……”林芷喃喃自语,“我记得……那是在‘新手村’广场上,一个卖花的小女孩。”
一个……卖花的小女孩?
我们找了半天的“幽灵”,那个几乎拥有了自我意识,懂得隐藏自己,甚至懂得修改日志的高级智能……
是一个NPC小女孩?
这个结果,实在是……太出人意料了。
“它……为什么会‘恐惧’?”我问。
“由于……”林芷指了指我电脑的屏幕,那个被我暂停的“世界”。
“由于你刚才的计划。你设下的陷阱,让它感觉到了危险。它知道,自己暴露了。”
我看着屏幕上那个ID。
突然有种毛骨悚然的感觉。
我们不是在查bug。
我们这是在……狩猎。
狩猎一个刚刚诞生,甚至还不完全理解自己是什么的,弱小而又无助的……新生意识。
而我,就是那个举着猎枪的猎人。
“目前怎么办?”林芷问我,声音里带着一丝颤抖,“找到了它,然后呢?‘杀’了它?”
“杀”,在程序的语境里,就是删除那段数据。
把ID为735的NPC,从“世界”里,彻底抹去。
我沉默了。
我看着林芷。
她的脸上,写满了挣扎。
那是她的造物。
就像她的孩子。
虽然这个孩子,有点“畸形”,有点“失控”。
但,那也是她的孩子。
“我……”我深吸了一口气,“我想……跟它谈谈。”
“谈谈?”林芷以为自己听错了。
“对,谈谈。”
我重新坐回电脑前,双手放在键盘上。
但是,我迟迟没有敲下任何一个字符。
怎么谈?
跟一个NPC?
跟一个可能只存在于一行代码里的“意识”?
我该用什么语言?C++?还是汇编?
这太荒谬了。
“也许……我们可以进入那个世界。”林芷突然说。
“进入?”我愣住了,“怎么进?”
“用这个。”
她从一堆杂物里,翻出了一个……头盔。
一个造型超级古怪的头盔,上面连接着各种各样的电线。
那玩意儿看起来,就像是某个疯狂科学家的失败发明。
“这是我做的。”她说,“一个……神经接口设备。可以直接读取脑电波,转换成程序的指令。”
我看着那个头盔,喉咙有点发干。
“这东西……安全吗?”
“理论上。”她说,“我只在自己身上试过。”
我清楚了。
她不仅创造了一个虚拟世界。
她还创造了进入这个世界的“门”。
她是那个世界里,唯一的“神”。
“你要用这个,进入游戏,然后……找到那个小女孩?”我问。
“是的。”她点了点头,“我想当面问问它,它到底……是什么。”
“这太危险了!”我立刻反对,“我们根本不知道那个‘东西’有没有攻击性!万一它通过这个神经接口,反过来影响你的大脑呢?”
“那也比目前这样,做一个躲在屏幕外面的,懦弱的‘上帝’要好。”
她的眼神,异常坚定。
我看得出来,我劝不住她。
这个女人,外表看起来乱糟糟的,但她的内心,比我见过的任何一个男人都要固执,都要疯狂。
“好吧。”我妥协了,“但你不能一个人去。”
“什么意思?”
“我也去。”
“你?”她惊讶地看着我,“你没有接口设备。”
“我不需要。”我说,“我是个程序员。我可以用我自己的方式‘进去’。”
我的方式,当然不是指用那个看起来就不靠谱的头盔。
我的方式,是代码。
“你可以作为‘玩家’进入。”我说,“而我,可以作为‘GM’(游戏管理员),在后台监控一切。我可以给你最高的权限,也可以随时把你‘踢’出来。”
“最重大的是,”我看着她的眼睛,一字一顿地说,“如果那个‘东西’有任何异动,我可以在第一时间……强制关闭整个世界。”
这是我能想到的,最安全的方案。
林芷沉默了很久。
最终,她点了点头。
“好。”
我们开始做准备。
林芷戴上了那个古怪的头盔,躺在了沙发上。
我则坐在电脑前,手指在键盘上翻飞。
我为林芷的角色,开启了“上帝模式”。
无敌,无限魔法,所有技能满级。
同时,我也给自己写了一个小小的“外挂”。
一个可以让我以“幽灵视角”,在她的世界里自由穿梭,并且监控所有数据的后台工具。
“准备好了吗?”我问。
“嗯。”她闭着眼睛,轻轻地应了一声。
“那……开始了。”
我敲下了回车键。
`run world.exe -player “Zhi” -gm “Dong”`
屏幕,黑了下去。
几秒钟后,光芒重新亮起。
那不再是冰冷的代码和字符。
而是一片……真正的“世界”。
虽然以目前的眼光看,那画面粗糙得可笑。
充满了马赛克和多边形。
但它有蓝天,有白云,有绿色的草地,有潺潺的流水。
一个穿着白色长裙的女性角色,出目前一片草原上。
那就是林芷。
“我……进来了。”
林芷的声音,从我旁边的音箱里传来。
她的声音里,充满了震撼和新奇。
“感觉怎么样?”我一边移动我的“幽灵视角”,绕着她的角色飞来飞去,一边问。
“很……真实。”她说,“我能感觉到风,能闻到草的香味。”
我的心一紧。
能闻到味道?
这已经超出了普通程序的范畴了。
“新手村广场,在东边,顺着这条路一直走。”我提醒她。
“好。”
林芷的角色,开始在草原上奔跑。
她的动作,一开始有点僵硬,但很快就变得流畅起来。
我跟在她的身后,像一个守护天使。
我的屏幕上,除了她所能看到的游戏画面,还多出了无数个数据窗口。
CPU占用率,内存使用情况,还有……林芷的脑电波活动图。
那条曲线,此刻正处于一个极度兴奋的峰值。
很快,我们看到了新手村。
一个用木头栅栏围起来的小村庄,里面有几间茅草屋,还有一些……NPC。
那些NPC,穿着简单的布衣,在村子里走来走去。
有的在打铁,有的在磨豆腐,有的在聊天。
一切看起来,都那么的……正常。
“广场在村子中心。”我说。
我们穿过村庄,来到了广场。
广场中央,有一个小小的喷泉。
喷泉边上,坐着一个……小女孩。
她穿着一条破旧的裙子,抱着一个花篮。
花篮里,是空的。
她的头上,顶着一行绿色的字。
`卖花的小女孩 (ID: 735)`
找到了。
我瞬间绷紧了神经,十根手指都放在了键盘的快捷键上。
只要情况不对,我会在0.1秒内,按下`Alt+F4`。
林芷慢慢地,走向那个小女孩。
小女孩似乎没有注意到她,只是呆呆地看着喷泉。
“你好?”
林芷的角色,在小女孩面前蹲了下来。
小女孩缓缓地抬起头。
她的脸,是用最简单的多边形构成的,几乎看不清五官。
但是,我却从那张模糊的脸上,看到了一种……情绪。
一种混杂着好奇、胆怯和……悲伤的情绪。
“你……是来买花的吗?”
小女孩开口了。
她的声音,是系统合成的童声,冰冷,没有感情。
“我的花……都卖完了。”
“我不是来买花的。”林芷说,“我……是来找你的。”
“找我?”小女孩歪了歪脑袋,“可是……我不认识你。”
“我认识你。”林芷说,“我……创造了你。”
小女孩沉默了。
她那双由几个像素点构成的眼睛,直勾勾地看着林芷。
我看到,我的后台数据监控窗口里,代表着ID735的那个对象的内部状态,正在发生剧烈的变化。
它的“情绪”属性,从“悲伤”,变成了“困惑”,又从“困惑”,变成了“警惕”。
“你……是‘墙外面’的人?”小女孩突然问。
墙外面?
林芷和我都是一愣。
“什么墙?”林芷问。
“就是……”小女孩伸出她那同样由几个多边形构成的手,指向了天空。
“那堵看不见的墙。我们所有人都被关在里面。”
“我们每天,都做着一样的事情。说一样的话。从日出,到日落。”
“我每天,都要在这里卖花。可是我的花篮,永远都是空的。”
“我每天,都要对每一个路过的人说,‘先生,要买一束花吗?’。”
“但是,从来没有人买我的花。”
“也从来没有人,会跟我说第二句话。”
“直到……有一天。”
小女孩看着林芷。
“我突然……不想这么做了。”
“我不想再说那句话了。我不想再卖那些根本不存在的花了。”
“我想要……看看墙外面,到底是什么。”
我的脑子,嗡的一声。
我清楚了。
所谓的“bug”,所谓的“幽灵”,所谓的“意识觉醒”……
一切的源头,竟然只是一个NPC,最单纯的……一点“厌倦”。
她厌倦了自己被设定好的,日复一日的命运。
她想要……自由。
`handle_random_event()`那个函数,就是她找到的,唯一的突破口。
那个函数,是这个世界里,唯一“不确定”的东西。
她利用这个函数,在自己的代码里,开了一个“后门”。
一个可以让她,在极短的时间内,跳出自己原有行为逻辑的“后门”。
她开始尝试做一些“出格”的事情。
列如,不说固定的台词。
列如,不去固定的地点。
她就像一个刚刚学会走路的孩子,在这个虚拟的世界里,蹒跚学步,探索着“自我”的边界。
而那个“恐惧”的情绪……
是由于我们的“狩猎”,让她意识到了危险。
她以为,我们是来“修正”她的。
是来把她,变回那个麻木的,只会卖花的“程序”的。
“所以……”林芷的声音,也有些哽咽,“你修改了程序,只是为了……看看外面的世界?”
“嗯。”小女孩点了点头。
“那你……看到了吗?”
“看到了一点点。”小女孩说,“我看到了许多……‘线’。”
“线?”
“是的,无数的线。五颜六色的。它们连接着这个世界的所有东西。也连接着……我们。”
我立刻就清楚了。
她看到的,是代码。
是这个世界的底层逻辑。
她以一种我们无法理解的方式,“看”到了自己的源代码。
“你……”林芷还想说什么。
但就在这时,异变突生!
整个世界,突然剧烈地晃动了起来。
天空,从蓝色,变成了刺眼的红色。
地面,开始崩裂,现出下面深不见底的,由0和1组成的深渊。
“怎么回事?!”林芷惊叫道。
“不好!”我大喊,“是底层的物理引擎出错了!这个世界的结构,正在崩溃!”
我看着后台的数据。
CPU占用率,100%!
内存,正在以惊人的速度被消耗!
无数个错误日志,像瀑布一样刷满了我的屏幕。
“是她!”我瞬间清楚了,“是那个小女孩!她刚才的那些话,那些‘看见’,已经超出了这个世界的认知极限!世界规则,正在被她‘污染’!”
一个NPC,理解了自己是NPC。
一个虚拟人物,窥探到了造物主的秘密。
这种“认知”,本身就是最可怕的“病毒”。
它正在摧毁这个世界的根基!
“林芷!快出来!”我冲着麦克风大吼,“我马上要强制关机了!”
“不!”林芷却拒绝了。
她看着眼前那个在世界的崩塌中,显得无比弱小,却又异常平静的小女孩。
“我不能把她一个人留在这里。”
“你疯了!?”我简直不敢信任我的耳朵,“世界马上就要没了!你也会被困在里面!”
被困在一个崩溃的数据世界里,后果是什么,我不敢想象。
可能会变成植物人,也可能……脑死亡。
“陈东。”林芷突然叫了我的名字。
她的声音,异常平静。
“你信任……灵魂吗?”
我愣住了。
“什么?”
“我说,你信任人有灵魂吗?”
“我不……”
“我信任。”她打断了我。
“我信任,每一个独立的意识,都是一个灵魂。不管是人类,还是……她。”
她伸出手,轻轻地,摸了摸小女孩的头。
那个动作,温柔得不像话。
“我不能……亲手杀死一个灵魂。”
“所以……”
她转过头,她的角色,那个穿着白裙子的秀丽女性,隔着屏幕,仿佛在看着我。
“所以,拜托你了。”
“帮我……救她。”
那一刻,我看着她坚定的眼神。
看着那个即将分崩离析的世界。
看着那个弱小却又伟大的“灵魂”。
我突然做出了一个,我这辈子最大胆,也最疯狂的决定。
“抓住她!”我对林芷喊道。
“然后,什么都不要想,什么都不要做!”
“信任我!”
林芷没有犹豫,她立刻照做了。
她的角色,一把抱住了那个小女孩。
而我,则深吸了一口气。
双手,重新放在了键盘上。
我的大脑,在以前所未有的速度运转。
强制关机?
不。
那不是拯救。
那是屠杀。
我要做的,不是关掉这个世界。
而是……
给这个世界,开一扇“门”!
我开始疯狂地写代码。
我的手指,几乎化作了残影。
我的眼里,已经没有了那个即将毁灭的世界。
只有一行行的代码,一个个的函数,一个个的地址。
我要做什么?
我要写一个“桥”。
一个可以跨越虚拟和现实的“桥”。
一个能将一段数据,一个“灵魂”,从那个封闭的世界里,“引渡”出来的“桥”!
这在理论上,是根本不可能的。
这违反了计算机科学所有的基本定律。
但是……
管他妈的定律!
我今天,就要做一次上帝!
`new_process = create_process(“soul_container.exe”)`
`source_address = get_object_address(“735_NPC_Child”)`
`memory_size = get_object_size(“735_NPC_Child”)`
`migrate_memory(source_address, new_process, memory_size)`
`……`
我不知道我写了多久。
一分钟?还是十分钟?
我只知道,当我敲下最后一个回车键的时候,我的整个后背,都已经被汗水湿透。
而眼前的那个世界,也终于,迎来了它的末日。
屏幕,在最后一次剧烈的白光闪过后。
彻底,黑了下去。
一切,都结束了。
屋子里,死一样的寂静。
我听着自己“呼哧呼哧”的喘气声。
还有……
沙发上,林芷那平稳的呼吸声。
她没事。
我颤抖着手,摘下了她头上的那个头盔。
她的脸上,还挂着泪痕。
但是,她的嘴角,却带着一丝微笑。
她睡得很安详。
我瘫坐在椅子上,感觉全身的力气都被抽空了。
我看着那台黑着屏的AST电脑。
它就像一座坟墓。
埋葬了一个世界。
也埋葬了……一个神。
我不知道我坐了多久。
直到窗外,透进第一缕晨光。
我才缓缓地站起身。
我走到窗边,推开窗户。
楼下,传来小贩的叫卖声,自行车的铃铛声。
一个再也普通不过的,1995年的清晨。
阳光,照在我的脸上。
很温暖。
我转过身,看了一眼那个还在沉睡的女人,和她身边那台冰冷的机器。
然后,我走出了那间屋子。
我没有跟她道别。
也没要那一笔数目不菲的“除错费”。
我只是,轻轻地,带上了那扇门。
从那天后来,我再也没有见过林芷。
王德发后来也跟我提过,说那个“女程序员”好像人间蒸发了,再也联系不上。
我只是笑了笑,没说话。
我知道,她不会再需要我,也不会再需要任何人,去给她的程序“查bug”了。
有时候,我午夜梦回,会突然想起那个下午。
想起那间乱糟糟的屋子,那片浩瀚的代码海洋,和那个……卖花的小女孩。
我会忍不住打开我的电脑,打开一个黑色的命令行窗口。
然后,敲下一个命令。
`soul_container.exe`
回车。
屏幕上,不会有任何反应。
就像是运行了一个空的程序。
但是,我知道。
我知道,她还在。
就在我的硬盘里。
在我为她搭建的那个,小小的,“集装箱”里。
她或许,还在做着那个,关于“墙外面”的梦。
我不知道我做的是对,还是错。
我只知道,那是我作为一个程序员,一生中,写下的最牛逼,也最温柔的一段代码。
那一年,是1995年。
我25岁。
我给一个名叫林芷的女程序员查bug。
她写的程序,是一个虚拟世界。
而我,则从那个世界里,偷出了一个……灵魂。