计算概论 第五讲 程序设计语言和编程环境 北京大学 信息科学技术学院 2017年3月5日
主要内容 程序设计语言概述 机器语言 汇编语言 高级语言及其程序的执行 若干典型的高级语言介绍 VC6.0编程环境 2017/3/5 北京大学
计算机硬件组成 1、程序设计语言概述 2017/3/5 北京大学
1、程序设计语言概述 计算机指令的执行及程序 程序是由若干条指令的顺序排列组成,是为信息处理任务而预先编制的工作执行方案。 2017/3/5 北京大学
1、程序设计语言概述 程序设计语言 软件的基本组成部分是完成其功能的程序。 程序描述了计算机处理数据、解决问题的过程,这是程序的实质。 计算概论 程序设计语言 软件的基本组成部分是完成其功能的程序。 程序描述了计算机处理数据、解决问题的过程,这是程序的实质。 程序的描述形式却可以是多种多样的,可以用不同的方式表述,这就是程序设计语言。 程序设计语言(也被称为“编程语言”,Programming Language)是人们描述(编制)程序所使用的规范和方法(语言)。 机器语言、汇编语言、高级语言 1、程序设计语言概述 2017/3/5 北京大学
机器指令采用二进制代码形式,它们符合具体计算机的指令系统,可以由计算机直接执行。因此机器指令实际上也是一种可以在程序设计中使用的语言,被称为“机器语言”。 每一条机器指令包括两个主要方面: 操作(指出计算机应做什么) 被操作的对象(指出处理的数据或它的地址) 下面给出了几条以二进制形式描述的 Intel 80386 指令以及对它们的文字解释。 2、机器语言 2017/3/5 北京大学
01000000 把一个寄存器(EAX)的值加1 10001011 00000101 00000000 01111001 10001111 10101101 从某个内存单元取出数据,装入EAX寄存器 2、机器语言 2017/3/5 北京大学
2、机器语言 从直接阅读的角度看,二进制代码简直是密码,难以理解和使用。因此也必然造成程序不易修改,无法由一种计算机环境移植到其他环境上。 10101011 10100101 01000100 01011001 10011110 10111101 10011011 01000101 00100000 11111001 10100111 01101101 10100011 10000101 10000001 01111101 10001101 10101101 01001111 10100101 01001010 01111011 10011011 10100111 …… 用机器语言编程,不仅指令操作需要用规定的二进制代码描述,程序里的数据也要程序设计者自己安排存储位置。这使程序设计工作更加烦杂和容易出错。要检查和发现程序中的错误也是极端困难的。这一系列因素使得用程序开发工作的效率非常低,据统计,一个人一天平均只能够写出几条有效指令。 2、机器语言 2017/3/5 北京大学
从人的思维方式而言,更适合于用概念描述事物,对于烦琐冗长的数字编码,由于它们不能与概念和概念之间的语义联系产生任何提示作用,则显然对设计思维没有任何帮助作用,纯粹是一种累赘。 人们显然更希望用有帮助记忆作用的符号来书写程序,例如用 “ADD” 表示“加法”操作,用“ JMP” 表示“控制性转移”等。操作的对象(数据或数据的地址)最好也能用符号形式表示,例如用 X、Y代表两个存储数据的容器。显然这样做比直接采用二进码方便得多。这就是“汇编程序设计语言”的基本想法。 3、汇编语言 2017/3/5 北京大学
3、汇编语言 汇编语言提供一组具有帮助记忆作用的“汇编指令”,每条汇编指令都和一条机器指令相对应,只是指令码和操作数都采用符号形式。 … … … … PUSH ECX MOV ERROR, 0 MOV ECX, EAX CMP ECX, 0 JMP FAIL CALL FACT 3、汇编语言 2017/3/5 北京大学
3、汇编语言 对于这种汇编语言形式写出的程序,计算机是不能直接执行的,必须在交给计算机执行之前先把它翻译成二进制的机器语言指令程序。 把汇编语言程序翻译到机器语言的工作比较机械,可以用计算机来完成这个翻译工作。“汇编器”(Assembler)软件就是具有这种功能的软件,它能把用汇编语言书写的程序翻译成机器语言程序。 3、汇编语言 2017/3/5 北京大学
3、汇编语言 在这里,我们又看到了“程序”和“数据”两个概念的相对性: 对汇编器而言,它的输入“数据”是汇编语言程序,这种程序当作数据(是一系列的字符行)被加工处理。 汇编器产生的结果是机器代码程序(具有二进符号串的形式),同时它也是即将在计算机上运行的真正的程序。 3、汇编语言 2017/3/5 北京大学
3、汇编语言 从程序开发的角度来看,汇编语言与机器语言类似,仍然有许多缺点: 汇编语言的描述机制层次太低,其基本描述单位仍然是指令,这种方式与人们描述计算过程的需要之间差距太大。 汇编语言与计算机硬件的具体结构、指令系统联系过于紧密,这种情况造成的后果是在一种计算机上开发的程序极难搬到另一种不同结构的计算机上使用。如果想这样做,不仅工作量将非常大(与重写差不多),而且很容易引出程序错误,修改也非常困难。 3、汇编语言 2017/3/5 北京大学
3、汇编语言 样例程序1 计算表达式:135 + 22 - 1 常用寄存器 AX, BX, CX 等可以用来保存中间结果; 计算过程: MOV AX, 135 MOV BX, 22 ADD AX, BX SUB AX, 1 HLT 3、汇编语言 2017/3/5 北京大学
3、汇编语言 样例程序2 计算从1累加到100得到的和 AX保存累加和,BX存放被加数,每加完一次增加1。通过一个循环来完成累加工作。 计算过程: MOV AX, 1 MOV BX, 2 calc: CMP BX, 101 JE stop ADD AX, BX INC BX JMP calc stop: HLT 3、汇编语言 2017/3/5 北京大学
3、汇编语言 样例程序3 求一组数33,15,21,7,9,23,4,76,87,45中的最大值. 总的思想是用一个存储单元保存到目前为止的最大值,将10个数逐一取出与最大值比较,如果该数比当前最大值更大,则将更新当前最大值. 3、汇编语言 2017/3/5 北京大学
3、汇编语言 数组变量DATA存储给定的十个整数; BX记录当前计算的是第几个数,0-9; CX记录数组中当前没有被计算过的数,初值为10,每计算一个数,它的值减1,当它为0时,停止计算(循环计数); AX是16位寄存器,可以分成两个8位寄存器AH和AL使用,每次总是将一个数复制到AL中去. 3、汇编语言 2017/3/5 北京大学
3、汇编语言 MOV AL, 0 MOV BX, 0 MOV CX, 10 next: CMP DATA[BX], AL 计算概论 MOV AL, 0 MOV BX, 0 MOV CX, 10 next: CMP DATA[BX], AL JL unchanged MOV AL, DATA[BX] unchanged: INC BX LOOP next //CX减1 HLT DATA DB 33,15,21,7,9,23,4,76,87,45 3、汇编语言 2017/3/5 北京大学
高级语言在对计算过程的描述方面,完全脱离了简单的指令方式,采用类似于数学公式的书写方式描述由一些数据计算出结果的过程,用一些更高级程序流程描述结构取代简单的跳转指令方式,以更好地满足书写程序的需要。 在高级程序语言中也使用“变量”这个概念,在这里“变量”代表一种容器,用于存放程序中处理的数据。变量对应着存储器的若干字节(存储单元),但它们在存储器中的具体位置并不需要编程人员关心,这样就大大减轻了编程人员的负担。 4、高级语言及其程序的执行 2017/3/5 北京大学
高级语言中的变量采用字符串形式的名字,如 x、len、Max、Number 等。一方面名字可以帮助人们掌握变量所代表的信息含义,在程序里只要用变量的名字就可以读写访问它的存储单元里的数据。定义确定了变量的大小。 x len Max Number 4、高级语言及其程序的执行 2017/3/5 北京大学
4、高级语言及其程序的执行 高级语言中用于描述计算的结构采用类似于数学中代数运算公式的形式,这种结构被称为“表达式”。 程序中基本的动作单位被称为“语句”,不同的语句实现不同的功能。高级语言里最基本语句就是“赋值语句”(Assignment Statement),这种语句描述把通过计算得到的结果(值)赋给变量的动作。举例说: X = 100; Y = 2 * SIN(1.047); Z = X * Y; 4、高级语言及其程序的执行 2017/3/5 北京大学
用高级语言书写的程序不可能直接在计算机上执行,与汇编语言程序一样,需要将它转换成机器语言指令程序。在计算机上将高级语言书写的程序转换成机器语言指令程序,有两种基本方法: 编译(Compilation)方式 解释(Interpretation)方式 4、高级语言及其程序的执行 2017/3/5 北京大学
编译方式是设法把高级语言程序(也称为“源程序”)翻译转换成为可以由计算机直接执行的机器语言指令程序,经连接装配后转变为“可执行程序”(Executable Program)。 人们实现了高级语言“编译器”(Compiler)完成这种翻译工作。编译器把高级语言程序看成是符合一定语法结构的符号串,对它进行加工变换。 4、高级语言及其程序的执行 2017/3/5 北京大学
4、高级语言及其程序的执行 编译器对源程序的加工一般分为两个阶段: 源程序首先被翻译成机器语言,这种翻译结果称为“目标码”(object code),目标码构成的程序片段称为目标模块。 第二步,这些目标模块被与其他一些基本模块(通用目标程序模块,由编译软件或其他人提供)连接在一起,最终形成“可执行程序”(executable program),这样的程序就可以在计算机上实际运行了。 第一个加工步骤称为“编译”(compiling),第二个步骤称为“连接”(linking)。 4、高级语言及其程序的执行 2017/3/5 北京大学
解释(Interpretation)方式由一种称为“解释器”(Interpreter)软件实现。解释器在工作方式上与编译器不同,它不事先对源程序进行翻译,而是在执行时即时对源程序的语句进行分析和解释,实现源程序所描述的功能。 可执行的机器语言指令 4、高级语言及其程序的执行 2017/3/5 北京大学
5、若干典型的高级语言的介绍 第一个高级程序语言是 FORTRAN 语言,它是由美国 IBM 公司的科技人员在五十年代开发出来的。 高级语言的开发成功是软件技术发展的一个重要里程碑。从那以后,人们设计并实现了许多高级程序语言。 高级语言不但是程序开发的工具,也成为一种在人与人之间,在不同的计算机之间交流的工具。为了保证语言的通用性,国际标准化组织动用很多人力物力,对应用较广泛的一些语言提出了标准语言文本。这些工作进一步打通了交流渠道,推动了计算机应用的发展。 FORTRAN、PASCAL、C / C++ COBOL、BASIC、ADA、JAVA 5、若干典型的高级语言的介绍 2017/3/5 北京大学
5.1、FORTRAN FORTRAN 的名字是由英文 FORmular TRANslation 缩写而成,意思是“公式翻译”。 2017/3/5 北京大学
5.1、FORTRAN 程序样例 FUNCTION FUNC1(N) ISUM = 0 DO 10 I=1, N 计算概论 求1~N的平方和 FUNCTION FUNC1(N) ISUM = 0 DO 10 I=1, N ISUM = ISUM + I*I 10 CONTINUE FUNC1 = ISUM RETURN END 循环到10处结束; 5.1、FORTRAN 程序样例 2017/3/5 北京大学
Pascal 语言是由著名瑞士计算机科学家 N Pascal 语言是由著名瑞士计算机科学家 N. Wirth (1984年图灵奖得主)设计的一种语言,1968 年提出后被全世界广泛接受,成为一种对计算机科学技术发展有巨大影响的语言。 这个语言的名字是为了纪念历史上著名的数学家和计算学科的先驱 Blaise Pascal(帕斯卡)。 Pascal 语言把许多好的东西结合在一个很简练的语言里,被计算机教育界广泛采用。从七十年代末往后的很长一段时间里,Pascal 成为世界范围的计算机专业教学语言,多数教科书用 Pascal 给出程序例子,描述计算的算法。 5.2、PASCAL 2017/3/5 北京大学
5.2、PASCAL 程序样例 求1~N的平方和 function func1(N : integer) : integer; var SUM, I : integer; begin SUM = 0; for I := 1 to N do SUM := SUM + I * I; FUNC1 := SUM; end 5.2、PASCAL 程序样例 2017/3/5 北京大学
C 是由美国贝尔实验室的 Dennis Retchie 在 1972 年设计开发的,开发目的是想成为一种编制“系统程序”的工具语言。 Retchie 等人首先用自己发明的 C 语言编写了 UNIX 操作系统。以后 C 语言逐步发展成为开发系统软件的主要语言。 许多常见的软件系统,例如,在中国使用很广泛的计算机辅助设计软件 AUTOCAD,数学软件系统 Mathematica 等,以及许多语言编译系统本身,其软件系统的全部或者部分程序就是用 C 语言开发的。 C 语言已成为最重要的软件系统开发语言,由此可见 C 语言在计算机领域地位之重要。 5.3、C语言 2017/3/5 北京大学
5.3、C语言 样例程序 求1~N的平方和 int main ( ) { int n; int i, sum = 0; scanf(“%d”, &n); for (i = 1; i <= n; i++) sum += i*i; return sum; } 5.3、C语言 样例程序 2017/3/5 北京大学
C++ 是在 C 语言基础上发展出的一种“面向对象”语言。它是由 Bjarne Stroustrup 在美国贝尔实验室开发的(1983)。 C++ 是 C 语言的一个扩充,它一方面修正了 C 的一些弱点和不足,使用起来更方便可靠;另一方面,也是更重要的,这种语言以支持“面向对象”(Object-Oreinted,简称为OO)的程序设计方法为基本目标,提供了一套支持面向对象程序设计的机制,如“类”(class)、“对象”(object)等等。 面向对象的方法被认为是开发复杂软件系统的一种有效途径, OO 程序设计语言也已经被广泛接受。C++ 是目前使用最广泛的一种面向对象的程序设计语言。 5.4、C++语言 2017/3/5 北京大学
COBOL(COmmon Business Oriented Language,通用事务处理语言)语言是在美国国防部推动下,由政府机构和工业界联合开发的一种语言,1960 年正式推出。 数据记录(DATA RECORD)的概念是在COBOL语言中第一次引入的。 COBOL语言曾经使用非常广泛, 七十年代曾有人统计过,当时程序语言使用的情况是:将近一半的程序(以字符数计算)是用 COBOL 语言书写的。但目前的情况是 COBOL 语言已经走向衰败。 5.5、COBOL 2017/3/5 北京大学
BASIC (Beginner‘s All-purpose Symbolic Instruction Code,初学者的通用符号指令代码)语言可能仍然是世界上使用人数最多的语言。 这个语言是由 John Kemeny 和 Thomas Kurtz 于 1964 年开发的,基本上是 FORTRAN 语言的一个缩减版本。设计者当时希望开发一个简单的交互式语言,用于学习程序设计。 由于语言简单,BASIC 语言可以在很低档的微机上实现,因此得到广泛普及,流行到世界的每个角落。可以说,无论国内还是国外,BASIC 语言对于计算机的普及都发挥了重要的作用。 5.6、BASIC 2017/3/5 北京大学
Ada 这个名字是纪念历史上第一位编程者——Ada 夫人(生活在十九世纪中叶,是著名诗人拜伦的女儿),她被认为是第一个写程序的人,她曾经为计算机先驱者 Charles Babbage 未完成的计算机写程序。 Ada 语言开发的目的是作为新一代的美国军用程序设计语言(1983-1995),作为所有与国防有关的程序和软件的统一语言标准。 Ada的设计目标是针对那些装备在机电设备上和武器装备里的计算机控制、管理软件系统开发所使用的。这类系统现在被称为“嵌入式计算机系统”,是计算机的一个重要应用方面。Ada 语言的设计也特别注意对复杂的大型和巨型软件系统的支持。 Ada语言自 1983 年作为标准提出后,虽由美国国防部大力推行,也受到各国军方的重视,但不像预想的那样成功,其中一个原因是它太复杂。 5.7、ADA 2017/3/5 北京大学
求1~N的平方和 FUNCTION func1 (n : IN INTEGER) RETURN INTEGER IS sum : INTEGER = 0; i : INTEGER; BEGIN FOR i IN 1..n loop sum := sum + i * i; end loop; return sum; END; 5.7、ADA 样例程序 2017/3/5 北京大学
1991年,SUN MicroSystem公司的Jame Gosling、Bill Joe等人为在电视、控制烤箱等家用消费类电子产品上进行交互式操作而开发了一个名为Oak的软件,1995年正式推出并更名为Java。 Write once, run everywhere. 目前网络程序开发的主要语言 特点 面向对象 便于网络开发 简单易学 5.8、JAVA 2017/3/5 北京大学
5.8、JAVA 样例程序 public int func1(int n) { int sum = 0; int i; for(i=1;i<=n;i++) sum = sum +i*i; return sum; } 5.8、JAVA 样例程序 2017/3/5 北京大学
我们这门课程主要介绍C语言。 2017/3/5 北京大学
基本概念 基本功能 编程及调试过程 示例 6、VC6.0编程环境 2017/3/5 北京大学
Project(工程):VC编程环境下,编写程序的工作是以Project为单位。在开始一个新程序时,要先建立一个Project,之后在程序编写过程中所有与这个程序有关的文件都会包含在这个Project中。 编制的程序可以有各种不同类型,编程环境为每种类型的程序准备了一个模版,用来生成程序的最初框架。在我们这门课程里只介绍编写Win32 Console Application类型的程序。 这类程序的特点是:程序运行中会打开一个类似于DOS操作系统的界面,所有键盘输入都是通过DOS界面进行的,而所有输出都是输出到DOS窗口中。 VC++编程环境 - 基本概念 2017/3/5 北京大学
VC++编程环境 - 基本概念 Source File(源程序) 2017/3/5 北京大学
VC++编程环境 - 基本概念 Compile(编译) 把源程序变成机器目标代码的过程称为编译。不同的高级语言有不同的编译器。 2017/3/5 北京大学
VC++编程环境 - 基本概念 Link(连接) 各种高级语言都会提供一些常用的功能模块,我们自己编写的程序里会调用这些功能模块。同时要把我们写的程序装载到内存里运行,也需要加载一定的与环境相关的信息。所以将我们自己写的程序编译成机器代码后,还需要一个连接的过程以生成最后的可执行程序。 VC++编程环境 - 基本概念 2017/3/5 北京大学
VC++编程环境 - 基本概念 Build(编译并连接) 编译并连接是把源程序编译,如果没有错误则连接,否则给出编译错误信息。 2017/3/5 北京大学
VC++编程环境 - 基本概念 Debug(调试) 当程序出错时,可用调试工具发现错处的代码,进行改正。 所谓调试是指逐条执行或部分执行程序代码,并在执行过程中查看变量的值。当发现变量的值并非如我们预期或程序的执行逻辑并非我们预期时,就发现了错误,可以进行有针对性的改正。 VC++编程环境 - 基本概念 2017/3/5 北京大学
Run(运行) 启动一个可执行程序使其开始执行称为运行。 VC++编程环境 - 基本概念 2017/3/5 北京大学
创建新工程 编辑源程序 编译 / 连接 运行 调试 VC++编程环境 – 基本功能 2017/3/5 北京大学
VC++编程环境 - 创建新工程 2017/3/5 北京大学
VC++编程环境 - 创建新工程 2017/3/5 北京大学
VC++编程环境 - 创建新工程 2017/3/5 北京大学
VC++编程环境 - 创建新工程 2017/3/5 北京大学
VC++编程环境 – 编辑源程序 2017/3/5 北京大学
VC++编程环境 – 编译/连接 2017/3/5 北京大学
VC++编程环境 – 运行 2017/3/5 北京大学
VC++编程环境 – 调试 2017/3/5 北京大学
VC++编程环境 – 调试 2017/3/5 北京大学
计算概论 计算两个整数a和b的和. 不需要知道a和b具体存在内存什么地方。 程序示例 1 2017/3/5 北京大学
求10个数的平均值 程序示例 2 2017/3/5 北京大学
房地产问题 弗雷德先生想在路易斯安娜州买一块地造房子。在调查中他了解到由于密西西比河的侵蚀,路易斯安娜州正在以每年50平方英里的速度变小。因为弗雷德先生希望在他的新房子里生活直至终老,所以他想知道他的房子是否会被侵蚀掉。 经过进一步研究,弗雷德发现将要被侵蚀的陆地呈半圆形。半圆是一个以(0,0)点为中心的圆的一半,半圆的直边是X轴。X轴以下的部分在水中。在第一年的开始,圆的面积是0。 问题是如果给定一点的X,Y坐标(Y>=0),要求出在第几年年末,这个点将被侵蚀。例如:给定X,Y坐标为(1.0,1.0),则输出:第1年年末。 x, y x y 程序示例 3 2017/3/5 北京大学
房地产问题 x, y x y 程序示例 3 2017/3/5 北京大学
启动VC 创建新工程 编辑源代码 编译链接 运行:输入/输出 编程及调试过程 2017/3/5 北京大学
上机练习(第1次上机) 学习安装VC6.0 (课后,有条件的同学) 使用 VC6.0编程环境,进行编程。 完成编程网格练习 输入并运行程序示例1、2、3。 上机练习(第1次上机) 2017/3/5 北京大学
小结 程序设计语言概述 不同的程序设计语言 机器语言 汇编语言 高级语言(Fortran、C、C++、Java,…) VC6.0编程环境 2017/3/5 北京大学