购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2 程序设计语言

在人类的交流中,语言的作用无可取代,要想交流通畅,有共同的语言是首要条件。例如,一个中国人想和一个英国人聊天,光靠比划手势是不行的。有两种方法可以选择,要么学习英语,要么找一个翻译。计算机程序设计同样如此,计算机是无生命、无知觉的机器,它不懂人类的语言,不管是汉语还是英语,计算机都不会接受。人类要想与计算机交流,让其完成特定的任务,就必须解决“语言”的问题。人类和计算机交流同样有两条路:要么学习机器语言,要么找一个“翻译”。机器语言是什么?“翻译”又是什么?下面将给出解答。

1.2.1 机器语言

计算机是一种电子设备,计算机处理的是数字信号。数字信号采用0和1记录信息,那么,计算机的语言——机器语言(Machine Language),自然也就是0和1序列。数字0和1称为二进制数据(Binary Digit),或者称为位(bit),这种由0和1组成的序列就称为二进制代码。

注意 二进制代码只能由0和1组成。

即便是完成相近的功能,不同的计算机的设计者也可能会采用不同的二进制代码集来表示程序指令。换句话说,不同的计算机使用的机器语言并不一定相同。不过可以肯定的是,现代计算机都是以二进制代码的形式存储和处理数据的。

在早期的开发工作中,程序都是用机器语言编写的,为了方便读者理解指令的过程,假定要执行下列操作:


1
+2
=?

计算机处理这个简单的运算要经过以下步骤。

1)将1载入累加器。

2)把1暂存到内存的某个地址ADDR1中。

3)将2载入累加器。

4)将内存ADDR1中的数据和累加器中的数据相加。

5)输出结果(一般是输出到内存的某个地址,如ADDR2中)。

假定在所使用的计算机中,装载操作(将数据载入累加器)用二进制代码00000001表示,加法运算用00000010表示,存储操作(对内存某个位置赋值)用00000011表示,ADDR1为1000,ADDR2为1001,如果用机器语言,需要编写如下的指令序列。


00000001  00000001       
(将1
载入累加器)
00000011  1000           
(把1
暂存到内存中地址为1000
的单元)
00000001  00000010       
(将2
载入累加器)
00000010  1000           
(将内存地址为1000
的单元中的数据和累加器中的数据相加)
00000011  1001           
(将运算结果输出到内存中地址为1001
的单元中)

可见,为了使用机器语言编写程序,程序员需要记住各种操作的二进制代码,还要记住所有数据在内存中的位置。这种编码方式难度很大,极易出错,编写程序的效率很低。

注意 现在程序员已经很少使用机器语言编写程序,而是采用下面介绍的汇编语言。

1.2.2 汇编语言

汇编语言(Assembly Language)的出现简化了程序员的工作,在汇编语言中,用便于记忆的方法定义程序指令。表1-1给出了汇编语言指令与机器语言指令的对应关系。

表1-1 汇编语言指令和对应的机器语言指令

使用汇编语言计算“1+2=?”,则上面的机器语言指令序列可以改写成如下内容。


LOAD   1
SAVE   ADDR1
LOAD   2
ADD    ADDR1
SAVE   ADDR2

与机器语言相比,使用汇编语言编程要容易很多,但是,计算机不能直接执行由汇编语言编写的程序,必须借助“翻译”将汇编语句序列转化为计算机可以理解的二进制序列,也就是说,汇编语言指令要转换成机器语言指令的形式,才能被计算机执行。这个“翻译”的执行者就是汇编语言编译器(Assembler)。

不同的计算机可能会采用不同的二进制代码集来表示程序指令,因此,汇编语言和汇编语言编译器也和所用的计算机密切相关。

1.2.3 高级语言

既然机器语言和汇编语言都是计算机可以理解的语言,用其就可以完全控制计算机的行为,那么,为什么人们还要创造并使用高级程序设计语言呢?因为机器语言和汇编语言都是低级语言,是面向机器的,与具体的计算机相关,学习起来困难,编程效率低,可读性、可维护性差。

例如,一个说普通话的北京人想要去欧洲旅行,可是,他不懂任何一门欧洲语言;恰好,一个说粤语的广东人也去欧洲旅行,而且他懂得德语、英语、法语、西班牙语等所有欧洲语言,于是,他们结伴同行。北京人想要同欧洲人交流,有两种方式:一是学习各种欧洲语言,然后直接同各个国家的人交流;二是让广东人当翻译,将自己的意思讲给欧洲人听,并将欧洲人的回答反馈给自己。如果您是那个北京人,您选择哪种方式?我想答案是确定的,肯定要请广东人当翻译。虽然普通话和粤语也有一定的差异,但是比起与欧洲语言的差异,这种差异小了很多。况且,如果直接同欧洲人交流,需要学习很多种语言。

高级语言和计算机的关系,与北京人的语言和欧洲人的关系相似。高级语言编写的程序借助于编译器就可以在特定的机器上运行,不同的欧洲人相当于不同的计算机,广东人相当于编译器,粤语相当于计算机高级语言。

高级语言的优点主要有以下两个。

·高级语言编写的程序是由一系列语句(或函数)组成的,每一条语句都对应着几条、几十条甚至上百条机器指令的序列。这样的一条语句,功能显然增强了,所以用其开发程序比用低级语言效率高得多。同时,由于高级语言的编写方式更接近人们的思维习惯,这样的程序易读,易懂,易于维护。

·用高级语言编写的程序具有一定的通用性。同样的一句话,广东人根据听众的不同将其翻译成德语、英语、法语等不同形式,达到交流和沟通的目的。高级语言的一条语句,经由不同的编译器加工编译后,生成针对特定的计算机的二进制代码。低级语言涉及计算机硬件细节,所以不具有通用性。要使高级语言编写的程序在某一台计算机上运行,只要该计算机提供该语言的翻译系统即可。

思考 既然高级语言有着低级语言无法比拟的优势,是不是可以完全放弃低级语言呢?

回答是否定的。原因如下。

首先,机器语言是最终操作计算机硬件的语言,任何高级语言程序想要在计算机上执行,必须翻译成机器指令,也就是编译成二进制代码的形式。

其次,虽然高级语言在执行速度比不上同样功能的低级语言,在对硬件的操作上也不如低级语言灵活,但是在如实时控制系统这样对程序速度要求高的情况下,或者编写某种新硬件的驱动程序时,仍然会用到低级语言(主要是汇编语言)。

同汇编语言类似,高级语言也需要专门的翻译程序(称为编译器或解释器),将其编译成机器语言后才能运行。

1.2.4 数据结构和算法

计算机程序规定了计算机要执行哪些动作及这些动作应当按什么顺序来执行,如同菜谱规定了厨师做菜的材料和步骤。一个程序主要有以下两个要素。

·数据结构。即数据的存储形式,程序用到的信息。

·算法。操作步骤,对操作的描述,程序用什么方法解决问题。

著名的计算机科学家Nikiklaus Wirth提出了一个公式:程序=数据结构+算法。

1.2.5 面向过程的程序设计(POP)

在20世纪60年代计算机发展的初期,计算机和编程是少数聪明人的玩具,程序员可以根据自己的喜好随心所欲地进行程序设计。大多数程序代码组织混乱,只有程序员本人可以看懂,被称为“意大利面条式编程”。随着计算机的发展和程序规模的不断扩大,大量的问题凸显出来:程序质量低下、进度缓慢、预算严重超支,这就是“软件危机”。为此,人们提出了结构化程序设计方法,探讨了面向过程编程的3种基本结构,即顺序、分支和循环。大大提高了程序的清晰度和可靠性,在一定程度上缓解了“软件危机”。

注意 顺序、分支和循环是现代程序设计语言的3大基本语法结构。

结构化程序设计方法建立在Bohm和Jacopini证明的结构定理的基础上。结构定理指出:任何程序逻辑都可以用顺序、选择和循环3种基本结构来表示,如图1-2所示。

图1-2 3种基本结构:顺序、分支和循环

尽管结构化程序设计技术具有这样和那样的优点,但它的局限性注定了这种程序设计方法适用于规模较小的软件;当软件规模大到一定程度时,这种程序设计方法就显现出稳定性低、可修改性和可重用性差的弊端。20世纪70年代末到80年代初,面向对象的程序设计方式的出现给人们带来了新的希望。

1.2.6 面向对象的程序设计(OOP)

面向对象的程序与结构化的程序不同,由C++编写的结构化的程序是由一个个的函数组成的,而由C++编写的面向对象的程序是由一个个的对象组成的,对象之间通过消息相互作用。

在结构化的程序设计中,我们要解决某一个问题,就是要确定这个问题能够分解为哪些函数,数据能够分解为哪些基本的类型,如int、double等。也就是说,思考方式是面向机器结构的,而不是面向问题结构的,需要在问题结构和机器结构之间建立联系。面向对象的程序设计方法的思考方式是面向问题的结构,它认为现实世界是由对象组成的。面向对象的程序设计方法解决某个问题,要确定这个问题是由哪些对象组成的,对象间的相互关系是什么。

纯粹的面向对象程序的设计方法如下。

·所有的东西都是对象。可以将对象想象成为一种新型变量,它保存着数据,而且还可以对自身数据进行操作。

·程序是一大堆对象的组合。通过消息传递,各对象知道自己应该做些什么。如果需要让对象做些事情,则须向该对象“发送一条消息”。具体来说,可以将消息想象成为一个调用请求,它调用的是从属于目标对象的一个方法。

·每个对象都有自己的存储空间,可容纳其他对象,或者说通过封装现有的对象,可以产生新型对象。因此,尽管对象的概念非常简单,但是经过封装以后却可以在程序中达到任意高的复杂程度。

·每个对象都属于某个类。根据语法,每个对象都是某个“类”的一个“实例”。一个类的最重要的特征就是“能将什么消息发给它”,也就是类本身有哪些操作。 tbeMuu1XvuoSm3UbL5k+UDjnp/x6ntMSayN3m86Ob8jqDwpFnO5GVBWophQNkBOw

点击中间区域
呼出菜单
上一章
目录
下一章
×