目录
1.程序设计语言的发展
低级语言 与机器相关的语言,比如机器语言和汇编语言 高级语言 与机器无关的语言,比如Java,C 1.1 机器语言
1.1.1 概念
计算机能够理解并且能够直接执行的程序设计语言。机器语言是用二进制代码书写的,计算机能够直接识别的机器指令的集合,CPU可以直接执行。
1.1.2 缺点
1.机器语言编程不直观容易出错。 2.对硬件依赖性大,不同的CPU能够执行的机器语言不同,可移植性差 3.用机器语言编程费时,乏味,开发难度大,程序员必须接受过训练,熟悉计算机硬件。 1.2 汇编语言
1.2.1 概念
将机器语言符号化,以助记符的形式表示指令和地址,这就是汇编语言。比如将2放到一个存储单元的汇编代码为“MOV X,2”。
1.2.2 汇编程序(汇编器)
汇编语言不能直接被计算机执行,必须被翻译为机器语言才能在计算机上执行。这就需要一个能够将汇编语言翻译为机器语言的程序,这个程序就叫汇编程序,又叫汇编器。
程序员只需要写出汇编代码,然后交给汇编器,就可以生成在计算机上可执行的机器语言程序。
1.2.3 优缺点
优点:
1.用汇编语言编写程序比用机器语言快,且更容易被理解。 2.汇编语言把人们从繁琐的二进制代码中解放出来了,可以利用计算机处理一些复杂的问题。 缺点:
1.汇编语言和机器语言是一一对应的,仍然依赖于机器,不宜阅读和理解,且程序设计的效率很低。 1.3 高级语言
1.3.1 概念
与机器无关的程序设计语言称为高级语言。
1.3.2 编译程序(编译器)
高级同样也不能直接在计算机上执行,必须一个程序将高级语言翻译为对应的低级语言(如汇编语言或机器语言),这个翻译程序就叫编译程序,又称为编译器。
1.3.3 高级语言翻译的两种方式
1.通过翻译程序 先翻译为汇编语言程序,再翻译为机器语言程序 2.通过解释程序 直接翻译为机器语言程序 1.3.4 优缺点
优点:
1.高级语言的出现缩短了人类思维和计算机语言之间的差距,编写高级语言类似于定义数学公式或书写自然语言,与机器无关。 2.高级语言编译程序的出现使人们更容易的使用计算机,编程时不必考虑与机器有关的繁琐细节,使得程序独立于计算机硬件。
2.翻译程序
2.1 概念
除了将高级语言翻译成低级语言外,有时还需要将同一种机器上的不同语言和不同种类机器上的相同或不同语言书写的程序之间都可能需要进行相互翻译,这种能够把一种语言(源语言)书写的程序(源程序),翻译成另一种语言(目标语言)书写的程序(目标程序)的程序统称为翻译程序。
2.2 转换程序
将一种高级语言程序翻译成另一种高级语言的程序成为转换程序。
2.3 解释程序(解释器)
能够将高级语言翻译为机器语言再执行,但是并不保存翻译结果。
2.4 反汇编程序
汇编程序将汇编语言程序翻译为机器语言程序,反汇编程序将机器语言程序逆向翻译为汇编语言程序。
2.5 交叉汇编程序
把一台计算机上的汇编语言程序翻译为另一种计算机上的机器语言程序
3.高级语言的运行方式
3.1 编译方式
利用编译程序将高级语言翻译为机器语言程序,然后再运行这个机器语言程序,如下图所示:
3.2 解释方式
利用解释程序直接读取高级语言程序中的每个语句,翻译并直接执行。
通过解释运行的方式,翻译和运行是交叉进行的。一边读取源程序语句,一边翻译,一边执行。如下图所示:
4.高级语言编译流程
高级语言编译流程大致分为四个阶段:预处理、编译、汇编和链接。
这里以C语言为案例:首先对C语言的源程序进行预处理,将其中的宏和预处理命令展开转换为标准的C语言程序,然后进行编译,生成汇编语言程序,再经过汇编程序汇编生成二进制代码,最后对目标代码进行连接,此时需要将相关的库函数和外部程序一起连接,生成可执行的机器代码。如下图所示:
4.1 预处理
4.2 编译
4.3 汇编
4.4 链接
4.4.1 链接器概述
将通用功能的公共代码提取出来打包成库文件,以便编程时不必再编写这部分代码,直接复用。在编写的程序中如果使用了一部分库文件中的代码,在最终生成的可执行代码时,还是需要将库文件那部分代码拼装进来,代码才能完整的运行。这就是链接器的功能。
4.4.2 静态链接
将公用库中的代码合并到可执行文件内部。使得可执行文件的体积变得庞大。如下如所示:
静态链接缺点:
1.导致可执行文件版本难以控制:如果库文件更新了,可执行文件得不到及时的更新。 2.如果有多个程序调用相同的公用库函数,在运行时这些公用库函数的代码在内存中将有多份拷贝,占用了多余的内存空间。 4.4.3 动态链接
动态链接不会把公用库内的代码合并到可执行文件内,而仅仅记录动态链接库的路径信息。它允许程序运行前才加载所需的动态链接库,如果该动态链接库已经加载到内存,则不需要重复加载。有些动态链接还允许将动态链接库的加载延迟到程序执行库函数调用的那一刻。这样不仅节约了磁盘和内存空间,还有利于可执行文件版本的更新。如下图所示:
动态链接库的缺点:
1.运行时加载会增加程序执行的时间开销。 2.如果动态链接库的版本错误可能会导致程序无法执行。
5.编译过程概述
通常编译程序的工作过程划分为四个阶段:词法分析、语法分析、语义分析和目标代码生成四个阶段。如果编译器支持优化,还需要中间代码生成和代码优化两个阶段。如下图所示:
下面以C语言为案例,进行各个阶段的编译过程:
#include<stdio.h> int main(){ int area,length=3,width=2; area = 5 + length * width + length * width; }
5.1 词法分析
5.1.2 词法分析任务
词法分析任务是:从左到右扫描输入的源程序,检查词法错误,识别出正确的单词,并输出单词的内部表示形式,称为单词记号。正确的单词记号包括高级语言中合法的标识符、关键字、常数以及运算符、逗号、分号等界符。
对源程序进行扫描,去掉其中的空白符号和注释;其次识别出程序中出现的各个单词;根据单词的类型,将单词转换为单词记号输出,如下如所示:
序号 类型 单词 内部表示 序号 类型 单词 内部表示 1 关键字 int $int 16 界符 ; ; 2 标识符 main id0 17 标识符 area d1 3 界符 ( ( 18 运算符 = = 4 界符 ) ) 19 常数 5 int1 5 界符 { { 20 运算符 + + 6 关键字 int $int 21 标识符 length id2 7 标识符 area id1 22 运算符 * * 8 界符 , , 23 标识符 width id3 9 标识符 length id2 24 运算符 + + 10 界符 = = 25 标识符 length id2 11 常量 3 int2 26 运算符 * * 12 界符 , , 27 标识符 width id3 13 标识符 width id3 28 界符 ; ; 14 界符 = = 29 界符 } } 15 常量 2 int3 5.2 语法分析
5.2.1 语法分析任务
语法分析是在词法分析的基础上将单词组成各类语法单位,如表达式、语句、程序等。通过分析确定整个输入串是否具有语法上的正确的程序结构,如果不是,则给出语法错误,并尽可能的继续检查。
5.2.2 语法分析规则
语法分析依据语法的语法规则进行分析,把单词记号按层次分组,以形成语法单位。语言的语法规则通常由递归规则来定义。如赋值语句和表达式的语法定义规则如下所示:
1.标识符 = 表达式 2.任何标识符是表达式 3.任何常数是表达式 4.若表达式1和表达式2都是表达式,则表达式 + 表达式2、表达式1 * 表达式2都是表达式,即表达式的运算也是表达式。 5.3 语义分析
5.4 目标代码生成
5.5 中间代码生成
5.6 代码优化