Java程序设计大学教程 5: writeln('a+b='+IntTostr(c)) 也许有人会问为什么程序必须由不同的指令集组成,答案是重用性。如今,计算机完成 成千上万的任务,如果每一项任务的程序都是相对独立而且和其他的程序之间没有任何的公 用段,程序设计将会变成一件很困难的事情。冯·诺伊曼模型通过仔细地定义计算机可以使 用的不同指令集,从而使得程序设计变得相对简单。一个程序员通过组合这些不同的指令来 创建任意数量的程序。每个程序可以是不同指令的不同组合 前面的要求使得程序设计变得可能,但也带来了另外一些使用计算机方面的因素。程序 员不仅要了解每条指令所完成的任务,还要知道怎样将这些指令结合起来完成一些特定的任 务,对于一些不同的问题,一个程序员首先应该以循序渐进的方式来解决问题,接着尽量找 到合适的指令(指令序列)来解决问题。这种按步骤解决问题的方法就是所谓的算法。算法 在计算机科学中起到了重要的作用,我们会在后面详细讨论。 在计算机时代的开端,并没有计算机语言。程序员依靠写指令的方式(使用位模式,即 直接写二进制代码指令)来解决问题。但是随着程序的越来越大,采用这种模式来编写很长 的程序变得单调乏味。计算机科学家们研究出利用符号来代表二进制格式指令。就像人们在 日常中用符号(单词)来代替一些常用的指令一样。当然人们在日常生活中所用的一些符号 并不相同于计算机中所用的符号。这样计算机语言的概念诞生了。自然语言(例如英语)是 门丰富的语言,并有许多正确组合单词的规则;相对而言,计算机语言只有比较有限的符 号和单词。后面我们还会介绍一些计算机语言的知识。 1.1.2 算法与数据结构 1.计算机程序 程序是程序设计中最基本的概念,也是软件中最基本的概念。程序是计算仼务的处理对 象和处理规则的描述。所谓计算任务是指所有通过计算来解决实际问题的任务。处理对象是 数据,如数字、文字和图像等。处理规则一般指处理动作和步骤。在低级语言中,程序是 组指令和相关的数据。在高级语言中,程序一般是一组说明和语句,它包括了算法和数据结 我们知道,利用计算机解决问题需要使用程序对问题的求解进行描述。这种解决问题的 过程类似人脑的解题过程,即利用一些规则或方法去处理特定的对象,从而解决问题。 通过程序,计算机可以按照人所规定的算法对数据进行处理。首先,人类凭借自然语言 进行思维,而计算机使用计算机语言进行“思维”,控制计算机解题过程的算法必须以计算 机能够“读得懂”的形式表示出来,也就是需要用计算机语言将算法描述岀来,这种以计算 机语言描述的算法就是程序。其次,算法只是描述人类思维时对数据的处理过程,人类思维 时所用到的数据及其操作,将根据思维者的教育背景以人们无法直接看到的某种方式自然而 然地存储在思维者的大脑中,因此人在解决一个具体问题时往往不会过多地考虑所涉及的数 据。然而计算机解决问题与此不同,除去一些基本的操作可以由计算机系统提供外,即便是 看起来很简单的操作也需要进行专门定义和实现,而且那些“书写”在人脑中,常常被使用 的数据,在使用计算机解决问题时将变得不再简单。如何将它们放置在计算机中将是通过计 算机使用算法解决问题所不可回避的问题。因此,使用计算机解决问题时,除了需要使用计 算杋语言描述算法,还必将涉及数据结构。从这个意义上讲,程序是建立在数据结构基础上 使用计算机语言描述的算法,因此简单地讲,程序也可以表示成:算法+数据结构
Java 程序设计大学教程 4 4: c=a+b; 5: writeln('a+b='+IntToStr(c)); 也许有人会问为什么程序必须由不同的指令集组成,答案是重用性。如今,计算机完成 成千上万的任务,如果每一项任务的程序都是相对独立而且和其他的程序之间没有任何的公 用段,程序设计将会变成一件很困难的事情。冯·诺伊曼模型通过仔细地定义计算机可以使 用的不同指令集,从而使得程序设计变得相对简单。一个程序员通过组合这些不同的指令来 创建任意数量的程序。每个程序可以是不同指令的不同组合。 前面的要求使得程序设计变得可能,但也带来了另外一些使用计算机方面的因素。程序 员不仅要了解每条指令所完成的任务,还要知道怎样将这些指令结合起来完成一些特定的任 务,对于一些不同的问题,一个程序员首先应该以循序渐进的方式来解决问题,接着尽量找 到合适的指令(指令序列)来解决问题。这种按步骤解决问题的方法就是所谓的算法。算法 在计算机科学中起到了重要的作用,我们会在后面详细讨论。 在计算机时代的开端,并没有计算机语言。程序员依靠写指令的方式(使用位模式,即 直接写二进制代码指令)来解决问题。但是随着程序的越来越大,采用这种模式来编写很长 的程序变得单调乏味。计算机科学家们研究出利用符号来代表二进制格式指令。就像人们在 日常中用符号(单词)来代替一些常用的指令一样。当然人们在日常生活中所用的一些符号 并不相同于计算机中所用的符号。这样计算机语言的概念诞生了。自然语言(例如英语)是 一门丰富的语言,并有许多正确组合单词的规则;相对而言,计算机语言只有比较有限的符 号和单词。后面我们还会介绍一些计算机语言的知识。 1.1.2 算法与数据结构 1. 计算机程序 程序是程序设计中最基本的概念,也是软件中最基本的概念。程序是计算任务的处理对 象和处理规则的描述。所谓计算任务是指所有通过计算来解决实际问题的任务。处理对象是 数据,如数字、文字和图像等。处理规则一般指处理动作和步骤。在低级语言中,程序是一 组指令和相关的数据。在高级语言中,程序一般是一组说明和语句,它包括了算法和数据结 构。 我们知道,利用计算机解决问题需要使用程序对问题的求解进行描述。这种解决问题的 过程类似人脑的解题过程,即利用一些规则或方法去处理特定的对象,从而解决问题。 通过程序,计算机可以按照人所规定的算法对数据进行处理。首先,人类凭借自然语言 进行思维,而计算机使用计算机语言进行“思维”,控制计算机解题过程的算法必须以计算 机能够“读得懂”的形式表示出来,也就是需要用计算机语言将算法描述出来,这种以计算 机语言描述的算法就是程序。其次,算法只是描述人类思维时对数据的处理过程,人类思维 时所用到的数据及其操作,将根据思维者的教育背景以人们无法直接看到的某种方式自然而 然地存储在思维者的大脑中,因此人在解决一个具体问题时往往不会过多地考虑所涉及的数 据。然而计算机解决问题与此不同,除去一些基本的操作可以由计算机系统提供外,即便是 看起来很简单的操作也需要进行专门定义和实现,而且那些“书写”在人脑中,常常被使用 的数据,在使用计算机解决问题时将变得不再简单。如何将它们放置在计算机中将是通过计 算机使用算法解决问题所不可回避的问题。因此,使用计算机解决问题时,除了需要使用计 算机语言描述算法,还必将涉及数据结构。从这个意义上讲,程序是建立在数据结构基础上 使用计算机语言描述的算法,因此简单地讲,程序也可以表示成:算法+数据结构
Java程序设计大学教程 2.算法 算法是一种逐步解决问题或完成任务的方法。算法完全独立于计算机系统。更特别的是, 算法接收一组输入数据,同时产生一组输出数据。 算法的定义是:算法是一组明确步骤的有序集合,它产生结果并在有限的时间内终结 因此我们应该从这几个方面理解算法 有序集合算法必须是一组定义完好且排列有序的指令集合 ·明确步骤算法的每一步都必须有清晰明白的定义。如某一步是将两数相加,那么 必须定义相加的两个数和加法符号,不能用一个符号在某处用作加法符号,而在其 它地方用作乘法符号 ·产生结果一个算法必须产生一个结果否则该算法也就没有意义。结果集可以是被 调用的算法返回的数据或其它效果(如,打印) 有限的时间内终结一个算法必须能够终结。如果不能(例如,无限循环),说明 不是算法。显然,任何可解问题的解法形式为一个可终结的算法。 计算机专家们为算法定义了三种结构。实际上已经证实,算法必定是由顺序、选择和循 环(图1-4)这三种基本结构组成,其它结构都是不必要的。仅仅使用这三种结构就可以使 算法容易理解、调试或修改。 假 真 动作1 当条件假 动作2 另一个动作序列::一个动作序列 个动作序列 动作n a)顺序 b)选择 c)循环 图1-4算法的三种基本结构 ·顺序结构一个算法,甚至整个程序,都是一个顺序的指令集。它可以是一简单指 令或是其它两种结构之 选择结构有些问题只用顺序结构是不能够解决的。有时候需要检测一些条件是否 满足。假如测试的结果为真,即条件满足,则可以继续顺序往下执行指令;假如结 果为假,即条件不满足,程序将从另外一个顺序结构的指令继续执行。这就是所谓 的选择结构 循环结构在有些问题中,相同的一系列顺序指令需要重复,那么就可以用循环结 构来解决这个问题。例如,从指定的数据集中找到最大值的算法就是这种结构的例
Java 程序设计大学教程 5 2. 算法 算法是一种逐步解决问题或完成任务的方法。算法完全独立于计算机系统。更特别的是, 算法接收一组输入数据,同时产生一组输出数据。 算法的定义是:算法是一组明确步骤的有序集合,它产生结果并在有限的时间内终结。 因此我们应该从这几个方面理解算法: • 有序集合 算法必须是一组定义完好且排列有序的指令集合。 • 明确步骤 算法的每一步都必须有清晰明白的定义。如某一步是将两数相加,那么 必须定义相加的两个数和加法符号,不能用一个符号在某处用作加法符号,而在其 它地方用作乘法符号。 • 产生结果 一个算法必须产生一个结果否则该算法也就没有意义。结果集可以是被 调用的算法返回的数据或其它效果(如,打印)。 • 有限的时间内终结 一个算法必须能够终结。如果不能(例如,无限循环),说明 不是算法。显然,任何可解问题的解法形式为一个可终结的算法。 计算机专家们为算法定义了三种结构。实际上已经证实,算法必定是由顺序、选择和循 环(图 1-4)这三种基本结构组成,其它结构都是不必要的。仅仅使用这三种结构就可以使 算法容易理解、调试或修改。 图 1-4 算法的三种基本结构 • 顺序结构 一个算法,甚至整个程序,都是一个顺序的指令集。它可以是一简单指 令或是其它两种结构之一。 • 选择结构 有些问题只用顺序结构是不能够解决的。有时候需要检测一些条件是否 满足。假如测试的结果为真,即条件满足,则可以继续顺序往下执行指令;假如结 果为假,即条件不满足,程序将从另外一个顺序结构的指令继续执行。这就是所谓 的选择结构。 • 循环结构 在有些问题中,相同的一系列顺序指令需要重复,那么就可以用循环结 构来解决这个问题。例如,从指定的数据集中找到最大值的算法就是这种结构的例 子。 动作 1 动作 2 动作 n a) 顺序 判断 另一个动作序列 一个动作序列 一个动作序列 当条件 真 假 假 真 b) 选择 c) 循环
Java程序设计大学教程 3.数据结构 算法直观上表现为对各种数据的操作,那么什么是数据?数据又是如何组织的呢? 由于算法作用的对象是数据,而数据的定义又必须是为计算机所能够识别、存储和处理 的符号集合,并最终通过计算机加以实现和运行,所以数据对象需要通过一定的数据结构来 组织。数据的基本单位是数据元素,数据元素可能具有底层结构,即每个数据元素由一个或 多个数据项组成,数据项(又称为字段、域)是具有独立含义的最小单位数据,虽然一些数 据元素具有底层结构,但是对它的使用总是将它看作是一个整体。在算法中更常见的是处理 多个具有相同性质的数据元素,因此又常把由一个或多个性质相同的数据元素组成的集合称 为数据对象,数据对象经常是一个具有底层结构的实体,常常被作为一个整体加以引用。比 如,存储在内存中的通讯录也可称为数据对象,该数据对象由每个同学的通讯地址这个数据 元素组成,而每个同学的通讯地址又由姓名、电话、住址、邮政编码等数据项组成。 因此,一个数据对象中的各数据元素的存在不是孤立的,其相互之间存在着某些联系, 通常把这些联系统称为数据结枃。具体地说,数据结构由数据元素之间的逻辑结构、数据的 存储结构以及在这些数据元素上定义的操作组成 (1)数据的逻辑结构 数据的逻辑结构抽象地反映出数据元素之间的逻辑关系。逻辑结构与数据在计算机中的 存储方式无关,它所体现出的数据元素之间的关系完全是抽象的。例如,数字1,2,3,虽 然它们可能书写在纸面上的不同位置,甚至数字3出现在数字1之前,但这并不能改变 小于3这种数值之间的关系。也就是说它们与写在纸面上的不同位置或存储在计算机内不同 存储单元的顺序无关 数据可以根据其是否具有底层结构划分成初等类型(也称基本类型)和构造类型两类, 而常见的初等类型有5种: 整数类型计算机所定义的其值属于一定范围的整数 实数类型又称浮点数类型,计算机所定义的其值属于一定范围的小数。 ·逻辑类型取值为真和假,通常用非0整数和0表示,或表示为tue和 false。 ·字符类型取值为计算机所采用的字符集的元素。 ·指针类型取值为内存中某存储单元地址,该单元存有某种类型的数据 构造类型由初等类型或构造类型通过某种方式组合而成,不同的组合方式得到的构造类 型不同,例如上文所述的通讯录等。 (2)数据的存储结构 算法中出现的数据最终将被存储于计算机中,就像在纸面上书写数据要考虑在什么位置 书写、一个数据占几格一样,在计算机中存储数据也要考虑将数据存储在内存中的哪个位置, 占用多大的存储空间。数据的存储结构提供了数据的逻辑结构在计算机存储器中的映像,根 据数据的存储结构将逻辑上相联系的数据元素存储在相应的存储单元中,也就是说,数据的 存储位置和读写方式体现了数据的逻辑结构。常见的存储映像方式如下 ·顺序方式将逻辑上相邻的数据元素存储在物理上相邻的存储单元中,数据间的逻 辑关系通过存储单元的邻接关系体现 链接方式数据元素被作为节点的一部分存储在某个存储单元,节点的存储不要求 采用顺序方式。每个节点都含有指向逻辑上相邻的节点的指针,数据元素之间的逻 辑关系通过节点之间的指针链接体现。 ·索引方式按照数据元素的序号建立索引表,索引表中第i项的值为第i个数据元 素的存储地址。 6
Java 程序设计大学教程 6 3. 数据结构 算法直观上表现为对各种数据的操作,那么什么是数据?数据又是如何组织的呢? 由于算法作用的对象是数据,而数据的定义又必须是为计算机所能够识别、存储和处理 的符号集合,并最终通过计算机加以实现和运行,所以数据对象需要通过一定的数据结构来 组织。数据的基本单位是数据元素,数据元素可能具有底层结构,即每个数据元素由一个或 多个数据项组成,数据项(又称为字段、域)是具有独立含义的最小单位数据,虽然一些数 据元素具有底层结构,但是对它的使用总是将它看作是一个整体。在算法中更常见的是处理 多个具有相同性质的数据元素,因此又常把由一个或多个性质相同的数据元素组成的集合称 为数据对象,数据对象经常是一个具有底层结构的实体,常常被作为一个整体加以引用。比 如,存储在内存中的通讯录也可称为数据对象,该数据对象由每个同学的通讯地址这个数据 元素组成,而每个同学的通讯地址又由姓名、电话、住址、邮政编码等数据项组成。 因此,一个数据对象中的各数据元素的存在不是孤立的,其相互之间存在着某些联系, 通常把这些联系统称为数据结构。具体地说,数据结构由数据元素之间的逻辑结构、数据的 存储结构以及在这些数据元素上定义的操作组成。 (1) 数据的逻辑结构 数据的逻辑结构抽象地反映出数据元素之间的逻辑关系。逻辑结构与数据在计算机中的 存储方式无关,它所体现出的数据元素之间的关系完全是抽象的。例如,数字 1,2,3,虽 然它们可能书写在纸面上的不同位置,甚至数字 3 出现在数字 1 之前,但这并不能改变 1 小于 3 这种数值之间的关系。也就是说它们与写在纸面上的不同位置或存储在计算机内不同 存储单元的顺序无关。 数据可以根据其是否具有底层结构划分成初等类型(也称基本类型)和构造类型两类, 而常见的初等类型有 5 种: • 整数类型 计算机所定义的其值属于一定范围的整数。 • 实数类型 又称浮点数类型,计算机所定义的其值属于一定范围的小数。 • 逻辑类型 取值为真和假,通常用非 0 整数和 0 表示,或表示为 true 和 false。 • 字符类型 取值为计算机所采用的字符集的元素。 • 指针类型 取值为内存中某存储单元地址,该单元存有某种类型的数据。 构造类型由初等类型或构造类型通过某种方式组合而成,不同的组合方式得到的构造类 型不同,例如上文所述的通讯录等。 (2) 数据的存储结构 算法中出现的数据最终将被存储于计算机中,就像在纸面上书写数据要考虑在什么位置 书写、一个数据占几格一样,在计算机中存储数据也要考虑将数据存储在内存中的哪个位置, 占用多大的存储空间。数据的存储结构提供了数据的逻辑结构在计算机存储器中的映像,根 据数据的存储结构将逻辑上相联系的数据元素存储在相应的存储单元中,也就是说,数据的 存储位置和读写方式体现了数据的逻辑结构。常见的存储映像方式如下: • 顺序方式 将逻辑上相邻的数据元素存储在物理上相邻的存储单元中,数据间的逻 辑关系通过存储单元的邻接关系体现。 • 链接方式 数据元素被作为节点的一部分存储在某个存储单元,节点的存储不要求 采用顺序方式。每个节点都含有指向逻辑上相邻的节点的指针,数据元素之间的逻 辑关系通过节点之间的指针链接体现。 • 索引方式 按照数据元素的序号建立索引表,索引表中第 i 项的值为第 i 个数据元 素的存储地址
Java程序设计大学教程 散列方式数据元素的存储地址与惟一标识该元素的关键字之间具有某种确定的 函数关系,这里的关键字通常为数据元素的某个或某些数据项。 上面4种方式可以混合使用,同一种数据在不同的算法和应用中也可以采用不同的存储 映像方式,从而形成不同的数据结构。 1.1.3 程序设计过程 程序是算法在计算机上的具体实现,实现算法时所采用的通常是高级程序设计语言,这 种语言的程序是不能直接在计算机上运行的,通常需经由计算机系统提供的高级语言编译 器,将其转换成计算机所能识别的机器语言后才能在计算机上运行。程序的设计过程包括 问题建模 算法设计 编写代码 编译调试 程序将以数据处理的方式解决客观世界中的问题,因此在程序设计之初,首先应该将实 际问题抽象成一个求解模型,然后为该模型设计和制定算法。通过问题建模,可以清楚地描 述各种概念、已知条件、所求结果,以及已知条件与所求结果之间的联系等各方面的信息 模型和算法的结合将给出问题的解决方案 具体的解决方案确定后,需要对所采用的算法进行描述,算法的初步描述可以采用自然 语言方式,然后逐步将其转化为程序流程图或其他直观方式。这些描述方式比较简单明确 能够比较明显地展示程序设计思想,是进行程序调试的重要参考。 使用计算机系统提供的某种程序设计语言,根据上述算法描述,将已设计好的算法表达 出来,使得非形式化的算法转变为形式化的由程序设计语言表达的算法,这个过程称为程序 编码。 大多数程序只是由少数几种步骤构成,这些步骤在整个程序中在不同的上下文和以不同 的组合方式多次重复。最常见的步骤是顺序、选择和循环这3种。 程序经常不止一次地使用特定的一系列步骤。这样的一系列步骤可以组合成一个子例 程,而子例程根据需要可在主程序的不同部分进行调用或访问。每次调用一个子例程,计算 机都会记住它自己在该调用发生时处在程序的那个位置,以便在运行完该子例程后还能够回 到那里。在每次调用之前,程序可以指定子例程使用不同的数据,从而做到一个通用性很强 的代码段只编写一次,而被以多种方式使用。 大多数程序使用几种不同的子例程。其中最常用的是函数、过程、库程序、系统程序以 及设备驱动程序。函数是一种短子例程,用来计算某个值,如角的计算,而该值计算机仅用 一条基本指令无法完成计算。过程执行的是复杂一些的功能,如给一组名称排序。库程序是 为许多不同的程序使用而编写的子例程。系统程序和库程序相似,但实际上用于操作系统 它们为应用程序提供某种服务,如打印一行文字。设备驱动程序是一种系统程序,它们加到 操作系统中,以使计算机能够与扫描仪、调制解调器或打印机等新设备进行通信。设备驱动 程序常常具有可以直接作为应用程序执行的特征。这样就使用户得以直接控制该设备。例如, 打印机驱动程序。 现在,程序设计者可以通过特殊的应用程序来设计新程序,这些应用程序常被称作开发 工具,如Java的开发工具 J Builder、Ⅴ Visual basic的开发工具 MS Visual studio等。实际上 程序员也可以直接使用最简单的文本编辑器(也是一种程序)来依据程序设计语言的语法规 则编写新程序。使用文本编辑器,程序员创建一个文本文件,这个文本文件是一个有序指令
Java 程序设计大学教程 7 • 散列方式 数据元素的存储地址与惟一标识该元素的关键字之间具有某种确定的 函数关系,这里的关键字通常为数据元素的某个或某些数据项。 上面 4 种方式可以混合使用,同一种数据在不同的算法和应用中也可以采用不同的存储 映像方式,从而形成不同的数据结构。 1.1.3 程序设计过程 程序是算法在计算机上的具体实现,实现算法时所采用的通常是高级程序设计语言,这 种语言的程序是不能直接在计算机上运行的,通常需经由计算机系统提供的高级语言编译 器,将其转换成计算机所能识别的机器语言后才能在计算机上运行。程序的设计过程包括: • 问题建模 • 算法设计 • 编写代码 • 编译调试 程序将以数据处理的方式解决客观世界中的问题,因此在程序设计之初,首先应该将实 际问题抽象成一个求解模型,然后为该模型设计和制定算法。通过问题建模,可以清楚地描 述各种概念、已知条件、所求结果,以及已知条件与所求结果之间的联系等各方面的信息。 模型和算法的结合将给出问题的解决方案。 具体的解决方案确定后,需要对所采用的算法进行描述,算法的初步描述可以采用自然 语言方式,然后逐步将其转化为程序流程图或其他直观方式。这些描述方式比较简单明确, 能够比较明显地展示程序设计思想,是进行程序调试的重要参考。 使用计算机系统提供的某种程序设计语言,根据上述算法描述,将已设计好的算法表达 出来,使得非形式化的算法转变为形式化的由程序设计语言表达的算法,这个过程称为程序 编码。 大多数程序只是由少数几种步骤构成,这些步骤在整个程序中在不同的上下文和以不同 的组合方式多次重复。最常见的步骤是顺序、选择和循环这 3 种。 程序经常不止一次地使用特定的一系列步骤。这样的一系列步骤可以组合成一个子例 程,而子例程根据需要可在主程序的不同部分进行调用或访问。每次调用一个子例程,计算 机都会记住它自己在该调用发生时处在程序的那个位置,以便在运行完该子例程后还能够回 到那里。在每次调用之前,程序可以指定子例程使用不同的数据,从而做到一个通用性很强 的代码段只编写一次,而被以多种方式使用。 大多数程序使用几种不同的子例程。其中最常用的是函数、过程、库程序、系统程序以 及设备驱动程序。函数是一种短子例程,用来计算某个值,如角的计算,而该值计算机仅用 一条基本指令无法完成计算。过程执行的是复杂一些的功能,如给一组名称排序。库程序是 为许多不同的程序使用而编写的子例程。系统程序和库程序相似,但实际上用于操作系统。 它们为应用程序提供某种服务,如打印一行文字。设备驱动程序是一种系统程序,它们加到 操作系统中,以使计算机能够与扫描仪、调制解调器或打印机等新设备进行通信。设备驱动 程序常常具有可以直接作为应用程序执行的特征。这样就使用户得以直接控制该设备。例如, 打印机驱动程序。 现在,程序设计者可以通过特殊的应用程序来设计新程序,这些应用程序常被称作开发 工具,如 Java 的开发工具 JBuilder、Visual Basic 的开发工具 MS Visual Studio 等。实际上, 程序员也可以直接使用最简单的文本编辑器(也是一种程序)来依据程序设计语言的语法规 则编写新程序。使用文本编辑器,程序员创建一个文本文件,这个文本文件是一个有序指令
Java程序设计大学教程 表,包含了程序员撰写的源代码,因此它也称为程序源文件。所谓源代码是指构成程序源文 件的那些指令。在这个时候,一种特殊的应用程序将源代码翻译成机器语言或目标代码一 即能够被操作系统执行的一种格式,真正的可执行程序 将源代码翻译成目标代码的应用程序有3种:编译器、解释器和汇编程序。这3种应用 程序在不同类型的程序设计语言上执行不同的操作,但是它们都起到将程序设计语言翻译成 机器语言的相同目的 通过编译器,可以将使用 FORTRAN、C和 Delphi等高级程序设计语言编写的文本文件 一次性从源代码翻译成目标代码。而 BASIC、LISP、Perl等解释执行的语言所采取的方式 则与此不同,在解释执行的语言中程序是通过解释器随着每条指令的执行而逐个语句地翻译 成目标代码的。解释执行的语言的优点是,它们可以立即开始执行程序,而不需要等到所有 的源代码都得到编译。对程序的更改也可以相当快地做出,而无需等到重新编译好整个程序 之后。解释执行的缺点是,它们执行起来要比事先编译好的程序慢,因为每次运行程序,都 必须对整个程序一次一条指令地翻译。另一方面,编译执行的语言只编译一次,因此计算机 执行起来要比解释执行的语言快得多。由于这个原因,编译执行的语言更常使用。 有意思的是,Java程序在转换过程中既有编译也有解释。即Java源程序先编译成Java 字节码( bytecode),创建为 class文件;然后再由不同平台上的Java虚拟机( Java virtual Machine,JVM)解释执行 微软的NET和JaⅦa编程系统都采用了一种称为虛拟机的机制来执行程 序。编译器将Java、C#等程序设计语言的源程序翻译成中间程序(微软称 为中间语言),然后计算机里的虛拟机将中间程序作为应用程序来执行。 友情提示 另一种翻译器是汇编程序,它用在以汇编语言编写的程序或程序组成部分。汇编语言也 是一种程序设计语言,但它比其他类型的高级语言更接近于机器语言。在汇编语言中,一条 语句通常可以翻译成机器语言的一条指令。今天,汇编语言很少用来编写整个程序,而是最 经常地采用于程序员需要直接控制计算机某个方面功能的场合。 程序经常按照其功能被划分成很多较小的程序段去编写,每段代表整个应用程序的某个 方面。各段独立编译之后,使用联接程序将所有编译好的程序段组合成一个可以执行的完整 程序。程序的编译和联接过程简称为联编,很多语言的开发工具还提供了自动联编功能。 即使是熟练的程序员,也很少能保证程序第一次就能够正确运行,所以程序设计时经常 需要使用调试程序来帮助査找程序错误,解决程序运行中存在的问题。调试程序能够在运行 的程序中检测到一个事件,并向程序员指出该事件在程序由哪条代码的触发 12 程序设计语言 在计算机科学中,程序设计语言是用来编写可被计算机运行的一系列指令(计算机程序) 的人工语言。与英语等自然语言相类似,程序设计语言具有词汇、语法和句法。然而,自然 语言不适合计算机编程,因为它们能引起歧义,也就是说它们的词汇和语法结构可以用多种 方式进行解释。用于计算程序设计的语言必须具有简单的逻辑结构,而且它们的语法、拼写 和标点符号的规则必须精确。 程序设计语言在复杂性和通用程度上大相径庭。有些程序设计语言是为了处理特定类型 的计算问题或为了用于特定型号的计算机系统而编写的。例如, FORTRAN和 COBOL等程 序设计语言是为解决某些普遍的编程问题类型而编写的—— FORTRAN为了科学领域的应 用,而 COBOL为了商业领域的应用。尽管这些语言旨在处理特定类型的计算机问题,但是
Java 程序设计大学教程 8 表,包含了程序员撰写的源代码,因此它也称为程序源文件。所谓源代码是指构成程序源文 件的那些指令。在这个时候,一种特殊的应用程序将源代码翻译成机器语言或目标代码—— 即能够被操作系统执行的一种格式,真正的可执行程序。 将源代码翻译成目标代码的应用程序有 3 种:编译器、解释器和汇编程序。这 3 种应用 程序在不同类型的程序设计语言上执行不同的操作,但是它们都起到将程序设计语言翻译成 机器语言的相同目的。 通过编译器,可以将使用 FORTRAN、C 和 Delphi 等高级程序设计语言编写的文本文件 一次性从源代码翻译成目标代码。而 BASIC、LISP、Perl 等解释执行的语言所采取的方式 则与此不同,在解释执行的语言中程序是通过解释器随着每条指令的执行而逐个语句地翻译 成目标代码的。解释执行的语言的优点是,它们可以立即开始执行程序,而不需要等到所有 的源代码都得到编译。对程序的更改也可以相当快地做出,而无需等到重新编译好整个程序 之后。解释执行的缺点是,它们执行起来要比事先编译好的程序慢,因为每次运行程序,都 必须对整个程序一次一条指令地翻译。另一方面,编译执行的语言只编译一次,因此计算机 执行起来要比解释执行的语言快得多。由于这个原因,编译执行的语言更常使用。 有意思的是,Java 程序在转换过程中既有编译也有解释。即 Java 源程序先编译成 Java 字节码(bytecode),创建为.class 文件;然后再由不同平台上的 Java 虚拟机(Java Virtual Machine,JVM)解释执行。 友情提示 微软的.NET和Java编程系统都采用了一种称为虚拟机的机制来执行程 序。编译器将 Java、C#等程序设计语言的源程序翻译成中间程序(微软称 之为中间语言),然后计算机里的虚拟机将中间程序作为应用程序来执行。 另一种翻译器是汇编程序,它用在以汇编语言编写的程序或程序组成部分。汇编语言也 是一种程序设计语言,但它比其他类型的高级语言更接近于机器语言。在汇编语言中,一条 语句通常可以翻译成机器语言的一条指令。今天,汇编语言很少用来编写整个程序,而是最 经常地采用于程序员需要直接控制计算机某个方面功能的场合。 程序经常按照其功能被划分成很多较小的程序段去编写,每段代表整个应用程序的某个 方面。各段独立编译之后,使用联接程序将所有编译好的程序段组合成一个可以执行的完整 程序。程序的编译和联接过程简称为联编,很多语言的开发工具还提供了自动联编功能。 即使是熟练的程序员,也很少能保证程序第一次就能够正确运行,所以程序设计时经常 需要使用调试程序来帮助查找程序错误,解决程序运行中存在的问题。调试程序能够在运行 的程序中检测到一个事件,并向程序员指出该事件在程序由哪条代码的触发。 1.2 程序设计语言 在计算机科学中,程序设计语言是用来编写可被计算机运行的一系列指令(计算机程序) 的人工语言。与英语等自然语言相类似,程序设计语言具有词汇、语法和句法。然而,自然 语言不适合计算机编程,因为它们能引起歧义,也就是说它们的词汇和语法结构可以用多种 方式进行解释。用于计算程序设计的语言必须具有简单的逻辑结构,而且它们的语法、拼写 和标点符号的规则必须精确。 程序设计语言在复杂性和通用程度上大相径庭。有些程序设计语言是为了处理特定类型 的计算问题或为了用于特定型号的计算机系统而编写的。例如,FORTRAN 和 COBOL 等程 序设计语言是为解决某些普遍的编程问题类型而编写的——FORTRAN 为了科学领域的应 用,而 COBOL 为了商业领域的应用。尽管这些语言旨在处理特定类型的计算机问题,但是