计算机程序与程序设计语言
学习目标
1.描述程序设计语言产生与发展的过程;
2.了解不同种类程序设计语言的特点。
学习内容
目前,我们已对计算机解决问题的基本过程和算法有了一定的了解。通过对本节的学习,我们将更深切体会计算机程序在解决问题过程中的重要作用。
计算机程序"
计算机程序是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。简而言之,计算机程序就是指计算机可以识别运行的指令集合。
常用的计算机主要包括运算器、控制器、存储器、输入设备和输出设备五大基本部件。计算机内部采用二进制形式表示和存储指令或数据,把解决问题的程序和需要加工处理的原始数据事先转换成二进制数,并存入存储器中。计算机的工作过程实际上是周而复始地获取指令、执行指令的过程。
计算机程序设计语言
在用计算机解决问题时,用自然语言、流程图或是伪代码所描述的解决问题的算法都不能被计算机直接执行,还必须将算法按照一定的规则编写成计算机能够识别和运行的程序。而人们编写程序时需要遵循的规则就是计算机语言规则。计算机程序设计语言,是指一组用来定义计算机程序的语法规则,通常简称为“编程语言”,它是一种被标准化的交流技巧,用于向计算机发出指令。正确地使用计算机程序设计语言,能让程序员准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应执行的命令。
计算机程序设计语言的发展,经历了从机器语言、汇编语言到高级语言的发展历程。
1.机器语言
目前,计算机采用的物理器件主要是电子元件,但由于电子元件的物理特性,计算机只能识别“”和“1”组成的二进制数。因此,二进制是计算机语言的基础。计算机发明之初,人们只能使用计算机的基础语言(下图)。因此,早期的程序设计语言是由“0”和“1”所表示的二进制代码指令组表示的。这样的语言是计算机能直接接收和执行的,通常被称为“机器语言”。机器语言是第一代计算机语言。
不同计算机的机器指令系统会有所不同,但每一条机器指令都包含两个主要部分:操作(指出计算机应做什么)和被操作的对象(指出处理的数据或它的地址)。在这些指令的控制下,计算机可以实现最基本的算术运算和逻辑运算。例如,下表是用Intel 80386完成"9+8”加法运算的机器指令。
早期人们与计算机的通信都是通过机器语言编写的程序完成的,程序中的所有语句都被分解成一系列由0和1组成的代码记录在穿孔带上,如下图所示。
这种机器语言所编写的程序难以被理解,程序设计任务也非常繁重,而且在程序出现错误需要修改时,效率更是低下。除此之外,由于每台计算机的指令系统往往各不相同,所以在一台计算机上执行的程序,如果想要在另一台计算机上执行,就必须另编程序,这就造成了重复工作。由此可见,机器语言与人类的自然语言之间存在着巨大的鸿沟。但由于使用的是针对特定型号计算机的语言,因此运算效率也是所有语言中最高的。
2.汇编语言
为了让使用机器语言编写的程序更容易被理解,人们使用了一种类似英文缩略词且带有助记性符号的语言,来替代一个特定的指令二进制串,每条指令都和一条机器指令相对应,只是指令码和操作数都采用符号形式,这种程序设计语言就被称为汇编语言,即第二代计算机语言。例如,指令码用“ADD”代表加法,用“MOV”代表数据传递等。这样一来,人们就会比较容易读懂并理解程序,纠错及维护也会变得更加方便了。例如,下表列出了用汇编语言来实现“9+8”加法运算的有关指令。
但是,计算机是不能直接认识这些符号的,计算机还需要一个专门的语言翻译器,负责将程序中的每条语句都翻译成用二进制数表示的机器语言(下图)。
汇编语言同样与特定的机器及特定的微处理器相关,这也导致了汇编语言的移植性不好。这一点与机器语言相比差异不大,然而汇编语言程序的效率仍然很高,针对计算机特定硬件向的汇编语言程序,能准确发挥计算机硬件的功和特长,其编写的程序不仅精练,质量高,而且易于理解,所以至今在一些领域仍是一种常用而强有力的软件开发工具。
3.高级语言
人们在使用机器语言和汇编语言这两种语言与计算机交流的过程中,依然存在很大的障碍,而且对于程序的理解和调试仍然十分困难。于是,高级语言应运而生。高级语言接近于数学语言和人的自然语言,并且不再过度地依赖某种特定的机器或环境。第一种高级语言是 Fortran语言,它主要用于科学和工程计算。在 Fortran语言之后,出现了许多高级语言,如ALGOL、COBOL、Basic、LISP、SNOBOL、Pascal、C、PROLOG、Ada、VC、VB、 Delphi、Java、 Python等。例如,在计算“9+8”的问题时,若使用高级语言 Python,则只需要语句“print(9+8)”就能完成,既简单又易于理解。
用高级语言编写的程序也不能直接被计算机所识别和执行,必须经过编译程序或解释程序将其翻译成机器语言(下图)。所谓编译程序是指计算机把高级语言程序的每一条语句都翻译成机器语言,并保存成二进制文件后才运行的程序。解释程序是指计算机在执行高级语言程序时,逐条语句解释成机器语言并立即执行的程序。
由于高级语言抽象度高,源代码无须与硬件、系统底层操作对应,所以移植性非常好,理想的情况下甚至不必为不同的系统平台或者机器改动源代码。
高级语言的出现为计算机的应用开辟了广阔的前景,它的发展也经历了从早期语言到结构化程序设计语言、从面向过程到非过程化程序设计语言的过程。所谓非过程化程序设计语言,就是面向应用。即只需要告诉程序要干什么,程序就能自动生成算法,自动进行处理,这是高级语言的下一个发展目标,将给人们解决问题带来更大的便利。
拓展
自动计算思想发展回顾
一般而言,计算与自动计算要解决以下四个问题:①数的表示;②数据的存储及自动存储;③计算规则表示;④计算规则的执行及自动执行。
算盘是一种计算工具,算盘上的珠子可以表示和存储数,计算规则是一套口诀,按照口诀拨动珠子可以进行四则运算。然而所有的操作都要靠人的大脑和手完成,因此算盘被认为是一种计算辅助工具,不能被归入自动计算工具范畴。
1642年,法国科学家帕斯卡发明了著名的帕斯卡机械计算机,首次确立了计算机器的概念。该机器用齿轮来表示和存储十进各数位上的数字,通过齿轮比来解决进位问题。低位上的齿轮每转动10圈,高位上的齿轮只转动1圈。机器可自动执行一些计算规则,“数”在计算过程中自动存储。帕斯卡机的意义是让人们认识到“用纯机械装置可代替人的思维和记忆”,开辟了自动计算的道路。下图所示是一台手摇计算器。
1674年,莱布尼茨提出了“二进制数"的概念。1847年,英国的数学家布尔发表著作《逻辑的数学分析》和《思维规律的研究——逻辑与概率的数学理论基础》,创立了一门全新的学科—布尔代数,为百年后出现的数字计算机的开关电路设计提供了重要的数学方法和理论基础。
1938年,香农发表了著名的论文《继电器和开关电路的符号分析》,首次用布尔代数进行开关电路分析,并证明布尔代数的逻辑运算可以通过继电器电路来实现,明确地给出了实现加、减、乘、除等运算的电子电路的设计方法。这篇论文成为开关电路理论的开端。
1936年,阿兰·图灵提出了抽象计算模型——"图灵机”。一切可计算的函数都可用图灵机计算,反之亦然。
1940年,“控制论之父”维纳提出了计算机五原则:①不是模拟式,而是数字式;②由电子元件构成,尽量减少机械部件;③采用二进制,而不是十进制;④内部存放计算表,计算控制规则;⑤在计算机内部存储数据。
1945年,美国宾夕法尼大学"莫尔小组”汲取前人美于计算机的结构、存储程序和二进制编码等研究思想,设计制造了世界上的一台早期计其机 ENIAC(下图)。 ENIAC是可编程的通用计算机,可以解决不同的问题。
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?