单比特错误(第5/8页)
变量之于存储器,就如同名字之于人脑。可以给一整段存储器空间冠以一个变量,这样便无需对每一字节进行个别操作。变量可以指代任何东西——阀门参数、社会安全号码,或是一段清空硬盘的子程序。
不幸的是,没有什么办法可以判断某个变量所指向的数据是否存在,以及是否与变量所声称的一致。在比特这个层次上,无论是哥斯达黎加蝴蝶的数量,还是澳大利亚外海热带风暴的速度,看起来都没太大区别。
这一点困扰着所有的程序员,因为绝大部分程序对正确性所能做出的那一点点保证完全系于变量的有效性之上。要是你能让计算机误以为某个为空值的变量指向的是有意义的数据的话,那什么事情都有可能发生。
为了让程序员不至于无法区分确凿无疑的真实和光怪陆离的灾难,变量类型系统应运而生。这是一种嵌入到编程语言当中的数学构造,可以确保某个代表节流阀参数的变量不会指向别的什么东西,比方说汽车目前的加速度。类型系统以绝对可靠的秩序来抚慰程序员,让他们不至于因为面对混沌的比特海洋而发疯。
像很多现代的汽车一样,泰勒车上的定速巡航系统也是由运行在微型计算机上的专门程序控制的。
这个程序能否正确运行显然至关重要。编写它的那位细心的程序员非常清楚自己的工作成果直接关系到他人的身家性命。不仅如此,他使用的编程语言也拥有无比强大的类型系统,甚至在数学上可以证明,无论编程者有多么狡猾或粗心,只要某段程序通过了类型检测,那就可以肯定,它永远都不会把某个被定义为油量的变量指向控制换挡的子程序。在比特的世界里,这近乎无懈可击。
所有这一切都说明,当初泰勒有充分的理由把汽车托付给定速巡航系统。
“两千年以前,”泰勒继续读下去,“大致是在耶稣生活的时代,在仙后座天域有一颗衰老濒死的恒星。它在一个冬季的夜晚爆发,成了一颗超新星。”
这次爆发令无数质子与氢原子核高速飞离那颗恒星的残躯,我们把它们称为宇宙射线。其中的绝大部分注定要在虚空中穿行,直至时间的尽头。我们不必为它们的命运介怀。
但其中一个质子在黑暗中旅行了两千年,在那个阳光灿烂的七月的白天来到了地球。它穿透了电离层,优雅地避开了地球磁力线,随后遇上的逐渐浓密的空气也没怎么降低它的速度。本来它会勇往直前,一头扎到加利福尼亚的沙漠里面,但是某样东西挡住了它的去路。
那一瞬间,利迪娅正在安睡,泰勒的视线正从路面转到利迪娅身上。睡梦中,她脸上的蒙恩之光依然如故。就在这一刻,他们的车拦截了那个自古代死亡恒星逃逸的质子。
它根本没有留心那层金属外壳,塑料合成材料更引不起它的注意,于是它径直向前,有那么一阵子看起来似乎要继续旅行下去了。但它遇上了一个微小的硅晶体,于是两千年以来,它头一次对固态物质发生了兴趣,决定把里面的电子撞一些出来。
那个硅晶体是某个电容的一部分,周围类似的电容和晶体管数以百万计,它们都属于某块集成电路,而这块集成电路是一台计算机的内存,它上面运行的程序正在控制泰勒的汽车。似乎无论从哪个层次上来看,这些电子的缺失都微不足道,但正是这一点点缺失就足够制造出这一场灾难了。
失去了那些电子之后,本来表示“1”的某个比特现在就成了“0”,这个比特正好是分配给某个变量的存储单元的一部分,于是,那个本来是用来存储节流阀参数计算子程序地址的变量指向了燃油的流量值,两者之间正好差了1024个字节。
这正是那段程序尽力要防范的那种类型错误。用来代表子程序的变量永远都不应该指向一个具体的数值。一旦发生了这种事情,那其他一切都不再是不可能的了。
既然集成电路里面一个比特的错误就足以破坏编程语言所拥有的数学上完美无缺的类型系统,那么,按照泰勒的推理,难道人脑之中的一个单比特错误就不能让人把护士和天使混淆起来么?只要某个神经连接中断,然后再随机重建,连到某个风马牛不相及的地方,那么所有将不同种类的记忆区别开的壁垒都将土崩瓦解。利迪娅所见的异象,除开她的信仰,其实都是一次神经元失调的结果。引发这种失调的可能是疲劳、紧张、某个乱飞的基本粒子,或者是很久以前的那一天在波士顿诊所里发生的任何事情。这和泰勒自己创造出那段让奶奶伤心的记忆是同一个道理。