第 1 章 计算机的三大原则

第 1 章 计算机的三大原则

热身问答

在阅读本章内容前,让我们先回答下面的几个问题来热热身吧。

问题

初级问题

硬件和软件的区别是什么?

中级问题

存储字符串“中国”需要几个字节?

高级问题

什么是编码(Code)?

怎么样?被这么一问,是不是发现有一些问题无法简单地解释清楚呢?下面,笔者就公布答案并解释。

答案

初级问题:硬件是看得见摸得着的设备,比如计算机主机、显示器、键盘等。而软件是计算机所执行的程序,即指令和数据。软件本身是看不见的。

中级问题:在 GBK 字符编码下,存储“中国”需要 4 个字节。

高级问题:通常将为了便于计算机处理而经过数字化处理的信息称作编码。

解释

初级问题:硬件(Hardware)代表“硬的东西”,而软件(Software)代表“软的东西”。是硬的还是软的取决于眼睛能否看得到,或者实际上能否用手摸到。

中级问题:存储汉字时,字符编码不同,汉字所占用的字节数也就不同。在 GBK 字符编码下,一个汉字占用 2 个字节。而在 UTF-8 字符编码下,一个汉字占用 3 个字节。

高级问题:计算机内部会把所有的信息都当成数字来处理,尽管有些信息本来不是数字。用于表示字符的数字是“字符编码”,用于表示颜色的数字是“颜色编码”。

本章重点

现在的计算机看起来好像是种高度复杂的机器,可是其基本的构造却简单得令人惊讶。从大约 50 年前的第一代计算机到现在,计算机并没有发生什么改变。在认识计算机时,需要把握的最基础的要点只有三个,我们就将这三个要点称为“计算机的三大原则”吧。无论是多么高深、多么难懂的最新技术,都可以对照着这三大原则来解释说明。

只要了解了计算机的三大原则,就会感到眼前豁然开朗了,计算机也比以往更加贴近自己了,就连新技术接连不断诞生的原因也明白了。本书以本章介绍的计算机的三大原则为基础,内容延伸至硬件和软件、编程、数据库、网络以及计算机系统。在阅读之后的章节时,也请诸位时常将计算机的三大原则放在心上。

1.1 计算机的三个根本性基础

下面就赶紧开始介绍计算机的三大原则吧。

1. 计算机是执行输入、运算、输出的机器

2. 程序是指令和数据的集合

3. 计算机的处理方式有时与人们的思维习惯不同

计算机是由硬件和软件组成的。诸位可以把硬件和软件的区别理解成游戏机(硬件)和收录在 CD-ROM 中的游戏(软件)的区别。这样就能理解硬件和软件各自的基础了(三大原则中的第一点和第二点)。

在此之上,计算机有计算机的处理方式也是一条重要的原则。而且请诸位注意,计算机的处理方式往往不符合人们的思维习惯(三大原则中的第三点)。

计算机三大原则中的每一条,都是从事计算机行业 20 余年的笔者深切领悟出来的。诸位可以把这本书拿给你周围了解计算机的朋友看,他们应该会对你说“确实是这样的啊”“当然是这样的了”这类话。过去的计算机发烧友们在不知不觉中就能逐渐领悟出计算机的三大原则。而对于那些打算从今日开始深入接触计算机的普通人来说,三大原则中的有些地方也许一时半会儿难以理解,但是不要担心,因为下面的解释会力求让诸位都能理解三大原则的具体含义。

1.2 输入、运算、输出是硬件的基础

首先从硬件的基础开始介绍。从硬件上来看,可以说计算机是执行输入、运算、输出三种操作的机器。计算机的硬件由大量的 IC(Integrated Circuit,集成电路)组成(如图 1.1 所示)。每块 IC 上都带有许多引脚。这些引脚有的用于输入,有的用于输出。IC 会在其内部对外部输入的信息进行运算,并把运算结果输出到外部。运算这个词听起来也许有些难以理解,但实际上就是计算的意思。计算机所做的事就是“输入”数据 1 和 2,然后对它们执行加法“运算”,最后“输出”计算结果 3。

图 1.1 IC 的引脚中有些用于输入,有些用于输出

小型的 IC 自不必说,就连在观察银行的在线系统这类巨型系统时,或是编写复杂的程序时,也要时常把输入、运算、输出这三者想成是一套流程,这一点很重要。其实计算机就是台简单的机器,因为它只能做这三件事。

“你说得不对,计算机能做的事远比这些多得多。”也许会有人这样反驳笔者。的确,计算机可以做各种各样的事,比如玩游戏、处理文字、核算报表、绘图、收发电子邮件、浏览网页,等等。但是无论是多么复杂的功能,都是通过组合一个又一个由输入、运算、输出构成的流程单位来实现的,这是毋庸置疑的事实。如果打算用计算机做点什么的话,就要考虑该如何进行输入、如何获取输出以及进行怎样的运算才能从输入得到输出。

输入、运算、输出三者必须成套出现,缺一不可。这样说的原因有几点。首先,现在的计算机还没有发展到能通过自发的思考创造出信息的地步。因此不输入信息,计算机就不能工作。所以,输入是必不可少的。其次,计算机不可能不执行任何运算。如果只是使输入的信息绕过运算环节直接输出,那么这就是电线而不是计算机了。可以说不进行运算,计算机也就没有什么存在的意义。最后,输入的信息如果经过了运算,那么运算结果就必然要输出。如果不输出结果,那么这也不是计算机而只是堆积信息的垃圾箱了。因此,输出也必不可少。

{%}

图 1.2 计算机只会输入、运算、输出

1.3 软件是指令和数据的集合

下面介绍软件,即程序的基础。所谓程序,其实非常简单,只不过是指令和数据的集合。无论程序多么高深、多么复杂,其内容也都是指令和数据。所谓指令,就是控制计算机进行输入、运算、输出的命令。把向计算机发出的指令一条条列出来,就得到了程序。这里成套出现的输入、运算、输出,就是之前在硬件的基础一节中说明过的流程。向计算机发出的指令与计算机硬件上的行为一一对应是理所当然的。

在程序设计中,会为一组指令赋予一个名字,可以称之为“函数”“语句”“方法”“子例程”“子程序”等。这里稍微说些题外话,在计算机行业,明明是同一个东西,却可以用各种各样的术语来指代它,这种现象请诸位注意。如果只想用一个名字的话,一般情况下笔者推荐称之为函数,因为这个名字通俗易懂。

程序中的数据分为两类,一类是作为指令执行对象的输入数据,一类是从指令的执行结果得到的输出数据。在编程时程序员会为数据赋予名字,称其为“变量”。看到变量和函数,诸位也许会联想到数学吧。正如数学中函数的表记方法那样,在很多编程语言中都使用着类似于下面的这种语法。

y = f(x)

这句话表示若把变量 x 输入到函数 f 中,经过函数内部的某种运算后,其结果就会输出到变量 y 中。因为计算机是先把所有的信息都表示成数字后才对其进行运算的,所以编程语言的语法类似数学算式也就不足为奇了。但是在程序中有一点与数学不同的是,变量和函数的名字都可以由一个以上的字符构成,比如下面这种情况。

output = operate(input)

也就是说,使用由多个字符构成的长名字也是可以的。甚至可以说,写成这样的情况更加普遍。

下面我们就举一个例子作为证据来证明程序是指令和数据的集合。请诸位看代码清单 1.1。这里列出了一段用名为 C 语言的编程语言编写的程序。C 语言中要在每条指令的末尾写一个分号“;”。第一行的“int a, b, c;”表示接下来要使用名为 a、b、c 的整数变量,其中 int 是 integer(整数)的缩写,用于告诉计算机“要用的是整数”。下一行的“a = 10”表示把整数 10 赋值给变量 a。同样地,“b = 20;”表示把整数 20 赋值给变量 b。等号“=”是赋值给变量的指令。再来看最后一行的“c = Average(a, b);”,这一行表示把变量 a 和 b 传给函数的参数,并将运算结果赋值给变量 c。其中使用了一个名为 Average 的神秘函数,它的作用是返回两个参数的平均值。通过上面这个例子,诸位就应该能明白程序确实只是由指令和数据构成的了吧。

代码清单 1.1 C 语言的程序示例片段

int a, b ,c;
a = 10;
b = 20;
c = Average(a, b);

虽然程序就是这样,但是那些稍微有些编程经验的人也许会说:代码清单 1.1 所示的程序逻辑简单,而真正的程序是使用了各种各样的语法、比这复杂得多得多的东西,绝不是用指令和数据的集合就能解释清楚的。其实并不是像他们想的那样,无论是多么复杂的程序,都只不过是指令和数据的集合。下面我们再拿出一个证据。

在一般的编程过程中,都要先编译再执行。所谓编译就是把用 C 语言等编程语言编写的文件(源文件)转换成用机器语言(原生代码)编写的文件。假设我们先把代码清单 1.1 中的代码保存到文件 MyProg.c 中,然后经过编译就可以生成可执行的程序文件 MyProg.exe 了。接下来使用能查看文件内容的工具查看 MyProg.exe,其内容应该与代码清单 1.2 类似。可以看到里面仅仅是数值的罗列(这里用十六进制数表示)。

代码清单 1.2 机器语言的程序示例

C7 45 FC 01 00 00 00 C7 45 F8 02 00 00 00 8B 45
F8 50 8B 4D FC 51 E8 82 FF FF FF 83 C4 08 89 45
F4 8B 55 F4 52 68 1C 30 42 00 E8 B9 03 00 00 83

请选择一个代码清单 1.2 中的数值,随便哪个都可以。这个数值代表什么呢?是表示赋值或加法等指令的种类呢,还是表示将成为指令执行对象的数据呢?也有这样的可能(不过这终归是想象),第一个数值 C7 表示指令,第二个数值 45 表示数据。在诸位所使用的 Windows 个人计算机中,应该会有若干个以 .exe 为扩展名的可执行程序文件。无论是哪个程序,其内容都是数值的罗列,每个数值要么是指令,要么是数据。

1.4 对计算机来说什么都是数字

计算机有计算机的处理方法,这是三大原则中的最后一点。计算机本身只不过是为我们处理特定工作的机器。如果计算机能自己干活的话,那么笔者一定会买几百台,让它们先替自己完成一整年的工作。但是,并没有这种会挣钱的计算机,计算机终究只是受人支配的工具。

迄今为止,使用计算机的目的就是为了提高手工作业的效率。例如,文字处理软件可以提高编写文档的效率;电子邮件可以提高传统邮件寄送的效率。总之,作为可以提高工作效率的工具,有些靠手工作业完成的业务可以直接交给计算机处理。但是也有很多手工作业无法直接由计算机处理。也就是说,在用计算机替代手工作业的过程中,要想顺应计算机的处理方法,有时就要违背人们的思维习惯。请诸位特别留心这一点。

用数字表示所有信息,这就是一个很具有代表性的计算机式的处理方法,这一点也正是和人类的思维习惯最不一样的地方。例如,人们会用“蓝色”“红色”之类的词语描述有关颜色的信息。可是换作计算机的话,就不得不用数字表示颜色信息。例如,用“0,0,255”表示蓝色,用“255,0,0”表示红色,用“255,0,255”表示由蓝色和红色混合而成的紫色。不光是颜色,计算机对文字的处理也是如此。计算机内部会先把文字转换成相应的数字再做处理,这样的数字叫作“字符编码”。总之计算机会把什么都用数字来表示。

熟悉计算机的人经常会说出一些令人费解的话,例如“在这里打开文件,获得文件句柄”“把用公钥加密后的文件用私钥解密”。那么,他们所说的“文件句柄”是什么呢? —— 是数字。“公钥”是什么呢?——是数字。“私钥”呢?——当然还是数字。无论计算机所处理的信息是什么形式,只要把它们都当成是数字就可以了。虽然这有些违背人们的思维习惯,但是处理数字对计算机来说却是非常简单的。

下面笔者就讲一件自己年轻时的糗事吧。事情发生在一次与老程序员探讨问题时,我问他:“用某某程序处理的某某数据,在计算机内部也是用数字表示的吧?”老程序员听后,吃惊得张开了嘴,回了一句:“这不是明摆着吗 !”

1.5 只要理解了三大原则,即使遇到难懂的最新技术,也能轻松应对

有关计算机三大原则的说明到此结束。只要理解了这三大原则,即使遇到难懂的最新技术,也能轻松应对。下面就给诸位看一个具体的例子。这里摘录了一段有关 .NET 技术的介绍,.NET 是微软公司率先提出的一种新技术。如果要正式地介绍 .NET 技术,就会像下面这样进行说明。

【有关 .NET 的说明之一】

微软公司率先提出了作为新一代互联网平台的 .NET 技术。作为 .NET 核心的 XML Web 服务使用通用技术 SOAP、XML,促使企业间的计算机协同工作。

真是不好理解的一段话啊。可是如果把 .NET 的核心技术对照着计算机三大原则再介绍一遍的话,就会像下面这样进行说明。

【有关 .NET 的说明之二】

计算机是执行程序的机器。程序是指令和数据的集合。为了使互联网上相互连接的计算机能通过程序协同工作,微软公司采用了 SOAP 以及 XML 规范。SOAP 是关于调用指令的规范,XML 则是定义数据格式的规范。

只要定义出了指令和数据的规范,装有符合规范的程序的计算机自然就可以相互协作了。所谓计算机的协同工作指的是,输入到一台计算机中的数据,可以通过互联网传送到与这台计算机相连的其他计算机上执行运算,运算所输出的结果再返回给这台计算机。像这样部署在其他计算机上能执行某种运算的程序就叫作 XML Web 服务。

这回怎么样?应该变得容易理解了吧?如果又想到了其他的问题,比如“为什么不得不遵循 SOAP 和 XML 的规范呢?”或者“实际看了看 SOAP 和 XML 的规范,才发现也很复杂。”那么就可以把答案归结为“因为那些都是适合计算机的处理方式”。

1.6 为了贴近人类,计算机在不断地进化

围绕着计算机的技术正在以狂奔般的速度不断进化,与其说是日新月异,倒不如说是“秒新分异”。虽然也许有人会觉得眼前的已经够用了,希望能停留在现有的技术水平上。但是计算机的进化是不会停止的,因为计算机还远远没有到达完善的地步。

计算机进化的目的只有一个——与人类更加相近。要想贴近人类,就必须从计算机的处理方式中摒弃不符合人们思维习惯的部分。请对照着计算机三大原则之一的“计算机有自己的处理方式”来记忆这个结论。

举例来说,键盘这种不好用的输入设备进化成了好用的鼠标。平面的 2D(二维)游戏进化成了立体的 3D(三维)游戏。无论是哪一种进化,都是为了使计算机的处理方式更加贴近人类。

这样发展下去的话,也许计算机进化的最终形态就是机器人了,有着与人类一样的外表,可以使用人类的语言。例如在 1985 年茨城县筑波市举办的筑波世博会上,就展示出了一台用 CCD 照相机识别乐谱,弹奏钢琴的机器人。也许有人会觉得:“数码音乐什么的用个人计算机不是也能完成吗?”但是这个发明的意义在于机器人能和人类做相同的事了。就在不久前,本田公司开发出的两足步行机器人也成为了热议的话题。也许又有人会觉得:“为什么非要特地用两只脚行走呢,装上轮子能动起来不也一样吗?”但是这个发明的意义还是在于机器人能和人类做相同的事了。有乐谱和钢琴就能演奏,人能走的道路或台阶它也能走,这样的机器人无疑才能更加方便地应用于人类社会。

若与十几年前相比,诸位身边的个人计算机也在逐渐贴近人类。20 世纪 80 年代中期盛行的个人计算机操作系统是 MS-DOS,其操作方法是靠在全黑的画面上敲入字符,把命令传给计算机。进入 90 年代后,MS-DOS 进化成了 Windows,用户可以在图形界面上通过鼠标的操作直观地下达命令(如图 1.3 所示)。开发出 Windows 的美国微软公司,正将目标锁定在用户体验(User Experience)上,旨在开发出超过现有 Windows、更加贴近人类的用户界面(计算机的操作方法)。Windows XP 和 Office XP 末尾的 XP,代表的就是 Experience(体验)。Windows 若能这样不断进化下去,早晚会有一天,面向个人计算机的语音输入和手写输入等技术将变得极为普及。

{%}

图 1.3 为了贴近人类,个人计算机操作系统也在进化

诸位读者当中应该也有对编程感兴趣的人吧。编程方法也在进化,进化的成果是诞生了两种编程方法,面向组件编程(Component Based Programming)和面向对象编程(Object Oriented Programming)。这两者的进化目标一致,都是使程序员可以在编程中继续沿用人类创造事物时的方法。面向组件编程的方法是通过将组件(程序的零件)组装到一起完成程序;面向对象编程的方法是先如实地对现实世界的业务建模,之后再把模型搬到程序中。使用符合人类思维习惯的编程方法,可以实现高效率的开发。

但是,偏偏有这类程序员,他们对面向组件编程敬而远之,明明有各种各样现成的组件可供使用,却什么功能都要自己亲手做,仿佛不这样编程就不舒心。还有的程序员误认为面向对象编程难以理解。像这样的程序员人数还不少,特别是在昔日的计算机发烧友当中。总之就是因为他们太习惯于配合计算机的处理方式了,反倒认为计算机贴近人类这一发展趋势是在添乱。

笔者则认为,无论是刚入行的技术人员,还是有资历的老工程师,都应该由衷地欢迎技术的进化,坦率地接受新技术。如果是用祖传技艺制作出来的传统手工艺品的话,也许还有价值,但是没有人会稀罕靠一成不变的方法编写出的程序。

1.7 稍微预习一下第 2 章

作为第 2 章的预习,在本章的最后先来简单地介绍一下计算机(特别是个人计算机)硬件的组成要素。这里讲得不会很难,请先看一下图 1.4,体会一下图中的要点。如图所示,计算机内部主要由被称作 IC 的元件组成。虽然在 IC 家族当中有功能各异的各种 IC,但是在这里希望诸位记住的只有三种:CPU(处理器)、内存以及 I/O。

{%}

图 1.4 计算机硬件的组成要素

CPU 是计算机的大脑,在其内部可对数据执行运算并控制内存和 I/O。内存用于存储指令和数据。I/O 负责把键盘、鼠标、显示器等周边设备和主机连接在一起,实现数据的输入与输出。

在诸位所使用的 Windows 个人计算机中,多数都只装有一枚名为 Pentium(奔腾)的 CPU 吧。内存的数量则会根据所需存储的大小(少则 32MB,多则 256MB)装有多条。I/O 也会根据周边设备的多少装配有多个。可以认为个人计算机背板上有多少个插孔就有多少个 I/O。

只要用电路把 CPU、内存以及 I/O 上的引脚相互连接起来,为每块 IC 提供电源,再为 CPU 提供时钟信号,硬件上的计算机就组装起来了,还是非常简单的吧。所谓时钟信号,就是由内含晶振1的、被称作时钟发生器的元件发出的滴答滴答的电信号。如果是 Pentium CPU 的话,所使用的时钟信号会从几百 MHz 到 2GHz 不等。

1一种利用石英晶体(又称水晶)的压电效应产生高精度振荡频率的电子元件。——译者注

☆   ☆   ☆

诸位辛苦了,至此第 1 章就结束了。想必诸位都已经理解了计算机的三大原则以及计算机为什么要进化了吧。因为这些知识真的非常重要,所以如果第一遍没有读懂,就请再反复多读几遍。也可以叫上公司的同事、学校的同学一起讨论本章的内容。如果能让有资历的老工程师也加入讨论,那么效果会更加显著。

在接下来的第 2 章中,我们将尝试着动手“制造”一台计算机。说是制造,也只不过是在纸上进行的“模拟体验”,而且笔者会带着诸位做,所以请不要担心。敬请期待!

目录

  • 版权声明
  • 前言
  • 关键词
  • 本书结构
  • 第 1 章 计算机的三大原则
  • 第 2 章 试着制造一台计算机吧
  • 第 3 章 体验一次手工汇编
  • 第 4 章 程序像河水一样流动着
  • 第 5 章 与算法成为好朋友的七个要点
  • 第 6 章 与数据结构成为好朋友的七个要点
  • 第 7 章 成为会使用面向对象编程的程序员吧
  • 第 8 章 一用就会的数据库
  • 第 9 章 通过七个简单的实验理解 TCP/IP 网络
  • 第 10 章 试着加密数据吧
  • 第 11 章 XML 究竟是什么
  • 第 12 章 SE 负责监管计算机系统的构建
  • 结束语
  • 谢辞