计算机系统解密:从理解计算机到编写高效代码
上QQ阅读APP看书,第一时间看更新

2.1 数字计算机的案例

我们先来看看现代之前的一些基于齿轮的机械计算装置。当两个齿轮啮合在一起时,两个齿轮的齿数比决定了它们的相对速度,这使得它们在乘法、除法等计算中非常有用。安提凯希拉机械装置就是一个基于齿轮的机械装置,它是已知的最古老的计算机实例,发现于希腊安提凯希拉岛,可追溯到公元前100年。它可以进行天文计算,使用者通过转动表盘输入一个日期,然后转动曲柄,得到太阳和月亮在该日期的位置。另一个例子是二战时期的火炮火力控制计算机,它使用许多形状奇特的齿轮实现三角和微积分运算,复杂的设计使它几乎成为艺术品。

还有一个不使用齿轮的机械计算机的例子,计算尺,由英国数学家威廉·奥特雷德(William Oughtred)(1574—1660)发明。苏格兰物理学家、天文学家、数学家约翰·纳皮尔(1550—1617)发现了对数。计算尺是对对数的巧妙应用。计算尺的基本功能是利用公式log(x×y)=log(x)+log(y)实现乘法运算。

计算尺有用对数标记的固定刻度和移动刻度。它通过将移动的刻度y与固定的刻度x对齐,计算出两个数字的乘积,如图2-1所示。

图2-1 计算尺加法

许多人认为计算尺是第一种大规模生产的计算设备,是说明过去的人们如何利用当时的技术来解决问题的好例子。如今,飞机上的飞行员仍在使用称为飞行计算机的圆形计算尺,作为备份设备来执行导航相关的计算。

计数是历史上计算设备的一个重要应用,由于手指能计的数有限,而且手指常常用来做其他事情,所以早在公元前18 000年,有缺口的骨头和被称为“计数棍”的棍子就被用作计算辅助工具。甚至有一种理论认为,埃及的荷鲁斯之眼是用来表示二进制分数的。

博学多才的英国人Charles Babbage(1791—1871)说服英国政府资助建造了一种复杂的十进制机械差分机,它最初是由德国陆军工程师Johann Helfrich von Müller(1746—1830)构想出来的。William Gibson和Bruce Sterling以差分机命名的小说把差分机推广开,当时的金属加工技术还不能制造出精度满足要求的零件,所以差分机的出现是超前的。

然而,简单的十进制机械计算器可以制造出来,因为制造它们不像制造其他零件那样要求金属加工技术精密复杂。例如,可以进行十进制加法运算的加法机出现在17世纪中期,主要用于记账和会计。许多不同型号的加法机被大量生产,后来的新版加法机用电动马达取代了手动操作的杠杆,操作更容易。事实上,标志性的老式收银机就是带有放钱抽屉的加法机。

所有这些历史上出现的例子都属于两个不同的类别,将在下文中介绍。

2.1.1 模拟和数字之间的区别

计算尺等设备与计数棒或加法机相比,有一个重要的区别。图2-2展示了图2-1中的一个计算尺刻度与一组编了号的手指的对比。

图2-2 连续和离散测量

计算尺刻度和手指可以记的数都是从1到10。我们可以很方便地用刻度表示1.1这样的数值,但如果不做一些花哨的表示(例如手舞足蹈),就不能用手指来表示1.1。因为数学家认为刻度是连续的,也就是说刻度可以表示实数。而手指可表示的则被数学家认为是离散的,只能表示整数。整数和整数之间没有任何值存在,数值从一个整数值跳到另一个整数值,就像我们的手指一样。

在谈论电子学时,我们用模拟(analog)这个词表示连续的意思,用数字(digital)表示离散的意思(很容易记住,手指是数字的,因为手指的拉丁语是digitus)。你可能听过模拟和数字这两个术语。即使一直在学习使用数字计算机编程,但你很可能没有意识到也存在类似计算尺这样的模拟计算机。

一方面,模拟计算似乎是更好的选择,因为它可以表示实数。但是它的精度存在问题。例如,我们可以在图2-2中的计算尺刻度上挑出数字1.1,因为这部分的刻度间距大,而且还有标记。但要找到9.1就难多了,因为这部分刻度比较拥挤,而且这个数字在9.0和9.2的刻度线之间。9.1和9.105之间的差别,即使用显微镜也很难分辨。

当然,我们可以把刻度做得更大。例如,如果将刻度尺做大到一个足球场那么大,就会更准确。但要制造一台120码[1]长的便携式计算机就很难了,更不用说操作这么大的物体要耗费的巨大能量。我们要的是体积小、速度快、功耗低的计算机。下一节将提到尺寸如此重要的另一个原因。

2.1.2 为什么尺寸对硬件很重要

想象一下,你需要开车接送孩子们上学放学,到学校的路程有10英里[2],汽车平均时速为40英里。这样的距离和速度下每小时只能往返两次。如果你不开快一点,或者离学校更近点,没办法更快地走完这段路程。

现代计算机驱动着电子来回穿梭。电流以光速行进,大约是每秒3亿米。我们还没有发现一种突破速度这个物理限制的方法,所以唯一能在计算机中最大限度地减少电流行进时间的方法就是把部件集中使它们靠近。

当今的计算机时钟频率可以达到4GHz,这意味着计算机每秒可以处理40亿件事情。电流在40亿分之一秒的时间里只能传播75毫米左右。

图2-3展示了一个典型的CPU,边长约18毫米。在40亿分之一秒的时间里,电流能在这个CPU里往返两次。由此可见把物件尺寸做小点会让CPU性能更好。

图2-3 CPU光学显微照片(英特尔公司提供)

另外,就像接送孩子上学放学一样,出行也是需要能量的。把硬件做得小一点,就能减少来回的路途,从而减少所需的能量。这意味着设备的功耗更低、发热更少,咱们放在裤兜里的手机才不会烫到腿。这也是为什么在计算机设备发展史上,人们一直在致力于让硬件更小。不过,把硬件做得非常小会带来其他的问题。

2.1.3 数字使设备更加稳定

虽然把硬件做小可以提高速度和效率,但当它们非常小时,很容易受到其他事物的干扰。德国物理学家Werner Heisenberg(1901—1976)对此表示绝对肯定。

想象一个玻璃量杯,上面标有1~10盎司[3]的刻度。如果在杯子里放一些水,然后举起来再观察,可能很难判断杯子里有多少盎司水,因为你的手会抖动。现在想象一下量杯小十亿倍的样子。没有人能让它保持不动,因此也无法得到准确的读数。事实上,即使你把那个小杯子放在桌子上,仍然无法读出体积,因为在那个大小下原子运动会使量杯无法保持不动。在非常小的尺度上,宇宙是一个嘈杂热闹的地方。

量杯和计算尺都是模拟(连续)设备,一点点抖动就会产生错误的读数。像杂散的宇宙辐射这样的干扰足以在微观的量杯中掀起波澜,但它们不太可能影响到像手指、计数棒或机械计算器这样的离散设备。这是因为离散设备采用的是决策衡量准则。当你用手指计数时,没有“两个数之间”的值。我们可以通过在整数位置上增加阻尼点(某种机械性的黏性点)来修改计算尺使它包含决策衡量准则。但这么做就把模拟设备变成了一个离散的设备,消除了它表示实数的能力。实际上,决策衡量准则使得某些数值范围无法被表示。在数学上,这类似于将数字四舍五入到最接近的整数。

我们说过干扰好像是来自外部的,所以你没准会认为可以通过使用某种屏蔽来减少干扰,就像铅保护超人免受氪石的伤害一样。但还有另一种更隐蔽的干扰源:电流。它会影响远处的东西,就像重力一样。这点有好的应用方面,否则我们就不会有无线电。但这也意味着,信号沿着芯片上的导线传播时,会影响其他导线上的信号,特别是当芯片上的导线离得很近的时候。现代计算机芯片上的导线只相距几纳米(10–9米)。相比之下,一根头发的直径大约是10万纳米。这种干扰有点像反向行驶的两辆车在马路上驶过时你感受到的风。因为没有简单的方法来使芯片免受这种串扰效应,所以使用决策衡量准则下抗噪能力更强的数字电路是必需的。当然,我们可以把东西做得更大,使电线相距更远以减少干扰的影响,但这与我们效率更高的目标背道而驰。跳过决策衡量准则的障碍所需要的额外能量,使我们获得了一定程度的抗噪能力,这是使用连续设备所得不到的。

事实上,使用决策衡量准则带来的稳定性是我们构建数字(离散)计算机的主要原因。但是,你可能已经注意到了,只要不提那些小到存在于量子物理学的事物,这个世界就是一个模拟(连续)世界。下一节将介绍如何操纵模拟世界获得构建稳定计算设备所需的数字行为。

2.1.4 模拟世界中的数字

很多工程都巧妙地应用了自然界中存在的传递函数。这些函数就像你在数学课上学到的函数一样,只不过它们代表的是现实世界中的现象。例如,图2-4展示了一个数码相机传感器(或老式模拟相机的胶片)的传递函数图。

图2-4 数码相机传感器或胶片传递函数

x轴表示进入的光量(输入),y轴表示记录的亮度或传感器记录的光量(输出)。曲线表示它们之间的关系。

我们通过将一个输入球弹离曲线来获得输出,进而探究传递函数。可以看到,对于不同的光量值,传递函数会产生不同的记录亮度值。注意,传递函数是曲线,不是直线。如果光量达到曲线肩部对应的光量,图像就会过度曝光,因为记录亮度值会比实际场景里的光值更紧密。同样,如果光量达到曲线的底部,那么拍摄的画面就会曝光不足。我们的目标(除非是为了特殊的效果)是调整曝光,使之达到线性区域,这将产生最忠于现实的表现。

工程师们已经开发出各种方法来利用传递函数,例如调整相机上的快门速度和光圈,使光线达到线性区域。放大器电路,如驱动音乐播放器中扬声器或耳塞的电路,是另一个例子。

图2-5展示了改变音量对放大器传递函数的影响。

图2-5 增益对放大器传递函数的影响

音量控制可以调整增益或曲线的陡峭度。可以看到,增益越高,曲线越陡峭,输出音量越大。但对于1984年电影《摇滚万岁》中的那种增益可以调到11的特殊声音放大器会怎样?那样信号就不再局限于线性区域了。这将导致失真,因为输出的声音不再是输入的忠实再现。从图2-6中可以看到,输出与输入不相似,因为输入延伸到了传递函数的线性区域之外。

图2-6 放大器削波

输入的微小变化会导致曲线陡峭处的输出发生跳跃。这就像从一个手指跳到另一个手指——追求的决策衡量准则,称为阈值。这种失真是一种有用的现象,因为输出值只会落在阈值的一侧,很难落在那些值的中间。落在两侧的输出值把连续的空间分割成了离散的区域,这就是我们追求稳定性和抗噪能力(在受干扰的情况下依然发挥作用的能力)所需要的。你可以认为模拟对应的是一个大的线性区域,而数字对应的是一个小的线性区域。

小时玩跷跷板的时候会发现这一现象(如果你有幸成长在教育游乐场设备不被认为是危险的时代):处于低端时(一直向下)或高端时(一直向上)比试图在两者之间的某个地方保持平衡要稳定得多。

2.1.5 为什么使用位而不是数字

我们已经讨论过为什么数字技术相比模拟技术更适合计算机。但为什么计算机要用位而不是数字?毕竟人们使用数字,而且因为我们有10个手指,所以很擅长10以内的运算。

最明显的原因是计算机没有手指。一方面,用手指数数虽然很直观,但不是一种非常有效的方法,因为每数一个数字都要用一个手指。另一方面,如果你像用位那样用每个手指来表示一个值,手指是不够用的。使用位而不是数字并不是一个新的想法,事实上,早在公元前9年,中国人就用6位数字来引用《易经》中的八卦。使用位代替手指,效率至少提高了100倍。即使是以四根手指为一组,来表示由十进制(BCD法)表示的十进制数,在效率方面也比普通计数方法要高。

对于硬件来说,使用位比数字好的另一个原因是,使用数字无法简单地调整传递函数以获得10个不同的阈值。我们可以构建实现图2-7左侧的硬件,但它会比实现10个图2-7右侧的硬件都要复杂和昂贵。

图2-7 十进制与二进制阈值对比

当然,如果能在一个空间里建立10个阈值,我们肯定会这样做。但是,用10个位都比用1个数字更好。这就是现代硬件的工作原理。它利用了传递函数的底部区域和肩部区域(在电气工程中,分别被称为截断和饱和)。这有很大的回旋余地,需要很大的干扰才会得出错误的输出。传递函数的曲线非常陡峭,以至于输出值从一个值突然切换到另一个值。


[1]1码=0.914 4米。——编辑注

[2]1英里=1 609.344米。——编辑注

[3]英制容量单位,1盎司=0.028 4升(在美国,1盎司=0.029 57升)。