高级语言程序设计及应用第1-1页第一章程序设计语言概论1.1程序设计语言的历史在计算机科学与技术学科中,程序设计语言是每一位希望步入这信息科学最主要基础学科光辉殿堂的学生所要首先遇到的课程之一。伴随着计算机的产生和发展,程序设计语言也历经约半个世纪的沧桑岁月。自从1957年FORTRAN语言问世以来,人类已经创造了数以百计的各种各样的程序设计语言,它们又被称为笼统的称为计算机语言或者高级语言。在这些程序设计语言中,有些昙花一现,有些流传至今。如:FORTRAN、COBOL、BASIC、PASCAL、C、ADA、C++、JAVA、ML等至今仍然被人们用于科学计算、商业服务、教学研究、网络应用等各个领域。了解什么是程序设计语言,了解程序设计语言的各个发展阶段以及这些阶段又有那些代表性的程序设计语言,了解这些特定的程序设计语言的产生、发展历史和演变状况,这些对于学习程序设计语言来讲是非常必要的。1.1.1程序设计语言严格说来,计算机语言包括机器语言、汇编语言和高级语言这三类语言。如果不涉及汇编语言,程序设计语言往往就是指高级语言。从某种意义上将,计算机语言从机器语言发展到汇编语言,标志着人类与计算机首次有了基于符号的共同语言。即这种语言(汇编语言)是人类(借助助记符)和计算机(借助汇编程序)都能够理解的语言。它也是人类将符号引入程序设计的开始。由于汇编语言与机器的指令系统直接相关,不同指令系统的计算机有着不同的汇编语言。因此,在汇编语言中数据类型和数据结构具有典型的面向机器的特点。如:用DB、DW、DD等分别定义字节、字和双字,用标号来定义符号地址。汇编语言缺乏类似数学语言那样面向问题的数据类型,使得编程者要具备比较好的计算机硬件基础才能进行汇编语言程序设计,这无疑限制了计算机的广泛使用和发展。高级语言从产生之日起,就将面向问题的数据类型的概念引入程序设计,通过将数据分类成为字符型、整型、浮点型等不同的类型,来刻画、描述不同类型数据。从某种意义上将,从汇编语言到高级语言的发展过程,是人类在程序设计方面从面向机器的数据类型向面向问题的数据类型、或从没有面向问题的数据类型向有面向问题的数据类型的一次飞跃。而高级语言产生、发展、演变,各种各样高级语言的兴起,实质上就是高级语言数据类型的不断完善、不断扩充、不断复杂多样,以及对客观实体描述能力不断增强的一个过程。机器语言是机器指令的集合。而机器指令指计算机的CPU能够识别并处理的二进制代码。由这些二进制代码组成的二进制代码串称为机器程序。以把立即数5传送到累加器的操作为例:在以80X86为CPU的计算机中的二进制代码是:B80005。在以Z80为CPU的计算机中的二进制代码是:3E05汇编语言是一种使用助记符的语言。助记符是一些缩写的英文单词,这些缩写的英文单词都有特定的操作含义。如:MOV或LD表示传送、ADD表示乘法运算等。因此,汇编语言是一种面向机器的计算机语言。用汇编语言编写的程序称为汇编语言程序或源程序。将汇编语言程序翻译成机器语言程序(也称为目标程序)的程序称为汇编程序。仍以把立即数5传送到累加器的操作为例:在以80X86为CPU的计算机中的汇编语言程序是:MOVAX,5。而在以Z80为CPU的计算机中的汇编语言程序是:LDA,5。如果认为高级语言就是我们所要讨论的程序设计语言。那么,什么是程序设计语言?正如将物体向不同平面投影可以得到不同的平面图形一样,不同的人从不同的角度对程序设计语言有不同的理解。计算机的使用者认为程序设计语言是操纵计算机的工具;程序员则认为高级语言程序设计及应用第1-2页它是程序员之间的相互通信和交流的方法;喜欢数学和算法的人则认为它是算法的符号表示。按照RaviSethi的观点,一门通用的程序设计语言应该是能够为各种各样的用户都能提供服务的语言。尽管对程序设计语言的理解和定义多种多样,但是按照一般比较流行的观点,可以认为:程序设计语言是由一些符号所构成,这些符号被用于定义、组织、并完成各种各样的计算任务。人类所使用的语言称为自然语言。它是以语音为物质外壳、以词汇为建筑材料、以语法为结构规律而构成的体系。与此类似,程序设计语言是以具有特定语义的符号为基本构成单位、以语法为程序构成规律、专门用于定义、组织、并完成各种各样的计算任务而形成的体系。什么是程序?什么是程序设计呢?程序是用程序设计语言表示的计算机解题算法或计算机解题任务。程序设计是将解题任务转变成程序的过程。NellDale等人则指出:程序就是要求计算机执行的指令序列。程序设计就是如何计划、安排计算机必须遵循的操作步骤顺序的过程。在程序设计中,往往涉及到数据、变量、对象、值、数据类型等名词。这些名词是程序设计的基础概念。数据数据是客观事物的符号表示。在计算机学科中,数据是指所有能够输入到计算机内、被计算机处理,以及计算机处理结果输出的那些符号的总称。在科学计算方面,数据往往指的是整数和实数。在字处理程序、编译程序和解释程序中,数据又往往是字符串。在多媒体处理程序中,数据则往往是语音、图象的编码表示。变量在微型计算机、小型计算机及以上的各类计算机中,内存是以字节为单位线性编址的。在访问内存单元的时候,要获得内存单元的地址,然后才能访问该地址内存单元的内容。在程序设计语言中仿照了数学中的方法,引入了变量的概念。变量有名字和值。变量名是内存单元地址的有名表示,或者说是内存单元地址的符号表示。也就是说,通过变量名可以访问对应的内存单元。变量名所标识的内存单元中存放的内容则代表该变量的值。通过向变量赋值,可以改变变量名所标识的内存单元中的内容。对象广义上讲,对象是指一切可以被感知和触摸的客观实体。按程序设计的观点,对象则是变量概念的进一步推广和延伸。关于对象这个名词本章后面还将进行深入的解释。值从硬件系统的观点看,值实际上指的是计算机内存中存储的内容。不同类型的值在内存中占用的字节数是不同的。在字长为16位的计算机中,一个字符型数据占1个字节,一个整型值的数据占2个字节,一个浮点型数据占4字节。在字长为32位的计算机中,一个字符型数据仍占1个字节,一个浮点型数据也仍占4字节,但一个整型值的数据占4个字节。因此,在程序中必须通过说明变量或对象的类型,来决定其值占用的字节数。从程序设计的角度看,值是变量或对象的内容,是表达式的运算结果。数据类型数据类型是程序设计语言用来定义和描述其操作对象特性的一种方法。它由一个值集和定义在该值集之上,用于创建、操纵该类型对象的操作集组成。数据类型的值集说明该种类型的变量或对象的取值范围;数据类型的操作集则说明了对该种类型的变量或对象可以施行那样一些操作和运算。同时,数据类型也为编译器在对程序进行编译时如何为各种类型的变量或对象分配存储提供了依据,也为硬件系统如何使用这些变量或对象提供了操作方法。1.1.2如何学习和使用程序设计语言作为初学者,如何学会、掌握一门乃至多门程序设计语言?如何用所学的程序设计语言去解决实际工作中的应用问题呢?如果不考虑应用问题涉及的一些具体数据结构以及相应算法,则主要涉及到三个方面的学习和训练。首先,要学习并理解所学程序设计语言的语法高级语言程序设计及应用第1-3页和语义;其次,要学习并熟悉与该程序设计语言对应的集成开发环境(IntegratedDevelopmentEnvironment简称IDE);第三,要熟悉与该程序设计语言相关的库函数(如:C提供的各种各样的标准库函数)或类库(如:MicrosoftVisualC++提供的类库MFC)。1.理解程序设计语言的语法和语义理解程序设计语言的语法和语义是学习程序设计语言的的第一步。语法和语义原本都是数理逻辑名词。语义指的是形式系统中的符号、公式、公理、定理等的解释和意义。语法指的是对于形式系统的描述和研究中,对涉及公式的形式结构和定理的形式证明。在程序设计语言中,语义指的是构成该语言的各种符号的含义。由于程序是由程序设计语言的符号所组成,因此只有准确理解各种符号的语义,才有可能合适的使用各种符号来表达自己的编程思想。另一方面,程序设计语言的语法规定了语言符号集中各种符号的接合方式,规定了各种表达式、语句、过程、函数、乃至程序结构等的构造规则。因此,只有理解和掌握程序设计语言的语法,才有可能正确的用各种符号去构造程序的各种成分,并进而构成满足算法要求、能解决实际应用问题的程序。总之,程序不是符号的随意堆砌,而是各种符号根据其语义按一定的语法规律的有机构成。所以,只有理解和掌握了程序设计语言的语法和语义,才有可能正确的进行程序设计,才有可能读懂别人编写的程序。正如不同的专业和不同的层次的学生,在学习数学分析中的极限内容的时候,对学习-语言的要求不同一样,在学习程序设计语言过程中,对程序设计语言的语法和语义的掌握程度根据初学者的专业和学习目标,也有不同程度的要求。对于仅仅要求学会使用程序设计语言的人而言,对语法和语义的掌握只要做到知其然,也就是能用即可。即做到能够正确的进行程序设计,能够读懂程序即可。对那些不仅希望知其然,还希望知其所以然的读者,尤其是对于计算机专业的学生而言,则不仅要会用,而且还要学会语言的形式化描述,学会分析语法成分的合理性,类型的抽象性等等。因为,对他们而言,不仅要学习和掌握程序设计语言,而且要为有朝一日设计和创造新的程序设计语言奠定坚实的语言基础。2.熟悉集成开发环境早期的编程者都是在行编辑程序(如:EDLIN)或者全屏幕编辑程序(如:WORDSTAR、SEE等)下编辑创建源程序,也称为源文件(如:.c程序)。然后以命令行方式对源程序进行编译,产生对应的目标程序(如:.obj文件)。由于目标程序地址的浮动性,它还需要经过链接程序Link进行链接,生成对应的可执行程序(如:.exe文件)。最后将可执行程序投入运行以得到运行结果。时至今日,几乎所有的程序设计语言都有自己的集成开发环境。集成开发环境将源程序的创建、编辑,以及其后的编译、链接,乃至程序的调试与跟踪全部都集成与一体。为编程者提供了方便的程序开发环境。因此,编程者要能够进行程序的设计和开发,调试与跟踪,就必须学会使用相应的集成开发环境。集成开发环境一般都是GUI界面,以菜单和图标的方式提供各种操作功能。如:在VC的集成开发环境下,有File,Edit,Run等菜单板,每个菜单板下又有不同的菜单项。如File下又有New,Open,Save等菜单项。编程者只有学会使用集成开发环境提供的这些功能,才能进行程序的设计与开发。3.熟悉库函数或类库对于多数程序设计语言,其编译系统(或者解释系统)一般都会提供一些标准的库函数。如输入/输出的标准函数、字符串处理的标准函数、数学计算的标准函数等。编程者只要知道这些标准函数的功能、调用方式、返回何种结果,并且能够在自己的程序中调用这些标准函数就行了。完全没有必要自己去编写这些函数。对于面向对象的程序设计语言,其编译系统一般都会提供一些标准的类库。在这些类库中,封装了各种各样的数据成员和成员函数。编程者只要了解这些数据成员的含义,以及这高级语言程序设计及应用第1-4页些成员函数的功能,函数原型,就可以通过继承的方式使用这些现成的数据和函数。1.1.3程序设计语言的发展过程总的来讲,程序设计语言的发展过程可以划分为三个阶段。即:从1951年到1955年,汇编语言的产生和发展阶段;从1956年到1985年,面向过程的程序设计语言,即面向过程的高级语言的产生和发展阶段;从1985年至迄今,面向对象的程序设计语言的产生和发展阶段。1.汇编语言的产生和发展为了摆脱机器语言编程的困难,上世纪50年代初期,基于助记符的程序设计语言-汇编语言问世。程序员可以通过诸如:MOV、ADD、SUB等以缩写英文单词为助记符方式来表示传送、加、减等操作。直到1956年FORTRAN问世以前,汇编语言是惟一的一种程序设计语言。在这个阶段,建立了程序设计中子程序、以及早期数据结构方面的基础概念。2.面向过程的程序设计语言的产生和发展从1956年到1984年近30年间,面向过程的程序设计语言取得了巨大发展,它