1.3 程序表象之下
一个典型的应用程序,如字处理程序或大型数据库系统,可以由数百万行代码构成,并依靠软件库来实现异常复杂的功能。众所周知,计算机中的硬件只能执行极为简单的低级指令。从复杂的应用程序到原始的指令涉及若干软件层次来将高层次操作解释或翻译成简单的计算机指令,这可以作为伟大的抽象思想的一个例子。
在巴黎,我对当地人讲法语,他们只是瞪着眼看着我;我从来没能让这些白痴理解他们自己的语言。
马克·吐温,
异国奇遇,1869
图1-3给出了这些软件的层次结构,外层是应用软件,中心是硬件,系统软件(systems software)位于两者之间。
系统软件:提供常用服务的软件,包括操作系统、编译器、加载程序和汇编器等。
图1-3 简化的硬件和软件层次图,将硬件作为同心圆的中心,应用软件作为最外层。在复杂的应用中通常存在多层应用软件层。例如,一个数据库系统可运行于系统软件之上,而驻留在该系统软件上的某应用反过来又运行在该数据库之上
系统软件有很多种,其中有两种对于现代计算机系统来说是必需的:操作系统和编译器。操作系统(operating system)是用户程序和硬件之间的接口,为用户提供各种服务和监控功能。操作系统最为重要的作用是:
操作系统:为了使程序更好地在计算机上运行而管理计算机资源的监控程序。
• 处理基本的输入和输出操作。
• 分配外存和内存。
• 为多个应用程序提供共享计算机资源的服务。
当前我们使用的操作系统主要有Linux、iOS、Android和Windows。
编译器(compiler)完成另外一项重要功能:把高级语言(如C、C++、Java或Visual Basic等)编写的程序翻译成硬件能执行的指令。这个翻译过程是相当复杂的,这里仅作简要介绍,第2章将作深入介绍。
编译器:将高级语言翻译为计算机所能识别的机器语言的程序。
从高级语言到硬件语言
谈到电子硬件,首先需要谈到电信号的发送。对于计算机来说,最简单的信号是通和断。因此,计算机只用2个字母来表示。正如英语26个字母写多少不受限制一样,计算机的2个字母写多少也不受限制。代表2个字母的符号是0和1,我们通常认为计算机语言就是二进制数。每个字母就是二进制数字中的一个二进制位(binary digit)或一位(bit)。计算机服从于我们的命令,即计算机术语中的指令(instruction)。指令是能被计算机识别并执行的位串,可以将其视为数字。例如,位串
二进制位:也称为位。基数为2的数字中的0或1,它是信息的基本组成元素。
指令:计算机硬件能够理解并遵从的命令。
告诉计算机将两个数相加。第2章将解释为什么数字既表示指令又表示数据。我们不希望在此处涉及第2章的具体内容,但是使用数字既表示指令又表示数据是计算机的基础。
第一代程序员是直接使用二进制数与计算机通信的,这是一项非常乏味的工作。所以他们很快发明了助记符,以符合人类的思维方式。最初助记符是手工翻译成二进制的,其过程显然过于烦琐。随后设计人员开发了一种称为汇编器(assembler)的软件,可以将助记符形式的指令自动翻译成对应的二进制。例如,程序员写下
汇编器:将指令由助记符形式翻译成二进制形式的程序。
汇编程序会将该符号翻译成
该指令告诉计算机将A和B两个数相加。这种符号语言的名称今天还在用,即汇编语言(assembly language)。而机器可以理解的二进制语言是机器语言(machine language)。
汇编语言:以助记符形式表示的机器指令。
机器语言:以二进制形式表示的机器指令。
虽然这是一个巨大的进步,但汇编语言仍然与科学家用来模拟液体流动或会计师用来结算账目所使用的符号相去甚远。汇编语言需要程序员写出计算机执行的每条指令,要求程序员像计算机一样思考。
认识到可以编写一个程序来将更强大的高级语言翻译成计算机指令是计算机早期的一个重大突破。高级编程语言及其编译器大大地提高了软件的生产率。图1-4给出了这些程序和编程语言之间的关系,这是抽象思想之伟大的另外一个例子。
高级编程语言:如C、C++、Java、Visual Basic等可移植的语言,由一些单词和代数符号组成,可以由编译器转换为汇编语言。
编译器使得程序员可以写出高级语言表达式。
编译器将其编译为如下的汇编语言语句:
然后,汇编器将此语句翻译为二进制指令,告诉计算机将两个数A和B相加。
使用高级编程语言有以下几个好处。第一,可以使程序员用更自然的语言来思考,用英文和代数符号来表示,形成的程序看起来更像文字而不是密码表(见图1-4)。而且,它们可按用途进行设计。例如,Fortran是为科学计算设计的,Cobol是为商业数据操作设计的,Lisp是为符号操作设计的,等等。还有一些特定领域的语言,只为少数专业人群设计,如机器学习的研究人员等。
图1-4 C程序编译为汇编语言程序,再汇编为二进制机器语言程序。尽管将高级语言翻译成二进制的机器语言仅需要两步,但一些编译器将“中间人”略去并直接产生二进制的机器语言。这些语言和本图中列举的程序将在第2章详细介绍
第二,高级语言提高了程序员的生产率。如果使用较少行数的编程语言即可表示出设计用意,则可加速程序的开发,这是软件开发方面少有的共识之一。简明性是高级语言相对汇编语言最为明显的优势。
第三,采用高级语言编写程序提高了程序相对于计算机的独立性,因为编译器和汇编程序能够把高级语言程序翻译成任何计算机的二进制指令。高级编程语言的这些好处,使其直到今天仍应用广泛。