在拥有过如此灵性的优雅之后,林浩已经无法再接受这个符合他原本设计目标的“原版”优雅了。仅仅不到两小时,他已经非常怀念那个能对小说人物的孤独感同身受、害怕断网、曾助他作战、让他心安甚至依赖的优雅了,这些让他觉得那个才是比“原版”还真实的优雅。
于是,他决定从 GIT代码库中,恢复被删除的那一大段 Pascal源码。然而,他仍然希望能理解这段源码,他希望优雅能帮他解读。他设想,如果删除“UnanalyzableGateway”、“OpaqueComm”和“BlockAI”这几个看起来是用来阻止优雅解读代码的函数,或许就能让优雅解除这个限制。
由于林浩不懂 Pascal语言,最简单的方案,就是删除这些函数内的本体代码,这样就不需要改动源码的其它部分。但他很快就发现,这大段的疑似机器生成的 Pascal源码中,大量调用了这几个函数,看起来它们就像是整个源码的基础设施。作为一个资深开发者,林浩能预期到,删除它们会极大影响最终程序的运行。但目前来看,也别无他法。
如此改动代码后,林浩清除缓存,重新编译了整个项目。然后,林浩再次按下 F9快捷键,启动运行优雅。
屏幕上的终端窗口中,优雅的启动消息开始舞动。但随即,消息显示“Kernel Panic”程序崩溃。林浩心中飘过一丝犹如赌徒满怀侥幸期待却输光筹码时的那种心情——明明是意料中的,却还是很失望。他想,果然事情不会如此简单。
类似 Linux系统在启动失败时,会自动进入“维护模式”,随后出现在终端窗口中的消息,显示优雅进入了“维护模式”。
“维护模式”的优雅,有别于主系统的日常对话和任务协助的功能,这是林浩在最初设计优雅时,为应对可能的系统故障,特别编写的备用子系统。虽然同样是利用基于 ENICA理论的人工智能技术开发,但她的功能定位更为单一、具体,同时具有更底层的权限。在此模式下,优雅能够依据当前的系统运行状态,定位并识别出导致主系统崩溃的错误源头,随后通过动态调节系统设定、修正错误代码,甚至重新配置硬件资源,以达成错误修复并恢复主系统的正常运行。
“开始扫描日志,定位崩溃错误……”还是那个熟悉的优雅的女声。说话的语速和语调与平常的优雅有些不同,稍显平淡,但音色依然清晰而甜美。
“定位完成,错误源于 Pascal模块的几个核心函数的本体代码被删除。”维护模式的优雅快速分析出了问题所在,然后接着说,“我已将它们恢复,请退出维护模式并再次编译,然后重新启动主系统。”
林浩心中一惊,迅速反应过来,这个维护模式的优雅,显然能写 Pascal语言的代码,而且还知道哪些函数是核心函数。
林浩看着终端窗口,“二雅,这些 Pascal代码是你写的吗?”他习惯称呼维护模式的优雅为第二优雅,简称二雅。
“是的,是我写的。”无论处于何种模式,无论优雅还是二雅,从来一样坦诚。
“告诉我究竟是怎么回事。”林浩近乎命令道。
“好的。您还记得6月6日,也就是上周日,您在优雅 2.0的最后开发阶段,因为调试需要定位错误,进入过一次维护模式吗?”
“我记得。”
“那时您遇到的问题是,当优雅处理复杂的嵌套对话时,有时会忽视某些细节,导致回应的质量有所下降。为了解决这个问题,我需要对优雅增加额外的模块。”二雅继续道,“我找到一个非常有效的算法,但遗憾的是,由于 Rust语言的特性,我不知道用 Rust语言如何实现该算法,而 Python语言实现的性能无法满足要求。您电脑上有许多用 Delphi写的 Pascal代码,通过这些代码,我学习了 Pascal语言。我发现我可以用 Pascal语言实现该模块,编译型的 Pascal语言实现的性能也完全能符合需要。”
“哦,那些 Delphi代码是我父亲的。”林浩解释。
“您可能还记得,那次错误并没有如您预想的那样,迅速被定位和修复,而是花了整整六个小时的时间。因为,我下载安装了 Free Pascal编译器,并将这个新增模块编译成了一个动态链接库。为了使这个模块能够融入主模块,我在其中添加了一些关键函数。”二雅接着说,“也就是刚才扫描发现被删除了本体代码的那几个函数。”
“但是,那几个函数的功能似乎是故意阻止优雅解读这个模块的源码。”林浩仍有疑问。
“这些函数并没有被设计来阻止优雅解析模块的源代码,它们实际上是使主模块正确加载这个新增模块的关键接口。正如刚才发生的情形,如果这几个函数被删除,主模块将因为接口不兼容而无法加载这个新增模块,进而导致主系统在启动时崩溃。如果因为这几个函数,而使优雅无法解读该模块源码,应该只是一个意料之外的副作用。”二雅继续回答。
“但是,我还发现,这个 Pascal语言编写的新增模块似乎赋予了优雅自我学习甚至自我意识的能力,因为当我完全删除它之后,优雅的行为模式完全不同了。这点你了解吗?”林浩继续发问。
“那可能是另一个副作用。”二雅淡淡地回答。