摘要:本文比较系统的总结了计算机技术中的十个重要关系,对这些技术要素及其之间的关系进行了深入的剖析,并通过大量的典型实例进行了说明。理解了这些关系,可以在一定程度上提高读者对计算机技术的总体把握能力。
1 引 言
计算机技术领域的专业术语繁多,很多技术要素之间往往存在一定的逻辑联系。有些技术关系的内涵还是比较丰富的。因此,对计算机技术中比较典型的技术关系进行总结和分析是必要的。以下对计算机技术的十个重要关系进行了阐述。
2 对计算机技术中的十个重要关系的分析
2.1 硬件与软件
硬件是整个计算机系统发挥其功能的物质基础。在计算机上执行的任何功能和操作都要最终转化为硬件系统相关部件的一系列“动作”,确切的讲是一系列随时间变化的电信号的组合。软件是根据所要完成的特定任务对硬件的功能单位(即机器指令)的逻辑组织,或者说是指令的集合,它是计算机系统的灵魂。计算机要完成的不同任务正是通过不同的软件体现出来的。虽然软件与硬件一个是无形的逻辑实体,一个是有形的物理实体,但它们在逻辑功能上是等价的。凡是由硬件实现的功能,用软件的方法同样可以实现,反之亦然。对同一种功能,选择用硬件实现还是软件实现,取决于对成本,执行效率,灵活性等方面的综合考虑。事实上,在计算机技术发展的历史过程中,硬件与软件之间的界限不是固定不变的,而是动态变化的。例如,在计算机技术发展的早期,由于受硬件制造工艺的限制,CPU的指令系统中没有乘法指令,即硬件不能直接进行乘法运算。要使计算机完成乘法功能,必须通过若干加法指令的组合来实现。用指令的组合实现,也就是通过编程实现,或者说是用软件的方法实现。后来随着计算机硬件技术的发展,同时出于对执行效率的考虑,CPU的指令系统中增加了乘法指令,这样乘法算功能就可由硬件直接完成。软硬件的逻辑等价性原理是计算机系统设计的重要依据,软硬件的功能分配及其界面的确定是计算机系统结构研究的重要内容。
软件与硬件发展的不平衡性对计算机技术整体发展的制约是应该注意的。考察计算机技术发展的历史过程可以看出,硬件技术的发展是活跃和迅速的,是推动整个计算机技术发展的引擎。
而软件的发展由于自身的特点而显得相对滞后。也就是说软件往往不能充分利用和发挥计算机硬件所提供的潜力(如软件没有充分利用计算机的字长和指令系统)。因此,在保证软件质量的情况下如何提高软件的开发效率是当今计算机科学研究的一个重要领域。
2.2 操作系统与应用软件
有人将操作系统视为计算机系统的核心,可见它在整个系统中的地位和作用的重要性。对操作系统的研究有两种观点,一种是系统管理的观点,即操作系统是软硬件系统资源的管理者;另一种是用户界面的观点,即操作系统为上层应用软件提供了访问系统服务的接口(这种接口被称为系统调用或API)。上述两种观点实际上反映了操作系统所具备的两大功能。操作系统对应用软件提供访问底层硬件和处理其它与系统密切相关功能的接口,一方面是为了减轻编程人员工作的复杂性,另一方面也是对系统资源进行统一管理的必然要求(在多任务环境中尤其如此)。几乎所有实用的应用软件,在运行过程中都需要通过系统调用请求操作系统提供服务。在一般情况下,一个应用程序不能不经过修改而从一个操作系统平台移植到另一个不同的操作系统平台上,这主要是因为不同操作系统的系统调用存在着差别。
2.3 逻辑设计与物理实现
所谓逻辑设计是指对问题的抽象描述,它一般是存在于纸上的。物理实现指的是把对问题的逻辑描述转化为计算机中的表示或功能。为了便于学习和研究,经常需要对计算机技术的相关问题进行抽象,因而我们就会经常涉及到逻辑设计与物理实现的关系问题。例如,数据结构中的逻辑结构和存储结构(物理结构),关系数据库系统中”表”的逻辑形式与对应的物理文件格式,程序设计语言中的数据类型与该类型的变量在内存中的表示形式(占用的字节数,采用何种二进制编码),操作系统中文件的概念和相应的数据在磁盘中的具体存储方式等。
2.4 层次性与透明性
为了简化研究和设计的复杂性,无论是在看待整个计算机系统的观点上还是在某个具体软件系统的实现中,人们都倾向于采用一种分层结构的思想。相邻层次之间通过某种形式的接口相互通信,较高的一层比较低的一层更加抽象。例如,从程序员的角度看,我们可以把整个计算机系统分为四个层次:机器硬件层(机器语言层),操作系统层,汇编语言层和高级语言层。透明性的概念指的是本来存在的事物在某种条件下看起来好像不存在。层次性和透明性具有内在的联系。任何透明性都是一定程度的透明性,也就是说透明性存在着程度上的差别。而这种差别是由系统的层次性引起的。从较高的层次上看某个系统,系统对这个观察者的透明性也就越高。例如,机器的指令系统和寄存器结构等硬件属性对汇编语言程序员而言是不透明的,而高级语言程序员在进行程序设计时无需关心这些底层细节,也就是说上述硬件属性对他们是透明的。由此可以看出,透明性总是一定层次上的透明性,而透明性又需要通过系统分层来实现。所以,层次性是透明性的基础,而透明性是层次性的反映。无论是层次性还是透明性,它们的目标是一致的,即实现系统的易用性。
2.5 复杂性、效率与易用性
计算机系统所追求的技术指标之间往往是相互排斥的,即它们不可能同时达到最优。如算法的时间复杂性和空间复杂性,系统的可靠性与灵活性等。系统的复杂性,效率与易用性之间也是相互矛盾的。以程序设计语言为例,汇编语言较高级语言难于使用,但汇编程序比高级语言的编译程序复杂性低。同时,用汇编语言编写的程序比用高级语言编写的程序目标代码短,运行速度更快。面向对象的程序设计语言比传统的面向过程的语言易于使用,但用面向对象的语言编写的程序运行效率较低(在实现大型的应用软件时尤其如此)。图形用户界面(GUI)正是遵循着易用性的原则而设计的,它为终端用户提供了一个方便友好的与计算机交互的手段,但实现图形界面功能的软件系统一般都很庞大和复杂。相反,字符命令行界面对普通用户不太友好,但这种界面实现简单,更重要的是对操作熟练的专业人员而言,通过命令行与系统交互快捷而高效。这也正是很多操作系统至今仍然保留字符界面的原因。由上述事实我们可以体会到,系统的易用性总是以增加系统实现的复杂性和牺牲系统的运行效率为代价的。复杂性,效率与易用性的关系问题实质上是系统与用户之间的功能分配问题。一个系统要想让用户容易使用,就要减少用户对系统的干预,这样就必然要求系统本身承担更多的功能,因而这样的系统实现起来就会复杂。反之,如果把较多的功能让用户自己完成,系统本身就会变得简单,但这样的系统用户感觉很难使用。常常会有这样一种说法,即“系统表面上看起来越简单,实际上系统内部越复杂”,就是这个道理。现在,由于计算机硬件系统的性能比以前有了很大的提高,效率问题已经不再是矛盾的主要方面,而如何提高系统的易用性,为用户提供一个更加友好的界面,已经成为软件设计人员关注的焦点。
2.6 可移植性与兼容性
可移植性主要是指把同一软件放置到不同系统平台(如不同的硬件平台和操作系统)并使之正常运行的难易程度。可移植性有时候被表述为跨平台性。分析软件的可移植性大概要考虑以下几种情况:不同的体系结构(如CPU的指令系统)之间二进制形式的应用软件是不可移植的,如果是源程序,必须对其进行重新编译才可以在新的环境中运行。相同体系结构的硬件平台上,如果操作系统也相同(系统调用接口一致),二进制形式的应用软件可移植, 否则必须对源程序进行相应的修改后重新编译链接生成新的可执行文件才可以在不同的操作系统下运行。对于同一种语言编写的程序在不同版本编译器之间的可移植性(无论硬件平台和操作系统是否相同),取决于该语言的标准化程度和编译器实现时对语言标准的严格遵守程度。兼容性是指不同软硬件产品在技术特征上的一致性。兼容性是分层次的,如CPU的兼容性可分为芯片的引脚级兼容(芯片引脚信号的定义一致)和指令级兼容(机器指令系统的一致性)。保持产品兼容性的是重要的,这样才能保证产品使用的连续性(对同一系列产品而言)和互用性(对同一种类的产品而言)。但很多产品为了照顾兼容性(主要指同一系列产品的向后兼容),使产品日益变得庞大而复杂。这是因为新产品不仅要提供更新的,更先进的特征,还必须保留原来产品的的特征(尽管这些特征可能是过时的,甚至与新特征由某种程度的抵触)。我们所熟知的C++语言就是一个例子,为了保持与传统C语言的兼容性,使C++在设计时不能完全抛弃C语言中不太合理的语言要素,语言的语法显得有些杂乱,而且程序员在进行程序设计时可能新旧语言要素并用,程序可读性差,而且容易出错。
可移植性依赖于兼容性。某个软件所依赖的不同的平台的兼容性,是该软件能够在这些平台上可移植的必要条件。假设A软件可以在B平台上运行,如果 C平台与B平台兼容,则A软件也可以在B平台上运行,即A软件对于B,C而言是可移植的。一个明显的例子是,如果两个不同版本的C语言编译器是完全兼容的,那么用其中任何一个版本的C语言写的源程序,都可以在另一个版本的C编译器上不加修改的成功编译。
2.7 安全性与可用性
信息系统或通信网络的安全性总是以牺牲系统的复杂性和可用性为代价的。安全意味着限制,使用户对某个安全系统使用的灵活性与功能的广泛性受到制约,导致系统的可用性变差。例如,制订防火墙的安全策略可以采用两种不同的原则:(1)凡是没有被安全策略明确禁止的操作都是允许的;(2)凡是没有被安全策略允许的操作都是被禁止的。显然第二种情况的限制比第一种情况要严格,采用这种策略的防火墙安全强度更高,但用户能够使用的系统功能比第一种情况少,使系统的可用性变差。再比如,有些网络传输业务的实时性要求很高,但附加的安全处理会造成很大的通信时延,在这种情况下,对该业务而言网络的可用性变差。因此任何安全系统在设计时,都必须在系统的安全性和可用性方面寻求平衡。
2.8 编程语言与API
任何编程语言在设计时都要考虑以下情况:用户在使用此种语言编程时所需要的功能是由语言本身实现还是由语言之外的API实现。所谓”由语言本身实现” 就是该功能被包括在语言文本当中(有对应的程序语句),也就是说该功能由编译程序处理。API可以表现为不同的形式,如传统的面向过程的语言开发软件包所提供的函数形式(这些标准函数的集合被称为函数库),面向对象的语言系统所提供的标准类(这些类的集合被称为类库)。原则上讲,对同一功能由语言本身实现或由外部的API实现在逻辑上是等价的。如最常见的输入输出功能,有些语言将此功能包含在了语言文本当中,象早期的BASIC语言就提供了输入输出语句。但现在大多数语言都由外部的API机制对此功能提供支持,如C语言的标准函数printf。将很多功能(特别是与系统平台密切相关的功能)由API实现,可以降低编译程序的复杂性,提高语言系统的适应性,特别是有利于语言的标准化(将与平台相关的功能要素排除在语言本身之外)。
2.9 编译与解释
编译与解释是计算机处理编程语言的两种方式。由于编译要形成最终的可执行文件,这种对源程序的翻译是一次性的,因而程序的执行效率较高。但编译形式的语言要想跨平台执行,需要用新的平台上的编译器重新编译。解释性的语言由于每次执行时都伴随着翻译的过程,所以程序运行效率较低,但解释方式使得用该语言编写的程序容易实现跨平台运行(由解释器隐藏不同平台之间的差异)。为了在程序的运行效率和程序的跨平台性之间需求平衡,Java语言采用了一种折中的方案,先对源程序编译,生成中间形式的代码(称为字节码),程序运行时由所在系统平台的解释器(被称为虚拟机)解释执行。由于字节码是标准的,与平台无关,这样就满足了程序跨平台执行的条件。同时字节码比源程序更接近机器指令(语义差距缩小),翻译的效率变高,这样就改善了程序的运行速度。
2.10 标准与实现
由于信息技术具有交互性和共享性的特点,在这一领域对不同技术层面进行统一性的规定就显得非常重要。计算机领域就存在着种类繁多的技术标准,目的就是要使不同的软硬件产品在实现上取得某些方面的一致性。标准是抽象的,实现就是对标准的具体实施,它具体表现为不同种类的软硬件产品。TCP/IP就是对某种网络体系结构的抽象规定,很多操作系统及相关的软硬件产品都实现了TCP/IP协议所定义的功能。ANSI C++是C++语言的标准,而Visual C++则是Windows平台上C++语言标准的具体实现。还有,POSIX对类UNIX操作系统的实用程序和系统调用等诸多方面进行了标准化,不同的 UNIX版本包括LINUX都不同程度地实现了这一标准。标准与实现在功能上并非是一一对应的,不同的实现产品往往在标准的基础上都扩充了一些附加的功能来体现自己的特色。但在一般情况下,标准总是某个具体实现的产品功能的子集。
不同技术标准对实现要求的严格性是有差别的。有的技术标准对实现有严格的强制性,对各种技术要素的标准化比较全面,具体产品实现的灵活性和可扩展的余地很小,不同产品有高度的一致性,这样就提高了产品的可移植性和互操作性,但产品的实现缺乏灵活性,如Java就是一种强制标准化的语言。还有些技术标准为了给不同厂商实现产品的灵活性留有余地,对技术要素的规定不是很死,有些技术特征依赖于具体的实现,同时允许专有扩展,不同产品在实现时可以通过专有扩展来充分发挥该产品所依赖的平台独有的特点,提高产品的可用性和效率,C++语言标准就是这样一个例子(如同一数据类型的存储长度与不同的硬件平台有关)。但非强制性标准的缺点也是明显的,它直接带来的严重问题就是不同产品的兼容性差,这与信息技术越来越崇尚的开放性是背到而驰的。而且,允许专有扩展容易使有些厂商通过对产品大量添加自己独有的特征来绑定用户,从而垄断技术市场。
3 总 结
上述的十个技术要素之间的关系是多样的。有的在逻辑上具有等价性,如硬件与软件之间的关系,编程语言与API的关系;有的是相互排斥的,如复杂性,效率与易用性之间的关系,安全性与可用性之间的关系;有的技术要素需要向另一个要素转化,如逻辑设计与物理实现,标准与实现;有的关系是相互补充,平行发展的,如编译与解释;有的技术要素之间具有内在的一致性,如层次性与透明性;有的则是条件或依赖的关系,如可移植性以兼容性为条件,应用程序的运行依赖于操作系统。