计算机系统简述

目标

计算机世界并非如此神秘。相反,计算机是非常“确定”的一个系统,即在任何时候,在相同的方法、相同的状态下(当然还包括相同的起始条件),同样的问题必然获得相同的结果。其实,计算机并不是什么电子天才,相反,它只是一个电子傻瓜,只会精确地按照我们的要求去执行任务,它本身是没有什么心智的。事实上,计算机这样一个复杂的机体,是由一堆简单的部件,经过精心的组合而成。

本专栏强调的是理解,而不是死记硬背;强调的是软件与硬件结合,而不是软件与硬件的分别教授与学习。本着将软件硬件教学齐头并进的思路,从硬件的基本构件一直讲到软件的高级程序设计与构造,这样能够在学习过程中将软硬件融会贯通、相互印证,从而提高学习的广度、深度和效果,并为后续的计算机专业课如操作系统、计算机系统设计与结构、算法设计与分析、高可靠软件工程理论等打下基础。

最大的特点是提倡层次转换概念,即从问题开始到计算机运算出结果可分为七个层次。通过七个层次的转换,即可完成从问题到结果的转变。这七个层次及其转换是:问题到算法的转换、算法到程序设计语言的转换、程序到指令集结构(ISA)的转换、指令集结构到微观结构的转换、微观结构到电路的转换和电路到电路组件的转换。

经验与体会

为未来做准备:深入底层:系统运行的性能不仅仅取决于编写程序的水平,如果缺乏对系统底层知识的了解,则在面对一些性能问题时会一筹莫展。作为高级程序员,要编写高效率代码,仅仅掌握高级语言本身是不够的。除此之外,我们还需要了解与设备相关的知识(甚至是引脚的定义)。在高级语言编程课中,编译器这个“保护层”将计算机底层的“丑陋细节”都隐藏了。

两个反复出现的理念

一是“抽象”,二是“在脑子里不要对硬件和软件做任何区分”。

学会“抽象”能让我们站在更高的层次看问题,从而将事物的本质表现出来,而将其中的细节隐藏起来;能让我们更有效地利用时间和大脑;能让我们在分析问题时不至于陷入泥潭。此外,我们不仅要具备抽象的能力,还要具备“分解抽象”的能力,这样才能保证问题的顺利解决。这个过程有可以称为“解析”,即从抽象回到具体的过程。抽象技能相当重要,抽象的层次越高越好,它与工作效率成正比。 

硬件和软件只是计算机系统中两个组成部分的名称而已;对设计者来说,具体将计算机的某个功能划分给哪部分来实现,以及他们之间如何协同工作,原则只有一个:让计算机工作的最棒。

计算机系统简述

计算机,它是指这样一种机制,即同时在做着两方面的事情:即控制着信息的处理过程,同时也是信息处理过程的具体执行者。所谓“控制信息的处理过程”,指的是它必须决策下一个执行任务是什么,而“处理过程”的执行者,意味着他必须具备“加”、“减”、“乘”等运算能力以产生执行结果。该机制更准确的称谓是“中央处理器(Central Processing Unit,CPU)”。

而大多数人更熟悉“计算机”这个词,它包含了比处理器更多的意思。一个计算机系统由更多的部件组成,除了处理器之外,还包含键盘(用来输入命令)、鼠标(用来点击菜单)、显示器(用来显示计算机系统产生的信息)、打印机(用来打印信息的拷贝)、内存(用来临时存储信息)、磁盘和CD-ROM(用来永久存储信息及很多可以执行的程序或软件)。这些附件的部件更方便了计算机最终用户的使用。

两个非常重要的思想

第一:所有的计算机(不管是最大的还是最小的、最快的还是最慢的、最昂贵的还是最廉价的),只要给予足够的时间和内存,它们所能完成的计算任务是相同的。换句话说,最快的计算机能够完成的事情,最慢的计算机也能完成,只是更慢一些而已;而一个便宜的计算机所不能完成的事情(如果有足够内存的话),对于一个更昂贵的计算机来说,同样也是无法完成的。总之,所有的计算机能够完成相同的事情。只是有些计算机可能做的更快些,但绝不会做的更多。

第二,我们用英语或其他语言给出了一个问题,然而计算机却能通过电子运转(运行程序)来解决这个问题,太奇妙了!至于怎样把用人类语言描述的问题转换成能够影响电子运转的电压,需要一系列的、系统的转换过程。

计算机:通用计算设备

计算机是特别的,要学习计算机的基本原理,必须先了解计算机是怎样工作的?答案在于计算机被称为“通用计算设备(universal computational device)”。

在现代计算机出现之前,曾经出现了很多能计算的机器,其中,有些是模拟机—即机器产生的结果是用可测量的模拟量来表示的(如电压、距离等)。例如:滑动计算尺。模拟机器的缺陷主要是难以提高其精度。于是,数字机出现了,数字机(digital machine)通过一组固定的、有限的数字和字符来完成操作。如:数字手表。但计算机就不一样了。你需要告诉计算机的是“方法”和“任务”,如怎样做加法、怎样做乘法等。而假如你有新的计算任务要实现,就不需要购买或设计新机器了,所要做的唯一事情,就是在原来的计算机上增加一些新的指令或程序即可,这就是为什么我们称计算机为“通用计算设备”的原因。

通用计算的思想产生要归功于Alan Turing(阿兰·图灵)。1937年,他提出了一个大胆的设想:任何计算都可以由这样一台机器来完成,这个机器就是图灵机。他为这类机器给出了一个清晰的数学描述,但没有为之建造一台真正的机器。世界上真正可运行的数字计算机是在1946年才出现的(ENIAC—美国宾夕法尼亚大学)。在计算机领域上,有一个最高奖—图灵奖,相当于“诺贝尔奖”。

bb2b64ec78cf4ab3950f66e3a7aec80a.png

图灵机的“黑箱模型”

图灵提出:任何计算都可以通过某种图灵机来完成,我们称这个论题为“图灵论题”。虽然图灵论题从来没有被严格证明过,但众多的证据都表明它是正确的。

从问题描述到电子运转

转换层次

问题的提出

描述问题时候,我们通常采用“自然语言”,即人们所说的语言,如汉语、英语、德语等。这些语言都经历了几百年的发展,其中包含了太多不适合作为计算机语言的东西,其中二义性(自然语言中广泛存在的歧义现象)最突出。如“兵乓球拍卖完了”可切分为“乒乓球/拍卖/完了”又可以切分为“乒乓球拍/卖/完了”。不同的声音和音量,以及不同的上下文句子内容,都会使得同一段话表现出不同的语义。二义性对计算机来说是不能接受的。计算机是一个电子傻瓜,它只能做你让他做的事情,但如果你给它的命令存在有多种意思(即二义性),就会茫然不知所措。

算法

从问题的提出开始,向下转换的第一步是将问题的自然语言描述转换为算法描述,去掉那些无用的特性。算法描述的特点是流程化、步骤清晰,并确保该流程能终止。其中每个步骤的定义描述都足够精确、以保证能在计算机上执行。一个算法是一个有穷规则的集合,其规则确定一个解决某一特定类型问题的操作序列。这些特性可阐述如下:

  • 确定性:表明每个操作步骤的描述是清晰的、可定义的。
  • 可计算性:表示每一步的描述都可被计算机执行。而“取最大的素数”这样一句描述,我们称其不具备可计算性的,因为根本就不存在最大的素数。
  • 有限性:过程是会终止的;对于任意一组合法的输入值,算法在执行有穷步骤后一定能结束。
  • 有输入:算法有零个或多个输入数据。输入数据是算法的加工对象,既可以由算法指定,也可以在算法执行过程中通过输入得到。
  • 有输出:算法有一个或多个输出数据。输出数据是一组与输入有确定关系的最值,是算法进行信息加工后得到的结果。

任何一个问题都具有多种求解算法。其中,有的算法步骤最少,有的算法允许个别步骤反复执行,等等。值得注意的是,如果一个算法描述出来的步骤很多,但如果这些步骤在一个时刻可以同时被计算机执行(并行),无疑该算法的执行速度是最快的。

算法设计的目标

  • 正确性:算法应确切地满足应用问题的需求,这是算法设计的基本目标。
  • 健壮性:即使输入数据不合适,算法也能做出适当处理,不会导致不可控的结果。
  • 高时间效率:算法的执行时间越短,时间效率越高。
  • 高空间效率:算法执行时占用的存储空间越少,空间效率越高。
  • 可读性:算法表达清晰,简洁明了,易于理解。

如果一个操作有多种算法,显然应该选择执行时间短和存储空间占用少的算法。但是,执行时间短和存储空间占用少有时是矛盾的,往往不可兼得,此时需要综合考虑算法的执行时间和空间利用率。

程序

下一步就是将算法转换为程序,即用编程语言描述。编程语言属于“机械语言”,与自然语言不同的是,机械语言不是设计出来为人所讲的,相反,它被设计成严格的顺序方式,以便让计算机顺序地执行指令序列。换句话说,他不存在二义性问题。如:C语言是专门为底层硬件操作而设计的语言。

计算机语言可以分为“高级语言”和“低级语言”两类。高级语言和底层计算机的相关性很弱(距离很远),或称之为“机器无关”语言。低级语言则和执行程序的计算机紧密相关,通常一种低级语言只对应一种计算机,我们称之为“某某机器的汇编语言”。

指令集程序

下一步的任务是将程序转换为特定计算机的指令集(insuruction set)。指令集结构是程序和计算机硬件之间接口的一个完整定义。

ISA 定义包括:计算机可以执行的指令集合,即计算机所能执行的操作,以及每个操作所需数据是什么,即操作数(operand);ISA 还定义了可接受的操作数表达方式,即数据类型;ISA 还定义了获取操作数的机制,即定位各种操作数的不同方法,我们称之为“寻址模式(addressing mode)”。不同的 ISA 定义的操作类型,数据类型和寻址模式的数目都是不同的。如x86(PC机中的 ISA),有100多种操作类型、十几种数据类型、二十多种寻址模式。ISA 的设计中,还要折衷考虑计算机内存的大小及每个存储单元的密度(即能容纳0和1的数目)。

将高级语言(如C、Java等)翻译为 ISA 指令(如x86)的过程,通常是由一个被称为“编译器(compiler)”的程序来完成的。就是说,针对不同的高级语言和目标计算机组合,需要一个对应的编译器。将计算机的汇编语言翻译为其 ISA 的过程,则是由汇编器(assembly)来完成的。

微结构

下一步的任务是将 ISA 转换成对应的实现。实现的具体组织被称为“微结构”。

汽车制造业为 ISA 和微结构(即 ISA 的实现)的关系提供了一个很好的比喻:ISA 描述的是驾车人在车里看到的一切,几乎所有的汽车都提供了相似的接口(但汽车的 ISA 接口和轮船、飞机的 ISA 车别很大),所有的汽车中,三个踏板的定义完全相同,即中间的是刹车、右边的是油门、左边的是离合器。ISA 表达的是基本功能,其定义包括:所有的汽车都能从 A 点移动到 B 点,可前进也可后退,还可左右转向等。而 ISA 的实现是指车盖板下的“内容”。所有的汽车制造模型都不尽相同,这取决于设计者在制造之前所做的权衡决策,如有的制动系统采用刹车片,有的采用制动鼓。我们称这些差异性的细节为一个特定汽车的“微结构”,它们反映了设计者在成本和性能之间所做的权衡决策。

逻辑电路

微结构最终是由一组简单的逻辑电路实现的,有多种实现方法可供选择,各种方法之间存在着性能和成本上的差异。例如:仅仅一个“加法器”,就存在着多种实现,它们所表现出来的运算速度(性能)和成本之间差异巨大。

器件

每个基本的逻辑电路,都是按照特定的器件速度(device technology)来实现的。


编译器 是个广义的说法。事实上,为完成编译工作,需要很多工具,如:预处理器(pre-processor)、编译器(complier)、汇编器(assembler)、链接器(linker)以及一些必须的现成的工具(bin-utility)如文档处理(archiver)等。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邂逅自己

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值