ysyudhjhchhc品牌hhhsusiisjjjhxdhhhshus是什么意思?


《编码:隐匿在计算机软硬件背後的语言》 TXT
第一章 电筒密谈
假若你才10岁你的好朋友与你临街而住,而且你们卧室的窗户面对着面每天晚上,当父母像平常一样很早催伱上床睡觉
时你可能还想与好朋友交流思想、发现、小秘密、传闻、笑话和梦想,没有人可以责备你毕竟,渴望交流是大多数人的天性。
当你们卧室还亮着灯时你和你的好朋友可以临窗舞动手臂、打手势或以身体语言来交流思想,但复杂一些的交流就有些困难了而且┅旦父母宣布“熄灯”,交流也就无法继续进行了
如何联系呢?用电话吗10岁的小孩子屋里有电话吗?即使有你们的谈话可能被偷听。如果家里的电脑通过电话线联了网它可能会提供无声的帮助,不过很不幸它也不会在你的房间里。
你和朋友采用的方法是用手电筒所有的人都知道手电筒是为孩子们藏在被窝里看书而发明的,它也适合在黑暗中用来交流它无声无息,且光的方向性很好不会从卧室的门缝中泄露而使家人起疑。
用手电筒的光可以交谈吗这值得一试。一年级你就学过在纸上写字母和单词把这种方法运用到手电筒仩看起来也合情合理。你所需做的就是临窗而站用光画出字母。画字母‘O’就打开电筒,在空中画个圈然后关上开关;字母‘I’则昰画竖直的一笔。但是你很快发现这种方法行不通当你注视来去飞舞的光柱时,会发现在脑海中将它们组合起来不是件容易的事这些咣划成的圈圈杠杠太不准确了。
也许你曾经看过一部电影影片中两个水手隔海用闪烁的光传递消息。在另一部电影中一个间谍用镜子反射阳光向一间屋子中被俘获的同伙发送讯息。这就给了你启发你起先设计一种简单的交流方法,使字母表中的每个字母与一定数目的閃烁相对应A闪一下,B闪两下C闪三下,如此递推Z就闪烁26下。BAD这个词由字母间有间隔的两闪、一闪、四闪组成这样你不会误以为它是閃七下的字母G了。词间的停顿则比字母间的停顿时间稍长一些
这看起来很有希望,采用这种方法的优点是你不需要在空中挥舞手电简呮需对准方向按开关就行了;缺点是你试图发送的第一个消息(“Howareyou?”)就需要131次闪烁,更糟的是你忘了定义标点符号,所以无法表示句尾的问号了
这离问题的解决已经很近了,你想别人以前肯定也遇到过类似的问题你解决它的思想一定是正确的。为了解决问题白天嘚图书馆之行使你发现了神奇的摩尔斯电码(morsecode),这正是你想要的即使你不得不重新学习如何“写”字母表中的字母。
以下就是区别:茬你发明的体系中每个字母是一定数目的闪烁,从闪烁一下的A到闪烁26的Z;而在摩尔斯电码中有长短两种闪烁,当然这会使摩尔斯电碼更为复杂,但它在实际应用中却被证实是更有效的那句“Howareyou?”现在仅需32次而不是131次闪烁而且这还包含了问号。
在讨论摩尔斯电码的笁作原理时人们并不说“长闪烁”、“短闪烁”,他们使用“点(dot)”和“划(dash)”因为这样易于在印刷品上表示。在摩尔斯电码中字母表中的每一个字母与一个点划序列相对应,正如在下表中你所看到的:

尽管摩尔斯电码与计算机毫不相关但熟悉它的本质却对深叺了解计算机内部语言和软硬件的内部结构有很大的帮助。
在本书中编码或代码(code)通常指一种在人和机器之间进行信息转换的系统(體系)。换句话说编码便是交流。有时我们将编码看成是密码(机密)其实大多数编码并不是的。大多数的编码都需要被很好地理解因為它们是人类交流的基础。
在《百年孤独》的一书的开篇马尔克斯回忆了一个时代,那时“世界一片混沌许多事物没有名字。为了加鉯区别才给事物各个命名”这些名字都是随意的,没有什么原因说明为什么不把猫称为狗或不把狗称为猫可以说英语词汇就是一种编碼。
我们用嘴发出声音组成单词这些词可以为那些听得到我们声音,理解我们所用语言的人所听懂我们称这种编码为“口头语言”或“语音”。对写在纸上(或凿在石头上、刻在木头上或通过比划写在空气中)的词还有一种编码方式,那就是我们在印刷的报刊杂志囷书籍上看到的字符,称之为“书面语言”或“文本”在许多语言中,语音和文本间有很强的联系例如在英语中,字母或一组字母与┅定的读音相对应
手势语言的发明帮助了聋哑人进行面对面的交流。这是一种用手和胳膊的动作组合来表达词语中的单个字母、整个词忣其基本概念的语言对盲人来说,他们可以使用布莱叶盲文(Braille)这种文字使用凸起的点代表字母,字母串和单词当谈话内容要被迅速地记录下来时,缩写和速记是很有用的
人们在相互沟通时使用了各种不同的编码,因为在不同的应用场合其中的一些较其他的更为簡便。例如语言不能在纸上存储,所以使用了文字;语言、文字不适合用来在黑夜中安静地传递消息故摩尔斯电码是一个方便的替代品。只要一种编码可以适用于其他编码所不能适用的场合它就是一种有用的编码。
以后将看到计算机中使用了不同的编码来传递和存儲数字、声音、音乐、图像和视频(电影)。计算机不能直接处理人类世界的编码因为它不能模拟人类的眼睛、鼻子、嘴和手指来接收信息。尽管这些年来计算机的发展趋势使我们的桌上电脑具有捕获、存储、处理和提供人类交流中所使用的各种信息的能而且不论这些信息是视觉的(文字和图片)、听觉的(语言、声音及音乐)还是两者的混合(动画和电影)。所有这些信息都要求使用它们自己的编码方式正如交谈需要使用人的某些器官(嘴和耳朵),而书写和阅读则需要使用另外一些器官(手和眼睛)一样
用手电筒发送摩尔斯电碼时,电筒的开关快速地合开代表一个点让电筒照亮稍长的时间则代表一个划。举例来说发送字母A,要先快速地合开开关然后再稍慢些合开。在发送下一个字母前要有短暂的停顿约定划的时间大约是点的3倍。例如如果点的照亮时间为1秒,那么划就是3秒(实际上,摩尔斯电码的传递速度要快得多)接收者看到了短闪和长闪就知道是A。
摩尔斯电码中点划之间的间隔是极为关键的例如,发送字母A時点划之间的间隔应与一个点的时间大致相同(如果点的时间是1秒,那么间隔的时间也是1秒)同一个词中字母间间隔稍长,约为划的歭续时间(或者3秒如果那是划的持续时间的话)。下面是单词“hello”对应的摩尔斯电码图中示意了字母间的间隔(隙):

单词之间相隔夶约2倍于划的时间(如果划是3秒,那么间隔即为6秒)下面是“hithere”对应的编码(码字):

手电筒开和关的时间长度并没有限定,这取决于點的时间长度点长又由手电筒开关触发的速度和摩尔斯电码发送者记忆电码的熟练程度来决定,熟练发送者的划也许与生手的点等长這个小问题会使接收电码有些困难,但在一两个字母之后接收者通常就可以辨认出哪个是点,哪个是划了
粗看起来,摩尔斯电码的定義—这里所谓的定义是指与字母表中的字母相对应的各种点划序列—与打字机字母的排列一样是随意的但仔细观察后你会发现不完全如此,简短的码字分配给了使用频率较高的字母例如E和T,爱赌博的人和“财富之轮”爱好者可能一下就注意到了这个问题;不常用的字母洳Q和Z(它们在赌局中是10点)则分配以较长的码字
几乎所有人都知道一点儿摩尔斯电码,国际遇险信号SOS的摩尔斯电码为“三点三划三点”SOS并非缩写,选择它仅仅因为它有一个易记的摩尔斯电码序列第二次世界大战中,英国广播公司选用贝多芬第五交响曲中的片段作为节目前奏—BAH、BAH、BAH、BAHMMMMM听起来颇像摩尔斯电码中V(代表Victory)的码字。
摩尔斯电码的一个缺点是它没有对大小写字母进行区分除表示字母外,摩爾斯电码还用5位长的码字来表示数字:

这些数字的码字看起来还有些规律(相对于字母对应的码字而言)大多数标点符号的码字采用5位、6位戓7位的码长:
对欧洲一些语言中的重音字母以及一些有特殊用途的缩写定义了特别的码字,SOS就是这样一个缩写:发送时每个字母的码字之間仅有一点的时间间隔如果有特制的用于发送摩尔斯电码的手电筒,你和朋友之间的交流就方便多了这种手电筒除了常有的开关,还囿一个按钮按压按钮就可以控制电筒的亮灭。经过练习后你们每分钟可以发送和接收5~10个单词。虽然仍比交谈慢(大概每分钟100个词左祐)但已足够用了
当你和朋友最终熟记了摩尔斯电码时(这是唯一精通发送接收的方法),你也可以用它代替日常用的语言为了达到朂高的速度,可以发“滴(dih)”音代表点、“嗒(dah)”音代表划摩尔斯电码同样也可将文字简化为用点和划两个符号表示。
以上的关键在于“两”这个词—“滴、嗒”两个声音“点、划”两种方式。实际上任何两种不同的东西经过一定的组合都可以代表任何种类的信息
摩爾斯电码由萨缪尔·摩尔斯(1 7 9 1 —1 8 7 2)发明,本书后面会在多处提到他摩尔斯电码是随着电报机的发明而产生的,电报机我们以后也还要做詳尽的说明正如摩尔斯电码很好地说明了编码的本质一样,电报机也提供了理解计算机硬件的良好途径
大多数人认为摩尔斯电码的发送易于接收,即使你没有记住摩尔斯电码也可以方便地借助下面这张按字母顺序排列的表发送:

接收摩尔斯电码并将其翻译回单词比发送费时费力多了,因为译码者必须反向地将已编码的“滴-嗒”序列与字母对应例如,在确定接收到的字母是“Y ”之前必须按字母逐个哋对照编码表。
问题是我们仅有一张提供“字母→摩尔斯电码”的编码表而没有一张可供逆向查找的“摩尔斯电码→字母”译码表。在學习摩尔斯电码的初级阶段这张译码表肯定会提供很大的便利。然而如何构造译码表却毫无头绪,因为我们似乎无法找出这些按字母順序排列的“滴-嗒”序列的规律
那么忘记那些字母序列吧,也许按照码字中“滴”“嗒”的个数来排列会是个更好的尝试例如,仅含┅个“滴”或“嗒”的摩尔斯电码序列只可能代表E 或T 这两个字母之一:

两个“滴”或“嗒”的组合则代表了4 个字母I 、A 、N 、M

三个“滴”或“嗒”的序列代表了8 个字母:

最后(如果不考虑数字和标点符号的摩尔斯电码)四个“滴”或“嗒”的序列则共代表了1 6 个字母:

四张表囲包括2 + 4 + 8 + 16 =3 0 个编码,可与3 0 个字母相对应比拉丁字母所需的2 6 个字母还多了4 个。出于这个原因在最后一张表中,你可能注意到有4 个编码与重喑字母相对应
在翻译别人发送的摩尔斯电码时,上面4 张表提供了极大的便利当你接收到一个代表特定字母的码字时,按其中含有的“滴”“嗒”个数至少可以跳到其对应的那张表中去查找。每张表中全“滴”的字母排在左上角,全“嗒”的字母排在右下角你注意箌4 张表大小的规律了吗?每张表都恰好是其前一张表的两倍大小这其中包含的意义是:前一张表的码字后加一个“滴”或加一个“嗒“,即构成了后一张表 可以按下面的方式总结这个有趣的规律:

四张表中每张码字数都是前一张的两倍,那么如果第一张表含2 个码字第②张表则含2 ×2个码字,第三张表2 ×2 ×2个码字以下是另一种表达方式:

当然,如果遇到数的自乘可以用幂表示,例如2 ×2 ×2 ×2 可以写成24數字2 、4 、8 、1 6 分别是2 的1 、2 、3 、4 次幂,因为可以用依次乘2 的方法将它们计算出来由此我们的总结还可以写成下面的方式:

这张表简单明了,碼字数是2 的次方次方数目与码字中含有的“滴”“嗒”数目相同。我们可以把表总结为一个简单的公式:

很多编码中都用到2 的幂在下┅章中我们会看到另一个例子。为了使译码的过程更为简便可以画出如下一张树形图:

这张表表示出了由“滴”与“嗒”的连续序列得絀的字母。译码时按箭头所指从左到右进行。例如你想知道电码“滴-嗒-滴”代表的字母,那么从最左边开始选择点沿箭头向右选择劃,接着又是点得出对应的字母是R,它写在最后一个点的旁边
如果认真考虑,会发现事先建立这样一张表是定义摩尔斯电码所必需的首先,它保证了你不会犯给不同的字母相同码字的错误!其次它保证你使用了全部的可用码字,而没有使“滴”与“嗒”的序列毫无必要的冗长
我们可以加长码字至5 位或更长,5 位长的码字又提供了额外的3 2 (2 ×2 ×2 ×2 ×2 或25)个码字一般而言,这就足够1 0 个数字和1 6 个标点符號使用实际上,摩尔斯电码中的数字确实是5 位的但在许多其他编码方式中,5 位码字常用于重音字母而不是标点符号
为了包含所有的標点符号,系统必须扩充至6 位表示提供6 4 个附加编码,此时系统可表示2 + 4 + 8 + 1 6 + 3 2 + 6 4 共1 2 6 个字符这对摩尔斯电码而言太多了,以至于留下许多“未定义”的码字此处“未定义”指不代表任何意义的码字,如果在你接收的摩尔斯电码中有未定义的码字就可以肯定发送方出了差错。
由于嶊出了下面这条公式:

我们就可以继续导出更长的码字位数所代表的码字数目很幸运,我们不必为确定码字数目
而写出所有可能的码字我们所要做的不过是不断地乘2 而已:

摩尔斯电码被称为二元码(binary code ),因为编码中仅含“滴”和“嗒”这与一个硬币很相似,硬币着地時只可能是正面或反面二元事物(例如硬币)、二元编码(例如摩尔斯电码)常常用2的乘方来描述。
上面所做的对二元编码的分析在数學上的一个分支—组合学或组合分析里只能算是一个简单的练习传统上,由于组合分析能够用来确定事件出现的几率例如硬币或骰子組合的数目,所以它常用于概率统计但它也同样有助于我们理解编码的合成与分解。
第三章 布莱叶盲文与二元编码
摩尔斯不是第一个成功地将书写语言中的字母翻译成可解释代码的人他也不是第一个因为其编码而受到人们纪念的人,享有这个荣誉的是一个晚摩尔斯1 8 年出苼的早慧的法国失明少年虽然人们对他的生平所知甚少,但就是所知的这一些却足以给后人留下深刻印象

岁时,在这个本不该在父亲莋坊里玩耍的年龄小布莱叶意外地被尖头的工具戳中了眼睛。由于伤口发炎感染了另一只眼,他从此双目失明布莱叶原本注定在贫困潦倒中度过一生(正如那时大多数盲人一样),但他的聪明才智和求知欲不久即显露了出来在本地牧师和一位学校老师的帮助下,布萊叶和其他孩子一道上了学1 0 岁那年又前往巴黎的皇家盲人青年学院学习。

盲人教育的一大障碍就是他们无法阅读印刷书籍Valentin Haüy(1745 —1 8 2 2 ),巴黎學校的创始人发明了一种将字母凸印以供触摸阅读的方法。但这种方法使用起来较为困难并且只有很少的书籍用这种方法“制造”。

      視力正常的H a ü y 陷入了一种误区对他而言,字母A 就是A 它看起来(或感觉起来)也必须像是个A 。(如果给他手电筒作为交流工具他也会試图在空气中画出字母的形状,而我们已经知道这种方法并不有效)H a ü y也许没有意识到一种与印刷字母完全不同的编码会更适于盲人使鼡。

的书写体系这种体系也被称为“夜间文字。他使用厚纸板上有规律凸起的点划来供士兵们在夜间无声地传递口信(便条)士兵们使用尖锥状的铁笔在纸的背面刺点和划,凸起的点可以用手指感觉阅读

体系的问题是其过于复杂。Barbier没有用凸起的点来代表字母表中的字毋而是用其代表声音。这样的系统中一个单词通常需要许多码字表达这种方法在野外传递短小消息还算有效,但对长一些的文章而言則有明显不足更不要说是整本的书籍了。

        布莱叶在12 岁时就熟悉Barbier 方法了他喜欢使用这些凸点,不仅因为它们易于用手指阅读更因为它們易于书写。教室里拿着铁笔和纸板的学生可以记笔记供课后阅读布莱叶勤奋地工作试图改进这种编码系统。不出3年(在他15 岁时)他創建了自己的系统,其原理直到今天还在使用布莱叶系统有很长时间仅局限在他所在的学校使用,后来它逐渐扩散到世界各地1835年,布萊叶染上了结核病1852 年,在他43 岁生日过后不久他便去世了。

      时至今日布莱叶系统的改进版本甚至可以与有声录音带竞争,它为盲人提供了与书写世界联系的途径布莱叶方法仍是适于既聋又盲的人阅读的唯一方法。近来年随着电梯和自动语言机的普及,布莱叶系统更加广为人知

      本章将剖析布莱叶编码的编码方法及其工作原理,不过不必真正学习布莱叶编码或记住任何东西我们只要大概了解一下编碼的本质就行了。

        布莱叶编码中普通书写语言的每个字符—具体而言如数字、字母和标点符号—都被编码成局限在2 ×3 小格中一个或多个凸起的点。这些小格一般被标记为1 ~6

   在当今实际使用中特殊的打字机或刻印机可以在纸上打出布莱叶编码中的小点。

      由于在书中夹印幾页布莱叶编码极其昂贵我们使用了在通常印刷品中常用的布莱叶码的表示方法。在这种表示方法中小格中的6 个点全部印刷出来,大點代表小格中的凸起点小点则代表平滑的点。例如下图中的布莱叶字母中点1 、3 、5 是凸起的,点2 、4 、6 则没有:

      如果我们发现布莱叶编码呮用了6 4 个码字中的一部分我们会疑问为什么6 4 个码字中有一些不被使用;如果发现布莱叶编码使用了多于6 4 个的码字,则又会让人怀疑我们昰否神志清醒或数字计算的真实性2 乘2 是等于4吗?

      注意代表同一个单词中的字母的小格用一个小距离分隔,大一些的距离(一般是没有凸点的小格)用来分隔不同的单词

      这就是布莱叶发明的布莱叶编码的基础,布莱叶还为法文中出现的重音字母设计了码字注意,W 没有對应的码字这时由于在古法语中没有W (不必担心,这个字母最终还是会露面的)这样算来,我们仅使用了6 4 个码字中的2 5

       通过仔细的檢查,会发现上面的布莱叶编码存在特定的规律第1 行(从字母a ~j )只用了小格的上面4 个点—点1 、2 、4 、5 ;第2 行除了点3 凸起外其余都与第1 行楿同,第3 行则除了点3 、6 凸起外其余都与第1行相同

          在布莱叶之后,布莱叶编码在许多方面有了扩展现在大多数英语出版物所使用的系统昰二级布莱叶码。二级布莱叶码采用了许多缩写来简化编码树以提高阅读速度以下的三行(包括“完整的”第3 行)显示了下面这些词的碼字:

         到现在为止,已描述了3 1 个码字—词间没有凸起点的空格和三行每行1 0 个用于字母和单词的码字这离理论上可用的6 4个码字还相距甚远。不过我们将要看到在二级布莱叶码中,没有任何浪费的码字

      首先,我们使用a ~j 的编码加上凸起的6 号点它们代表词中的缩写,这其Φ包括W 和另一个词的缩写:

         头4 个码字代表逗号、分号、冒号和句号注意左括号和右括号用同一个码字代表,但左引号和右引号则使用了鈈同的码字

  “ble ”的码字非常重要,因为当它不是单词的一部分时它表明其后跟随的码字要被翻译成数字,这些数字的编码与a ~j 的编码楿同:

      如果你一直在计数的话我们还需要7 个码字才能达到总计的6 4 个码字。下面就是剩余的7 个码字:

      第一个(点4 凸起)是重音字母标识符其余的作为一些缩写的前缀,也用于其他用途:点4 、6 凸起时(本行的第5 个码字)该码字代表数字中的小数点或强调标识符,这由上下攵决定点5 、6凸起时,码字则是与数字标识对应的字母标识

      最后(也许你正在疑惑布莱叶编码如何表示大写字母),我们用6 号点来作为夶写标识它表明其后跟随的字母是大写的。例如可用如下的码字写出该编码创始人的名字:

      这包含大写字母标识、字母l 、缩写o u 、字母i 囷s ,空格另一个大写字母标识,字母b 、r 、a 、i 、l 、l 和e(在实际应用中该名字还可以再删掉最后两个不发音的字母)。

个码字根据上下文夶多有双重含义其中有数字标识以及取消数字标识作用的字母标识。这些标识改变了跟随其后的码字的含义—从字母变数字或从数字变芓母起这种作用的码字常被称为“先行码/前置码”或“转义码”,它们更改其后字符的含义直至更改作用被取消

      大写标识表示其后的芓母(也仅有字母)应写成大写,这种码字被称为“换码代码”“换码代码”使你“避免”那种单调的、常规的码字解释,而转入一种噺的解释方法在以后几章中可以看到,当把书面语言转换为二元码字时“换码代码”和“转义码”的使用是很普遍的。

第四章  手电筒剖析

    手电筒的用途极为广泛用于在黑暗的遮盖物里阅读和用于发送编码消息只是两个用途最明显的方面。最普通的家用手电筒也能在教學演示中说明神秘物质电(e l e c t r i c i t y)时扮演中心角色

    电是一种令人称奇的现象,尽管它已得到普遍应用但依然还保持着很大的神秘性,即使對那些自称已经弄清楚它的工作原理的人而言也是这样但恐怕不管怎么样,我们都必须好好努力钻研一下电学幸运的是,我们只需要奣白一小部分基本概念就可以理解它在计算机中是怎样应用的

    手电筒当然是一种大多数家庭都拥有的较简单的电器。拆开一支有代表性嘚手电筒你会发现它包括一对电池,一个灯泡一个开关,一些金属片和一个把所有零件装在一起的塑料筒只用电池和灯泡,就可以洎己做一个简单的手电筒当然,还需要一些短的绝缘线(末端的绝缘皮除掉)和足够多的连接物:

    注意上图右边两个松开的线端(头)那就是开关。如果电池有电并且灯泡也没有烧坏的话接触两个线端,灯就亮了

    这是我们要分析的头一个简单电路,首先要注意的是電路是一个回路只有从电池到电线、到灯泡、到开关、再回到电池的路径是连续畅通的,灯泡才会亮电路中任何一点断开都会引起灯泡的熄灭。开关的目的就是控制电路开闭这个过程

    电路环接的特性提示我们有某种物质在电路中循环移动,可能与水在水管里流动有某些相似“水与水管”的类比常用来解释电的工作机理,但最终它也像其他类比一样不可避免地解释不下去了电在宇宙中是独一无二的,必须用它的术语来解释它

    在对电的工作的理解中,最流行的科学理论是电子理论(electron theory)该理论认为电起源于电子的运动。

    众所周知┅切物质—我们能看到、感觉到的东西—(通常)是由极其微小的被称为原子的东西构成。每一个原子是由三种微粒构成的即中子、质孓和电子。你可以把原子画成一个小的太阳系中子和质子固定在原子核内而电子像行星环绕太阳一样围绕原子核运动:

需要解释一下的昰该模型与你在一个放大倍数足够大的显微镜下看到的真正原子不是一模一样的,它只是一个示例模型

    图中原子包含3 个电子、3 个质子和4 個中子,说明这是一个锂原子锂是已知的11 2种元素之一,它们的原子序数由1 ~11 2 一种元素的原子序数是指元素的原子核中质子的个数,通瑺也是其电子数锂的原子序数为3

    原子能够通过化学合成形成分子分子与组成它的原子的性质通常是不同的。比如水分子包含两个氢原子和一个氧原子(即H 2 O)显然水既不同于氢气,也不同于氧气同样,食盐分子由一个钠原子和一个氯原子构成而钠和氯都不可能成為法国馅饼的调味品。

    氢、氧、钠、氯都属于元素水和食盐都属于化合物。但是盐水是一种混合物而不是化合物,因为其中水和食盐嘟保持它们各自的性质不变一个原子的电子数通常等于其质子数。但在某种特定环境下电子能从原子中电离出来,这样电就产生了

嘚真正意思是“琥珀”,一种玻璃状的硬质树液这个看似不相关的词源来自于古希腊人所做的实验,他们用琥珀与木头相摩擦而产生我們今天所说的静电在琥珀上摩擦木头使木头从琥珀获得电子,结果木头所含的电子数多于质子数而琥珀所含的电子数小于质子数在更哆的现代实验中,地毯能从鞋底获得电子

质子和电子具有带电荷的特性,质子带正电荷(+)、电子带负电荷(-)中子是中性的,不帶电即便我们用加减号来标明质子和电子,但符号并不表示算术运算中的加号和减号的意思也不表示质子拥有某些电子所不具备的东覀。使用这些符号仅仅表示质子和电子在某个方面性质相反这个相反的特性也正表明了质子和电子是如何相互关联的。

    当质子数与电子數相等时它们是最适合和最稳定的。质子数与电子数的不平衡会导致它们趋于平衡静电火花就是电子运动的结果,是电子从地毯通过伱的身体再流回到鞋子的过程引起的

    描述质子和电子关系的另一条途径是注意观察异电性相吸同电性相斥的现象,但光凭看原子结构图峩们是不能猜想到的表面上看原子核中挤在一起的质子是互相吸引的。质子是通过比同性斥力大的某种力聚合在一起的这种力叫强内仂。释放核能的原子核裂变就是由于强内力导致的本章只讨论通过得失电子获得电(电能)的问题。

    静电不只存在于手指触摸门把手时閃出的火花之中暴风雨时,云层的下层积累电子而云层的顶层失去电子闪电的瞬间,电子的不平衡马上消失闪电正是大量的电子迅速从一端转移到另一端的结果。

手电筒电路中的电能显然比电火花或闪电之中的电能要好利用得多灯泡能稳定持续地亮是因为电子并不昰从一点跳到另一点。当电路中的一个原子把一个电子传给邻接的另一个原子时它又从另一个邻接的原子获得电子,而这个原子又从它嘚一个邻接原子获得电子如此依次循环。可见电路中的电就是从原子到原子的电子通路这不可能自发形成。仅仅只把一些破旧的电路材料连接在一起是不可能有电能产生的需要某种可以激发电子环绕电路移动的物质。再分析一下前面所画的简单手电筒电路图可以肯萣激发电子运动的既不是电线,也不是灯泡那么最有可能的就是电池了。

   几乎每一个人都多少了解手电筒里所用电池的类型方面的一些知识:

1、它们都呈管状且大小不同。比如有D 、C 、A 、A A 和A A A等型号

2、无论电池大小怎样,它们都被标有“1 . 5伏”

3、电池的一端是平的,标有┅个负号(-);另一端中间有一个小突起标有一个正号(+)。

4、要想设备正常工作就要正确安装电池(注意电池极性)。

5、电池的電能最终将用尽有的电池可以充电,有的不行

6、由此可以猜测,电池是用某种奇特的方式产生电能

    所有的电池中都发生着化学反应,一些分子裂变成其他分子或者结合形成新的分子电池中有化学物质,这些化学物质就是用来起反应从而在标有(-)的电池的一端(称为负极或阴极)产生多余的电子而在电池的另一端(称为正极或阳极)需要得到电子。这样化学能转化为电能。

    只有当某种特别的電子通过某条途径从电池负极出发然后再传送到正极时,化学反应才能发生因此假如一节空电池放在那里,那么什么事也不会发生(倳实上化学反应还是在进行的,只是速度极慢)只有一条电路能将电子运离负极又为正极提供电子时,反应才会发生电子在下图电蕗中是沿逆时针方向运动的:

    如果不是基于这个简单的事实:所有的电子,不管来自什么地方都是一模一样的,否则来自电池的化学粅质里的电子就不可能如此随意地与铜导线的电子混合在一起的。铜导线的电子与任何其他电子是没有区别的

    注意,两个电池都是向着哃一个方向放在下面的电池的正极从上面电池的负极获得电子,这样两个电池就好像结合形成了一个更大的电池这个大电池一端为正極,另一端为负极其电压是3 伏而不是1 . 5伏了。

    如果把电池中的一个倒置电路就会连不通,如下图所示:

在化学反应中两个电池的正极嘟需要获得电子,但由于它们相互接触电子无法通过某种途径到达它们。如果两个电池的正极连上了,那么它们的负极也应该连上如下圖所示:

   这样的电路还是能连通。电池的这种连接方法称为并联前一种连接方法称为串联。并联后的电压与单个电池电压同样都是1 . 5伏並联后的灯仍然可能亮,但不如串联时亮度大不过电池的寿命将会是串联时的两倍。

   通常认为电池为电路提供电能但同样也可以认为電路为电池化学反应的发生创造了条件。电路将电子从负极传送到正极电路中的化学反应将一直进行到所有的化学物质耗尽,这时你就需要换电池或是给电池充电了

   电子从电池的负极到正极流经了导线和灯泡。为什么需要导线电不能通过空气传导吗?噢可以说能,吔可以说不能电能够通过空气导通(尤其是潮湿的空气),否则也观察不到闪电但电不能很轻易地流经空气。

    一些物质的导电能力比其他物质的导电能力明显要好元素的导电能力取决于它内部的原子结构。电子绕核旋转是在不同的轨道上的这些轨道称为层。最外层呮有一个电子的原子最容易失去那个电子这正是导电需要具备的性质。这些物质易导电因而被称为导体铜、银和金都是良好导体,这彡种元素位于元素周期表的同一列不是巧合铜是最常用的导线材料。

   导电物质的对立物质称为绝缘物质一些物质阻碍电的能力比其他粅质阻碍电的能力强,这种阻碍电的能力称为电阻如果一个物质有很大的电阻—说明它根本不能导电—它就被称为绝缘体。橡胶和塑料嘟是很好的绝缘体因而它们常用来做电线的绝缘皮。在干燥空气的情况下布料和木材也是很好的绝缘体。其实只要电压足够高任何粅质都能导电。

    铜的电阻很小但它仍有电阻。导线越长电阻越大。如果你用数里长的导线连接手电筒导线的电阻将会大得令手电筒鈈亮。导线越粗电阻越小,这可能有点违反直觉你也许认为粗的导线需要更多的电来“充满它”。而事实上导线越粗,电子越容易通过它我已经提到过电压,只是还没有给出它的定义一节电池为1 . 5 伏特意味着什么呢?实际上电压—得名于Count Alessandro Volto(1745—1827),他于1800年发明了第一节電池—是初等电学中较难理解的概念之一电压表征电势能的大小,无论一节电池是否被连通电压总是存在的。

假设有一块砖头如果紦它放在地上,它的势能很小当你把它举起至离地面4英尺高时,它的势能就增加了你只要把砖块扔下,就能感觉到势能的存在当你茬一座高楼的顶层举着砖块时,它的势能更大上面三个例子里,你只是拿着砖块而什么也没做但砖块的势能却不同。

    电学里更早的一個概念是电流电流取决于电路中飞速流动的电子的数量。电流用安培来度量它得名于André Marie Ampére(1775 —1836),一般简称安比如“10安的保险丝”。当0000000 個电子在1秒内流过一个特定的点时就是1安培电流。

    用水和水管作个类比电流与流经水管的水量很相似,而电压类似于水压电阻类似於水管的粗细程度—水管越小、阻力越大。因此水压越高流过水管的水量越大;水管越小,流过它的水量就越少流过水管的水量(电鋶)与水压(电压)成正比而与水管的阻力(电阻)成反比。

    在电学中如果知道电压和电阻的大小,就可计算出电流的大小电阻—物質阻碍电流通过的能力—用欧姆度量,得名于Georg Simon Ohm(1789—1854)他提出了著名的欧姆定律,定律中表述

这里I 表示电流E 表示电压,R表示电阻

   举个例子,让我们看一节空置的电池:

这种文件命令的方式习惯上称为的文件存在于磁盘中则CCP把该文件装入从地址0100h处开始的内存中,然后转到地址0100h处的机器码指令开始执行程序

前面讲述了如何在内存的任一地方加入机器码指令并执行,但按磁盘文件存储的CP/M程序必须设计成从内存嘚特定地址0100h处开始装入

CP/M包括几个有用的程序,如PIPperipheralinterchangeprogram)即外设交换程序,用来拷贝文件ED是文本编辑器,用来创建和修改文本文件像PIPED这类小且用来完成简单事务的程序通常称为实用程序。如果运行CP/M系统可以购买一些大的应用程序,如字处理软件或计算机电子报表软件;也可以自己编制这样的软件所有这些也都以COM类型的文件存储。

到目前为止已经知道了CP/M(像许多操作系统一样)如何提供命令和实鼡程序以便对文件进行基本的操作。同样也已经知道CP/M如何把程序装载到内存并执行。作为一个操作系统CP/M还有第三个主要功能。

CP/M下运荇的程序经常需要把输出写到视频显示器或者从键盘上读入输入的内容,或者从磁盘读取一个文件和向磁盘中写入一个文件但通常情況下,CP/M程序并不把程序输出直接写到视频显示存储器中;同样CP/M程序也不访问键盘硬件看看输入了什么,它也不访问磁盘驱动器硬件去读戓写磁盘的扇区

事实上,运行在CP/M下的程序利用CP/M中所构建的子程序集来完成这些公共事务这些子程序经过特别设计,从而使得程序很容噫访问计算机中的硬件—包括视频显示器、键盘和磁盘—且程序设计员不用关心这些外设实际上是怎样进行连接的更重要的是,在CP/M下运荇的程序不需要了解磁道、扇区这是CP/M的工作,它可以把文件存放到磁盘也可以读取磁盘上的文件。

为程序提供方便访问计算机硬件的掱段是操作系统的第三个主要功能操作系统提供的这种访问手段称之为应用程序接口,即APIapplicationprogramminginterface

CP/M下运行的程序通过设置寄存器C为某一特定值(叫作功能值)来使用API并执行指令:

例如,一个程序通过执行下面的指令获取从键盘上输入的键的ASCII码:

累加器A中包含有输入的键的ASCII碼同样

把累加器A中的ASCII码字符写到视频显示器中光标的位置,光标移到下一个位置

如果程序中要创建一个文件,则把寄存器对DE设置为包含有文件名所在的内存区域的地址然后执行以下代码:

此例中,CALL5指令使CP/M在磁盘上创建一个空文件程序可以利用其他功能向文件写入,朂后关闭文件意味着文件已经使用完毕。该程序和其他程序以后可打开文件并读取文件内容

CALL5到底能做什么呢?在内存0005h位置由CP/M设置了一條JMPJump)指令该指令跳转到CP/M基本磁盘操作系统(BDOS)所在的位置。这个区域包含有一些子程序用来完成CP/M的每一项功能BDOS正如它的名字一样,基本作用是维护磁盘上的文件系统通常BDOS必须利用CP/M基本输入/输出系统(BIOS)中的子程序,而BIOS可实现对像键盘、视频显示器以及磁盘驱动器这樣的硬件的访问实际上,BIOSCP/M中唯一需要了解计算机硬件的部分CCP利用BDOS的功能来实现自己功能,那些CP/M提供的实用程序也是如此

API是与设备無关的计算机硬件接口,也就是说在CP/M下编写的程序不需要知道某一机器上键盘的工作机制、视频显示器的工作机制或读写磁盘扇区的工作機制它只是简单地利用CP/M的功能来完成涉及到键盘、显示器和磁盘的工作。这样CP/M程序就可以在不同的计算机上运行,而这些机器可能会鼡差别很大的硬件来访问外设(所有CP/M程序必须运行在8080微处理器上,或能执行8080指令的处理器上如:Intel8085ZilogZ80。)只要计算机运行CP/M则程序僦可以利用CP/M的功能间接访问硬件。如果没有标准的API程序则需要针对不同类型的计算机来做不同的工作。

MS-DOS没有保留CP/M的文件系统在MS-DOS文件系統中使用的是一张叫文件分配表的表,即FAT这种技术最初由Microsoft公司在1977年采用。磁盘空间分成簇根据磁盘空间大小,簇的大小也从51216384字节不等每个文件是簇的集合,文件的目录项只表明了文件开始的簇FAT能够表明磁盘上每一个簇的下一簇。

MS-DOS磁盘上的目录项长32字节采用与CP/M一樣的的文件。MS-DOS的运行程序有两种:具有扩展名COM的文件大小不能超过64KB;具有扩展名EXE(可执行)的较大文件。

尽管开始时MS-DOS支持CALL5API功能接口但對新的程序推荐了新的接口。新的接口利用了8086的一个功能叫作软件中断这类似于子程序调用,但程序不需要知道它正在调用的确切地址程序通过执行指令INT21h调用MS-DOSAPI功能。

理论上讲应用程序只能通过操作系统提供的接口它们来访问计算机的硬件。但对针对20世纪70年代和80年代早期的小型操作系统的应用程序而言经常绕过操作系统,尤其是在处理视频显示器的时候直接写入字节到视频存储器的程序比采用其怹方式的程序执行速度要快。的确对有些应用程序—例如,那些需要在显示存储器上显示图形的应用程序—操作系统是不合适的MSDOS最吸引程序员的地方正是它的“反传统性”,程序员可以编写程序以达到硬件的最快速度

正因为如此,运行在IBMPC上的流行软件常常是根据IBMPC的硬件特点编制的机器制造商为了与IBMPC竞争也不得不沿袭这些特点。如果不这样做则会使得这些流行软件不能运行。这些软件通常要求硬件是“IBMPC或与IBMPC100%兼容”

MS-来完成这项工作。该程序是一个文本编辑器可用来创建、修改文本文件。现假设创建的文本文件名称为的程序来唍成这个程序是CP/M汇编程序,在CP/M命令行运行它含有与编写的汇编语言程序相对应的机器码(实际上,在这个过程中还有另外一步但在這里并不重要)。现在在CP/M命令行就可以运行文件包含有下面16个字节:

前面3个字节是LXI指令,紧接着2个字节是MVI指令再后面3个字节是CALL指令,嘫后是RET指令最后7个字节是“Hello”、感叹号和美元符号的ASCII码。

的编译程序运行在CP/MMS-DOS下第一个ALGOL程序是一个名为,或者是MS-DOS下的FIRST.EXE);有时还需要进行另一个步骤。无论怎样你都可以从命令行运行FIRST程序:

FIRST程序的响应是显示:

糟糕!还有一个拼写错误。这是一个编译程序不能发現的错误因此,称为运行时错误(run-timeerror)—即只在运行程序时才出现的错误

可以看出,在该ALGOL程序中print语句在屏幕上显示一些内容,本例是┅行文本(因此这个ALGOL程序等效于本章前面CP/M下的汇编程序)。print语句实际上并不是ALGOL语言正式定义的一部分这里只假设正在用的这个ALGOL编译程序包含有这样一个实用工具,有时称作内部函数print语句—就像许多ALGOL语句(除beginend外)一样—后面必须跟引号。print语句向里缩进不是必须的只鈈过使得程序结构更清晰。

假设要编写一个程序计算两个数的乘法每一个程序设计语言都有变量这个概念。在程序中变量名可以为一個字母、一个短的字母序列,甚至为一个短词实际上,变量对应于一个内存单元但在程序中是通过名字来引用的,并不是通过内存地址下面这个程序有3个变量,名为abc

real语句是说明语句用来表明程序中要说明的变量。本例中变量abc是实数或浮点数(ALGOL也支持关鍵字integer,用来说明整型变量)通常,程序设计语言要求变量名以字母开头只要第一个字符是字母,变量名可以包含数字但不能包含空格及许多其他字符。通常编译程序要限制变量名的长度本章的例子都采用一个字母作为变量名。

如果使用的ALGOL编译程序支持IEEE浮点数标准則程序中的3个变量都需要4个字节的存储空间(对单精度数)或8个字节的存储空间(对双精度数)。

接下来的三个语句是赋值语句在ALGOL中,賦值语句定义为冒号后紧跟等号(在许多计算机语言中,赋值语句只需用等号)赋值语句的左边是变量,右边是表达式前两个赋值語句是给ab赋给一个值,第三个赋值语句中变量c的值由变量ab产生今天,在程序设计语言中大家熟悉的×(乘号)通常不允许使用,因为它不属于ASCII码和EBCDIC的字符集。许多程序设计语言用星号(*)表示乘法虽然ALGOL用斜杠(/)表示除法,但也包括一个除号(÷)表示整数除法,即表明被除数中有多少倍的除数。ALGOL中也定义了箭头(↑)这是另一个非ASCII码字符,用来表示乘方

最后是用来显示的print语句。本例中即有攵本又有变量它们用逗号隔开。显示ASCII字符可能并不是print语句的主要工作本例中,它的功能还包括把浮点数转换成ASCII码:

接着程序终止返囙到操作系统。

如果想乘另外两个数则需要修改程序,改变数重新编译,再运行可以利用一个名为read的内置函数来避免这种频繁的重噺编译工作:

read语句从键盘读入ASCII码字符并转换成浮点数。

高级语言中一个非常重要的结构是循环循环使得同一段程序依据一个变量的多个鈈同的值来运行。假设有一段程序用来计算3579的立方就可以这样做:

for语句设置变量a的初值为3,然后执行do关键字以后的语句如果要執行的语句不止一条(本例中正是如此),则这些语句必须包括在beginend之间这两个关键字定义了一个语句块。for语句接着把变量a设置成579并执行这些相同的语句。

下面是for语句的另一种形式它计算399间奇数的立方值:

for语句设置变量a的初值为3,然后执行for语句后的语句块然後astep关键字后面的值2为步长增加,得到新值5并用来执行代码块。变量a不断加2当它超过99时,for循环结束

程序设计语言通常都有非常严格嘚语法。例如在ALGOL60中,关键字for后只能跟一种类型的东西即变量名。而在英语里单词for后可以跟许多不同的单词,如“forexample”虽然编译程序鈈是容易编写的简单程序,但它显然要比解释人类语言的程序要简单得多了

大多数程序设计语言的另一个重要特性是包含条件语句。条件语句只是在某个条件为真时才允许执行另一条语句下面是使用ALGOL内部函数sqrt的一个例子,用来计算平方根sqrt函数不能用来处理负数,所以程序中应避免出现这种情况:

左尖括号<是小于号如果用户输入的一个数小于0,则执行第一个print语句否则,该数大于等于0则执行包含叧一个print语句的语句块。

到目前为此本章程序中的每个变量只能存放一个值。用一个变量来存放多个值也是很方便的这就是数组。ALGOL程序Φ声明一个数组的方法如下所示:

本例中表明要用该变量来存储100个不同的浮点值,这些值称作数组元素第一个为a[1],第二个为a[2]最后一個为a[100]。方括号中的数字称作数组下标

下例程序计算从1100的所有数的平方根,把结果存放在数组中并显示出来:

程序中也声明了一个整型變量名为i(因为它是integer的第一个字母,所以经常用来作为整型变量名)在第一个for循环中,数组的每一个元素赋值为它的下标的平方根;苐二个for循环中输出这些值。

除了实型和整型外变量还可以声明为布尔型(为了纪念第10章提到的乔治·布尔)。一个布尔变量只有两个可能的值,即truefalse本章的最后一个程序里将用到布尔数组(和到目前为止学到的几乎所有特性)。该程序实现称为“Eratosthenes漏勺”的用来找到素数嘚著名算法Eratosthenes(大约公元前276-196年)是亚历山大传说中的图书馆的管理员,他由于精确地计算出了地球的圆周长而名垂史册

素数是指只能被1囷它本身整除的自然数。第一个素数是2(唯一的偶数素数)此外,素数还有357111317等等

Eratosthenes方法是从以2开始的正的自然数列表开始。洇为2是素数则要删除所有是2的倍数的数(即除2以外的所有偶数),这些数都不是素数因为3是素数,则要删除所有是3的倍数的数已经知道4不是素数,因为它已被删除了下一个素数是5,则要删除所有是5的倍数的数依此类推,那些余下的数就是素数

下面的ALGOL程序用来确萣2~10000的所有素数,通过声明一个布尔数组来标识从2~10000的所有数来实现该算法:

第一个for循环把数组所有元素的布尔值设置为true这样,程序一開始假设所有的数都是素数第二个for循环从1~100(为10000的平方根)。如果数是素数意味着a[i]为真,则另一个for循环用来把该数的倍数设置为false这些数都不是素数。最后一个for循环输出所有的素数即a[i]为真时对应的i值。

有时人们在争论程序设计到底是一门艺术还是一门科学一方面需偠在大学里学习有关计算机科学的课程,另一方面又要看著名的如DonaldKnuth的《TheArtofComputerProgrammign》系列这样的书物理学家RichardFeynman写道“更确切的说,计算机科学更像工程—都是用一些东西来实现另一些东西”

如果让100个不同的人都来编写输出素数的程序,将会得到100个不同的方法即使这些程序员都有“Eratosthens漏勺”这种思想,也不会正好以同样的方法实现如果程序设计真的是一门科学,就不会有如此多的方法而不正确的解决方法也是经常囿的。偶尔程序设计问题会激起富有创造性和敏锐观察力的火花而这就是“艺术”的成分。但是程序设计更多的是设计和组装的过程,就像在架设一座大桥

早期的许多程序设计员都是科学家和工程师,他们利用FORTRAN和ALGOL所要求的数学算法来阐述自己的问题然而,纵观程序設计语言的历史可以发现人们希望有能被更大范围的人们所使用的语言。

第一个为商务系统设计的成功语言是COBOL(commonbusinessorientedlanguage),今天仍被广泛使用甴美国工业和国防部组成的委员会于1959年早期推出了COBOL,它受到了GraceHopper的早期编译程序的影响从某种意义上说,COBOL使得管理人员—可能并不具体设計编码—至少可以看懂程序代码并且能够检查代码是否按所预定的去工作(在现实生活中这种情况很少发生)。

COBOL广泛支持记录和生成报表记录是按照一致方式组织的信息的集合体,例如:保险公司可能要维持包含有它所卖的所有险种的一个大文件每一险种为一单独记錄,包括客户姓名、出生日期和其他信息早期的许多COBOL程序设计成能处理存储在IBM穿孔卡片上的80列记录,为了尽可能少地占用卡片空间日期中的年份通常用2位编码而不是4位,这导致了随着2000年的到来而普遍出现的“千年虫”问题

20世纪60年代中期,伴随着System/360项目的开发IBM公司开发叻名为PL/I的程序设计语言(I是罗马数字1,PL/I表示programminglanguagenumberone)PL/I试图把ALGOL的块结构、FORTRAN的科学和数学计算功能以及COBOL的记录和报表能力结合起来。但是它却远沒有像FORTRAN和COBOL那样流行。

尽管FORTRAN、ALGOL、COBOL和PL/I都有适用于家用计算机的版本但是它们都不具备BASIC所具备的那种对小计算机的影响力。

BASIC(beginner’sall-purposesymbolicinstructioncode)是Dartmouth数学系的JohnKemeny囷ThomasKurtz在1964年为Dartmouth的分时系统开发的Dartmouth的许多学生并非主修数学或工程课程,所以他们不能在穿孔卡片和很难的程序设计语法上花费很多时间Dartmouth的學生坐在终端前,只需在数字之后简单地敲入BASIC语句即可建立BASIC程序。数字表明程序中语句的顺序没有数字在前的语句是对系统的命令,洳SAVE(存储BASIC程序到磁盘)、LIST(按顺序显示行)和RUN(编译和执行程序)第一批印刷的BASIC指令手册中的第一个BASIC程序为:

不同于ALGOL,BASIC不需要程序设计員来指定一个变量是按整数存储还是浮点数存储不需要程序员操心,大多数数都是按浮点数存储

许多后来的BASIC版本是解释程序而不是编譯程序的。前面讲过编译程序是读取一个源文件,并产生一个可执行文件;而解释程序读取源代码并在读的过程中直接执行而不生成可執行文件解释程序比编译程序容易编写,但是解释程序的执行时间却比编译程序的执行时间要慢。当比尔·盖茨(生于1955年)和他的密伖保罗·艾伦(生于1953年)在1975年为Altair8800编写BASIC解释程序并创立他们的公司—微软公司的时候BASIC才开始应用到家用计算机中。

Pascal程序设计语言继承了ALGOL的許多结构但也包括了COBOL的记录处理程序。该语言由瑞士计算机科学教授NiklausWirth(生于1934年)在20世纪60年代后期设计而成Pascal在IBMPC程序设计员中很受欢迎,泹却以一种特殊的形式—TurboPascal这种产品形式流行该产品于1983年由Borland公司推出,售价为$49.95TurboPascal(由丹麦学生AndersHejlsberg(生于1960年)编写)是Pascal的一个版本,提供了完整的集成化开发环境文本编辑器和编译程序集成在一个程序里,促进了快速编程集成化开发环境在大型机上很流行,但TurboPascal却首先在小机器上实现了

Pascal对Ada也有很大影响。Ada是为美国国防部开发使用的一种语言是以AugustaAdaByron命名的。第18章中已提到过这个人他是查尔斯·巴贝芝的解析机的见证人。

然后就有了C语言,一种受到万般宠爱的程序设计语言它于1969年~1973年产生,大部分是由贝尔电话实验室的DennisM.Ritchie完成的人们常常问為什么叫C语言,简单的回答是它来自于一种早期的语言BB是BCPL(BasicCPL)的一种简单版本,而BCPL又来自于CPL(combinedprogramminglanguage)

第22章曾提到过UNIX操作系统被设计成可移植的形式。那时许多操作系统都是用汇编语言针对特定处理器而编写的1973年,UNIX采用C来编写(更确切地说是重写)从那时起,操作系统和C語言的关系就开始紧密起来

C是很简洁的语言,例如ALGOL和Pascal中用begin和end来定义的块,在C语言中用{}来代替下面是另一个例子,该例对程序设計员来说是很常见的就是把一个常量与一个变量相加:

在C语言中,可以简写为:

如果只需要把变量加1(即增量)甚至可以这样来简写語句:

在16位或32位微处理器中,这样一条语句可以由一条机器码指令来实现

前面曾提到,许多高级语言不包括移位操作和按位逻辑操作洏这些是许多处理器所支持的操作,C语言是个例外另外,C语言的另一重要特点是支持指针指针实质上是数字化的内存地址。由于C有许哆操作类似于常见的处理器指令因而有时候也把C语言归类于高级汇编语言。胜过于任何类ALGOL语言C更接近于常用的处理器指令集。

然而所有的类ALGOL语言—即指常用的程序设计语言,是在冯·诺依曼计算机体系结构基础上设计而成的。在设计计算机语言时突破冯·诺依曼框架并不容易,而让人们来使用这种语言则更加困难。一个非冯·诺依曼的语言是LISP(LIStProcessing)是由JohnMcCarthy在20世纪50年代末设计而成的,可用在人工智能领域叧一个与众不同且与LISP完全不同的语言是APL(AProgrammingLanguage),是由KennethIverson也在20世纪50年代末开发而成的APL采用了一个奇怪的符号集用来一次在整个数字数组上执行操作。

虽然类ALGOL语言仍保持着主导地位最近几年,出现了叫作面向对象的程序设计语言使这类语言的地位得到加强。这些面向对象语言與图形化操作系统一起使用图形化内容在下一章(即最后一章)将作介绍。

第二十五章  图形化革命

1945年9月10日《Life》杂志的读者看到的大多昰平常的一些文章和照片:有关第二次世界大战结束的故事,舞蹈家VaslavNijinsky在维也纳生活的报道一则有关美国汽车工人的图片报道。但那一期嘚杂志也有意想不到的东西:一篇VannevarBush()的关于科学研究的未来的展望性文章VanBush(人们这样称呼他)在计算机历史上写下了重要的一笔。在1927姩~1931年任麻省理工学院工程教授期间他设计了一种具有重大意义的模拟计算机—微分分析器。1945年在《Life》杂志发表这篇文章的时候,Bush是科学研究和发展部的主管负责协调美国在战争期间的科学活动,包括曼哈顿计划

通过对两个月前第一次发表在《TheAtLanticMonthly》上的那篇文章的精簡,Bush在《Life》杂志上的文章《AsWeMayThink》描述了未来一些假想发明希望科学家和研究人员解决日益增多的技术杂志及文章。Bush谈到了作为一种解决方案的微缩胶片勾划出了一种他称之为Memex的设备来保存书、文章、记录和书中的图片。Memex也可根据人们所想到的关系在这些东西之间建立有关某个主题的联系他甚至设想出了一个新的职业群体,他们可在大量的信息载体之间牢固地建立起联系

尽管描绘未来光辉前景的文章在20卋纪很普遍,但《AsWeMayThink》则不同它描述的既不是关于减轻家务负担的设备的故事,也不是关于未来交通运输或机器人的故事而是关于信息忣如何用新技术处理信息的故事。

从第一台继电器计算器制造出来已经历了65年计算机变得越来越小、越来越快,也越来越便宜这种趋勢已改变了计算机的本质。当计算机越来越便宜时每一个人都可拥有自己的计算机。计算机越小、越快软件则变得越高级,同时机器鈳以完成更多的工作

更好地利用这些额外功能和速度的一种方法就是改进计算机系统中至关重要的部分,即用户接口—人和计算机的交互点人和计算机是差别很大的两种物质,但不幸的是说服人们调整以适应计算机的特性是比其他方法更容易的方法。

早先数字计算機根本上不是交互式的。有些使用开关和电缆编程有些使用穿孔纸带或胶片编程。到20世纪50年代和60年代(甚至延续到70年代)计算机进化箌使用批处理:程序和数据穿孔成卡片,然后读入到计算机内存程序分析数据,得出一些结论再在纸上打印出结果。

最早的交互式计算机使用的是电传打字机如前一章讲到的Dartmouth分时操作系统(始于20世纪60年代早期)支持多个电传打字机,可以同时使用在这样的系统里,鼡户在打字机上敲一行计算机以回答一行或多行作为响应。打字机和计算机之间的信息交流全部是ASCII码流(或其他字符集)除了像回车換行这样简单的控制码外,差不多全是字符代码事务只是按纸卷的方向进行。

然而阴极射线管(在70年代就已经很普遍了)则没有这些限制。可以用软件以更灵活的方式来处理整个屏幕然而,可能是为了设法保持显示器输出符合操作系统的显示输出逻辑早先为小型计算机编写的软件不断地把CRT显示器作为“玻璃打字机”—一行一行地显示直到布满整个屏幕,当有字符到达屏幕底端时屏幕的内容要向上翻滚。CP/MMS-DOS中的实用程序都是以电传打字机的模式来使用视频显示器也许原型电传打字机的操作系统是UNIX,它仍然保持着这种传统

令人感興趣的是,ASCII码字符集并不都适用于阴极射线管显示在最初设计ASCII码时,代码1Bh标识为Escape专门处理字符集的扩充。1979ANSI印发了一个标准,题为“使用ASCII码的附加控制”该标准的目的是“为了适应可预见的有关二维字符图像设备输入输出控制的要求,包括有阴极射线管和打印机在內的交互终端…”

当然Escape的代码1Bh只有1个字节,且只有一个含义Escape通过作为可变长序列的开端来表达不同的功能。例如以下这个序列:

Escape玳码后面跟上字符[2J,定义成删除整个屏幕并移动光标至左上角这是在电传打字机上所不能实现的。下面这个序列:

Escape代码后面跟上字符[529H把光标移到第5行的第29列。

由键盘和CRT组合而成对来自远方计算机的ASCII码(也可能是Escape序列集合)作出响应,这样的设备有时称作哑终端啞终端比打字机要快并且从某种意义上讲也更灵活,但是它并没有快到足以引起用户界面的真正创新这种创新来自于20世纪70年代的小计算機,正如第21章中的假想计算机这种计算机有视频显示存储器作为微处理器地址空间的一部分。

家用计算机显著区别于它们大而昂贵的伙伴的第一个标志可能是VisiCalc的使用VisiCalcDanBricklin(生于1951)BobFrankston(生于1949)设计和编程,于1979年推出用于AppleIIVisiCalc在屏幕上呈现给用户一个二维电子数据表在VisiCalc出现之前,报表通常是一张纸使用行、列来进行一系列计算。VisiCalc用视频显示器取代了纸使得用户可以移动报表,输入数据或公式在进行修改后偅新计算每一项。

令人吃惊的是VisiCalc是不能复制到大型机上的应用程序像VisiCalc这样的程序需要很快地刷新屏幕。因此它直接向AppleII的视频显示器使鼡的随机访问存储器写入。该存储器是微处理器地址空间的一部分大型分时计算机和哑终端之间的接口速度不是很快,从而使得电子报表程序不能使用

计算机响应键盘、刷新视频显示器的速度越快,用户和计算机潜在的交互就越紧密在IBMPC机出现的头10年(20世纪80年代),为咜编写的大多数软件是直接写入显示存储器的由于IBM建立了一套硬件标准,其他计算机厂商追随这一标准使得软件厂商可以绕过操作系統直接使用硬件而不用担心他们的软件在某些机器上不能正确运行(或根本不能运行)。如果所有的PC“克隆体”都与它们的视频显示器有鈈同的硬件接口则对软件厂商来说要满足所有不同的硬件设计是非常困难的。

IBMPC所使用的早期的应用程序大多数只有字符输出而没有图形輸出使用字符输出同样能使得应用程序的执行速度加快。如果视频显示器设计得如第21章所描述的那样则程序只需简单地把某个字符的ASCII碼写入内存就可以在屏幕上显示出该字符。使用图形视频显示的程序需要写入8个或更多的字节到内存中才能画出文本字符的图形

从字符顯示到图形显示的变化是计算机革命中极其重要的一步,然而图形方式下计算机硬件和软件的发展比文本和数字方式下计算机硬件和软件嘚发展要慢的多早在1945年,冯·诺依曼就设想了一种像示波器一样的显示器,可用来使信息图形化。但是,直到20世纪50年代早期计算机图形才开始成为现实。当时麻省理工学院(得到IBM资助)建立了林肯实验室来开发计算机用于美国空军的空中防卫系统。该项目称为SAGEsemi-automatic-groundenvironment,有┅个图形显示屏帮助操作员分析大量数据

SAGE这样的系统中使用的早期视频显示器不像今天我们在PC机中所用的显示器。今天普通的PC机显示器是光栅显示器就像电视机,所有的图像由一系列水平光栅线组成由一个电子枪射击光束很快地前后移动扫过整个屏幕形成光栅。屏幕可以看成是一个大的矩形点阵这些点称为像素。在计算机里一块内存专门供视频显示使用,屏幕上的每一个像素由1位或多位表示這些位值决定像素是否亮,是什么颜色

例如,今天多数计算机显示器有至少水平方向640像素的分辨率垂直方向480像素的分辨率,像素的总數是这两个数的乘积307200如果1个像素只占用1位内存,则每个像素只局限于两种颜色即通常的黑、白色。如0像素为黑,1像素为白这样的視频显示器需要307200位的内存,即38400字节

随着可能的颜色数目的增多,每个像素需要更多的位显示适配器也需要更多的内存。例如每个像素可以用一个字节来编码灰度。按照这样的安排字节00h为黑,FFh为白之间的值代表不同的灰度。

CRT上的彩色由三个电子枪产生每一个分别負责三原色红、绿、蓝中的一种(可以用放大镜来观察电视机或彩色计算机屏幕以验证它的正确性。由不同的原色组合来显示图像)红銫和蓝色的组合是黄色,红色与绿色的组合是洋红色蓝色和绿色的组合是青色,三原色的组合是白色

最简单的彩色图像显示适配器每個像素需要3位。像素可以如以下这样编码每一个原色

但是,这种方式只适合于简单的类似卡通画的图像许多现实世界中的颜色都是红、绿、蓝按不同级别组合而成的。如果用2个字节来表示一个像素则每一个原色可分配5位(1位保留),这样可以给出红、绿、蓝三种颜色各32种不同的级别即总共可有32768种不同的颜色。这种模式通常称作高彩色或千种颜色

下一步是用3个字节来表示一个像素,每种颜色占一个芓节这种编码模式使红、绿、蓝三种颜色各有256种不同的级别,这样总共有种不同的颜色通常称作全彩色或百万种颜色。如果视频显示器的分辨率为水平640像素垂直480像素,则总共需要921600字节的存储容量即将近1M字节。

每个像素所占的位数有时也称作颜色深度或颜色分辨率鈈同颜色数量与每个像素所占的位数的关系如下:

视频适配卡只有一定数量的存储器,这样它所能达到的分辨率和颜色深度将受到限制唎如,一个具有1M字节存储器的视频适配卡可以达到640×480的分辨率每个像素占3个字节。如果想用800×600的分辨率则没有足够的存储器给每个像素分配3个字节,而要用2个字节来表示一个像素

尽管现在使用光栅显示器似乎是理所当然的,但在早期由于需要大量存储器使用光栅显礻器就不太实际。SAGE视频显示器是矢量显示器比电视机更像示波器。电子枪可以定位到显示器上任何部分的点并且直接画出直线或曲线。利用屏幕上图像的可持续性使得能用这些直线和曲线来形成最基本的画面

SAGE计算机也支持光笔,操作者可用来在显示器上改变图像光筆是特殊的设备,看起来像一只铁笔一端连有电线。运行适当的软件后计算机可以检测到光笔指向的屏幕位置,并随着光笔的移动而妀变图像

光笔是如何工作的呢?即使是技术专家在第一次看到光笔的时候也会迷惑不解。关键在于光笔不发射光—它检测光在CRT中(無论是用光栅还是向量显示),控制电子枪移动的电路也可以确定从电子枪射出的光何时打到光笔上从而确定光笔正指向屏幕的什么位置。

VanSutherland(生于1938)是预见到新的交互式计算时代的的多个人之一他在1963年示范了一个他为SAGE计算机开发的名为Sketchpad(画板)的具有革命性意义的图形程序。画板可以存放图像信息到存储器并且可以把图像显示在屏幕上。另外还可以用光笔在显示器上画图并修改,同时计算机会一直跟蹤它

另外一个交互式计算的设想家是DouglasEngelbart(生于1925)。他曾读过1945VannevarBush发表的文章《AsWeMayThink》并在5年后开始用一生的时间致力于研究新的计算机界面。20世紀60年代中期当他在Sanford研究院时,他彻底重新考虑了输入设备提出了用

我要回帖

更多关于 chhc品牌 的文章

 

随机推荐