1.2.1 如何让机器理解你
计算机语言,也就是我们平时所说的程序设计语言,它通常是指一个能够完整、准确和规则地表达人们的意图,并用以指挥或控制计算机工作的“符号系统”。计算机语言是人与机器交流意思、传递指令的渠道和媒介。类比于人类的自然语言,二者之间有许多相似之处,它们都是使用有限的简单符号,经过组合后来表达复杂多变的含义,从而构建出丰富多彩的计算机软件。
计算机语言通常分为3类:即机器语言、汇编语言和高级语言,如图1-4所示。某些文献上又把机器语言和汇编语言统称为低级语言,本书仍把它们分别对待。
图1-4 计算机语言
计算机硬件是以电路为基础的“电子系统”。对于一条电路而言,所处的状态要么是通路,要么是断路,这也就奠定了计算机本身的“二值性”,在计算机的世界里,只有0和1两种状态,它也仅能读懂用二进制格式编写的代码。因此,机器语言作为一种直接与机器进行通信的语言,就是一种使用二进制代码表示的计算机能够直接识别和执行的机器指令的集合。机器语言是计算机的设计者通过计算机的硬件结构赋予计算机的操作功能,机器语言的特点在于灵活和高效。
很多读者往往觉得机器语言讳莫如深,一个看似杂乱无章的二进制序列,机器何以给出正确的解释并执行相应的指令,对于这个问题很多读者都百思不得其解。在本书第5章中,我们将用高级语言编写的一条语句还原成了机器语言的模样,到那时上述疑问也就可以迎刃而解了!
用机器语言编写程序难度很高,编程人员首先要熟记所用计算机的全部指令代码和代码的含义。而且对于不同型号、不同品牌及不同类型的硬件,其机器语言的指令集是有差别的,这给机器语言的使用和推广造成了障碍。此外,在手工编写机器语言代码时,程序员不得不自己处理每条指令和每个数据的存储分配和输入/输出,还得记住编程过程中每步所使用的工作单元处在何种状态。即使一个看似非常简单的操作或功能,使用机器语言来实现也是十分烦琐而复杂的,实际中编写机器语言程序花费的时间往往是机器执行时间的几十倍甚至几百倍。这还不是最糟糕的!使用机器语言编写的程序可读性极差,维护起来也相当困难,由于语句本身是大量0和1交错的二进制序列,看上去令人眼花缭乱,极易出错。同一个人编写的程序在相隔一段时间后再去阅读时理解起来也非常不容易。因此,目前除了计算机硬件制造商的少数专业人员以外,已经很少有人再去学习机器语言了。
早期的计算机程序设计只能由少数的专业人员来完成,第一批计算机科学家,例如图灵、冯·诺依曼等人都是公认的数学天才。这在很大程度上阻碍了计算机技术的推广和长远发展。既然机器语言有诸多弊端,于是有人开始考虑改进。为了克服机器语言难读、难编、难记和易出错的缺点,计算机科学家和工程技术人员就用与代码指令实际含义相近的英文缩写词、字母和数字等符号来取代指令代码,于是汇编语言应运而生。在汇编语言中,缩写词ADD表示加法,MOV则代表数据传送,这无疑在很大程度上减轻了开发人员的编程难度。如此一来,程序员很容易读懂并理解程序在干什么,纠错及维护都变得方便了。目前,在中国的各大高校中,计算机专业的学生仍然把汇编语言作为一门必修课来学习。
汇编语言是一种用助记符表示的仍然面向机器的计算机语言。作为第二代计算机语言,它相比于机器语言有了长足的发展。然而计算机是不认识这些助记符的,这就需要一个专门的程序,专门负责将这些符号翻译成计算机能够理解的二进制序列(即机器语言),这种翻译程序就被称为汇编程序。
由于汇编语言采用了助记符来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。但由于需要使用汇编程序来进行中间翻译工作,因此效率比机器语言稍有下降,但仍然保持了相对的高效性。
但汇编语言仍然存在一定的问题。首先,汇编语言仍然是面向机器的语言,学习和使用它仍然比较烦琐而费时。其次,汇编语言的通用性差,不同型号和类型的硬件设备所采用的汇编指令系统存在很大的差异,这在很大程度上限制了汇编语言的使用。
不论是机器语言还是汇编语言都是面向硬件具体操作的,因此把它们统称为低级语言是有一定道理的。低级语言本身对机器过分依赖,要求使用者必须对硬件结构及其工作原理都十分熟悉,这对非计算机专业人员来说是很难做到的。从最初与计算机交流的痛苦经历中人们意识到,应该设计这样一种编程语言——接近于人类的自然语言,同时又不依赖于计算机硬件,编出的程序还能在所有机器上通用。于是高级语言终于诞生了。纵观计算机程序设计语言的发展历程,程序设计语言经历了从机器语言、汇编语言到高级语言的历程。这段经历虽然漫长,但从无到有、从弱到强的发展过程也折射出计算机技术时过境迁、飞速发展的历史脚步。
高级语言的出现具有划时代的意义,它是一种与自然语言相近并为计算机所接受和执行的计算机语言,更重要的是它是面向用户的语言。无论何种机型的计算机,只要配备上相应的高级语言的编译或解释程序,用该高级语言编写的程序就可以在此计算机上正常运作。
和汇编语言相比,高级语言不但将许多相关的机器指令合成为单条指令,并且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,从而大大简化了程序中的指令。此外,由于省略了很多细节,开发人员也就不需要有太多的专业知识了。这为高级语言本身的发展和推广提供了有力保证,也为计算机事业的发展注入了持久的动力。如果说个人计算机的出现使计算机走进了千家万户,那么高级语言的出现就使得计算机程序设计不再是少数天才的专利。从此,计算机世界里发生了翻天覆地的变化,世界为之震惊!
高级语言主要是相对于汇编语言而言的,它并不是特指某一种具体的语言,而是包括了很多编程语言,不同高级语言的语法、命令格式是各不相同的。世界上第一个高级语言FORTRAN诞生于1954年,它是第一个完全脱离机器硬件的高级语言。在科学计算和工程领域,FORTRAN语言仍然有广泛的应用。半个世纪以来,世界上共有几百种高级语言出现,其中有重要意义的也多达几十种之多。其中,影响较大、使用较普遍、大家耳熟能详的有FORTRAN、ALGOL、COBOL、Basic、Pascal、C、C++、Java等。下面介绍几种较有代表性的高级程序设计语言。
1.Basic语言
Basic语言全称是Beginners’ All-Purpose Symbolic Instruction Code,意为“初学者通用符号指令代码”。Basic语言于1964年由美国的两位计算机科学家G. Kemeny和Thomas E. Kurtz在FORTRAN语言的基础上创造而成。
Basic 具有易学、易懂、易记、易用的特点,于是很快得到了推广与应用,现在它不仅是适合于初学者学习的入门语言,同时也是可以进行科学计算、数据处理等工作的高级程序设计语言。
1975年,微软公司成功地把Basic语言的编译器移植到使用Intel处理器的ALR计算机中。此后,微软还在其发布的DOS操作系统中免费加入了GW-Basic、QBasic等当时最好的Basic 解释程序。自从Windows操作系统出现以来,图形用户界面(GUI)的Basic语言一跃成为当今应用最广泛的程序设计语言之一,也就是闻名遐迩的Visual Basic。
2.Pascal语言
Pascal(B. Pascal)是17世纪法国著名数学家,他于1642年曾发明了现代台式计算机的雏型机——加减法计算机,Pascal语言正是得名于此。
Pascal语言由瑞士苏黎士联邦工业大学的沃斯(N.Wirth)教授研制,并于1971年正式发布。此外,沃斯一生还写作了大量有关程序设计、算法和数据结构的著作,因此,他于1984年获得了计算机最高奖——“图灵奖”。
不得不强调,Pascal 语言是高级语言发展过程中一个重要的里程碑。Pascal 语言是第一个系统地体现了E. W. Dijkstra和C. A. R. Hoare定义的结构化程序设计概念的语言。作为世界上第一个结构化的程序设计语言,它的出现标志着结构化程序设计时期的开始。Pascal语言本身是从ALGOL 60衍生而来的,但其功能更加强大且容易使用。Pascal语言具有大量的控制结构,充分反映了结构化程序设计的思想和要求,直观易懂,使用灵活,既可用于科学计算,又能用来编写系统软件,应用范围极广。
在Pascal语言问世以来的30余年间,先后产生了适合于不同机型的各种版本。其中,影响最大的莫过于Turbo Pascal系列软件,它是由美国Borland公司设计、研制的一种适用于微机的Pascal编译系统。后来在Anders Hejlsberg(Turbo Pascal的作者)的领导下,Borland公司于1995年发布了Delphi 1快速应用开发(RAD)环境,Delphi目前仍然是业内使用最广泛的一款集成开发工具之一,它正是以Pascal语言为基础的图形用户界面的集成开发环境。这个产品到现在依然是Borland公司最成功、最引以为傲的经典之作,到本书截稿之日,Delphi 2009已经正式发布。
3.Java语言
Java是由Sun Microsystems公司于1995年5月推出的Java程序设计语言(以下简称Java语言)和Java平台的总称。Java平台由Java虚拟机(JVM)和Java 应用编程接口构成。Java应用编程接口为Java应用提供了一个独立于操作系统的标准接口,分为基本部分和扩展部分。在硬件或操作系统平台上安装一个Java平台之后,Java应用程序就可运行了。现在Java平台已经嵌入了几乎所有的操作系统,这样Java程序只编译一次,就可以在各种系统中运行。目前, Java分为3个体系:J2SE、J2EE和J2ME。如图1-5所示为Sun公司的Java主页。
图1-5 Sun公司的Java主页
就Java语言本身来说,它是一种简单的、面向对象的、分布式的、解释的、健壮的、安全的、结构中立的、可移植的、性能很优异的、多线程的、动态的语言。当1995年Sun推出Java语言之后,全世界的目光都被这个神奇的语言所吸引。但事实上,Java语言最早诞生于1991年,起初被称为OAK语言,是Sun公司为一些消费性电子产品而设计的一个通用环境。最初的目的只是为了开发一种独立于平台的软件技术,而且在网络出现之前,OAK可以说是默默无闻,甚至差点夭折。但是,互联网的飞速发展使Java一跃成为整个世界的宠儿。Java在Web上的应用一改以往Internet上信息内容的乏味和死板,使世人眼前为之一亮。自从Sun公司于1995年正式以Java这个名字推出该产品后,几乎所有的Web开发人员都被他迷倒了。从此,伴随着互联网时代的来临,Java取得了巨大的成功。
Java语言的优良特性使得Java应用具有无比的健壮性和可靠性,这也减少了应用系统的维护费用。Java对对象技术的全面支持和Java平台内嵌的API能缩短应用系统的开发时间并降低成本。Java的编译一次、到处可运行的特性使得它能够提供一个随处可用的开放结构和在多平台之间传递信息的低成本方式。特别是Java企业应用编程接口为企业计算及电子商务应用系统提供了有关技术和丰富的类库。总的来说,Java语言主要具有如下的特点:
● Java语言是简单的。
● Java语言是纯粹面向对象的。
● Java语言是分布式的。
● Java语言是健壮的。
● Java语言是安全的。
● Java语言是体系结构中立的。
● Java语言是可移植的。
● Java语言是多线程的。
● Java语言是动态的。
早期受计算机硬件本身的限制,程序运行效率是工程技术人员必须考虑的问题,随着计算机硬件技术的进步,效率已经不再是人们考虑的头等问题。于是编程语言摆脱了原有的硬件束缚,朝着更加多元化、人性化的方向发展。当然,高级语言也需要面对和汇编语言同样的问题,即机器如何理解它呢?计算机并不能直接地接受和执行用高级语言编写的代码,要使机器能够明白用高级语言所写的代码,有两种可行的方法:一种是对程序进行编译;另一种则是对程序进行解释。据此,高级语言又可分为两类,即编译类语言和解释类语言。
在具体介绍上述两类高级语言之前,我们先给出翻译的概念。所谓翻译,就是指在计算机中放置一个能由计算机直接执行的翻译程序,它以某一种程序设计语言(源语言)所编写的程序(源程序)作为翻译或加工的对象,当计算机执行翻译程序时,就将它翻译为与之等价的另一种语言(目标语言)的程序(目标程序)。如果一个翻译程序的源语言是某种高级语言,其目标语言是相对于某一计算机的汇编语言或者机器语言,则称这种翻译程序为编译程序(或者编译器)。一旦计算机上装有这种编译程序,那么当源程序输入计算机时,源程序就可以通过编译程序被翻译成机器语言形式的目标程序,计算机就能够识别和执行。而编译和解释就是“翻译”的两种具体方式。
编译是指事先编好一个称为编译程序的机器语言程序并作为系统软件存放在计算机内,当用户把由高级语言编写的源程序输入计算机后,编译程序便把源程序整个地翻译成用机器语言表示的与之等价的目标程序,然后计算机再执行该目标程序,以完成源程序要处理的运算并取得结果。也就是说,在应用源程序执行之前,程序源代码就已经被整体“翻译”成目标代码(机器语言)了,这样目标程序就可以脱离其语言环境独立执行,使用比较方便、效率较高。现在大多数的编程语言都是编译型的,例如C/C++、Pascal、FORTRAN和COBOL等。
解释的执行方式类似于日常生活中的“同声传译”,也就是说,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此解释型的程序并不会产生目标程序。这样的好处在于它比较灵活,并可以动态地调整、修改应用程序。但解释型程序的效率比较低,而且不能生成可独立执行的可执行文件,即应用程序不能脱离其解释器。翻译程序的结构比编译程序简单,且占用内存较少,因此一些规模较小的语言常采用这种方式,如BASIC。然而,就目前的情况来看,纯粹的解释程序并不多见,通常的做法都是把编译和解释作某种程度的结合,从而弥补解释型程序效率不高的弱点。