编译(第1章:编译程序概论)_第1页
编译(第1章:编译程序概论)_第2页
编译(第1章:编译程序概论)_第3页
编译(第1章:编译程序概论)_第4页
编译(第1章:编译程序概论)_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1第1章编译程序概论§1.1什么是编译程序语言低级高级:FORTRAN,PASCAL,C,C++等机器语言汇编语言翻译机器语言程序汇编程序Assembler编译程序Compiler源程序SourceProgram目标程序ObjectProgram汇编语言程序高级语言程序Translator2§1.1什么是编译程序编译程序:把源程序翻译(转换)成等价的目标程序的程序

其转换过程可图示如下:编译程序高级语言程序(源程序)低级语言程序(目标程序)黑盒子说明:除编译程序自身外,多数编译系统还需要一些其他的辅助程序来帮助完成其最终的翻译(转换)工作。

3§1.1什么是编译程序(典型)高级语言程序的处理过程:需预处理的源程序预处理程序

编译程序

源程序目标汇编语言程序

汇编程序可再装配的机器代码

编辑(装配/连接)程序绝对机器代码可再装配目标文件objexe函数子程序4§1.1什么是编译程序例:C语言需预处理的源程序

/*文件名:example.c*/#include"stdio.h"#defineCHARACTERcharmain(){CHARACTERch;ch=getchar();putchar(ch);}5§1.1什么是编译程序经预处理程序“CPP.EXE”处理后得如下源程序DOS命令为:cppexample.c

结果文件名:example.Iexample.c1:main()example.c2:{example.c3:charch;example.c4:ch=((--(((&_streams[0]))->level)>=0)?(unsignedchar)(++((&_streams[0]))->curp)[-1]:_fgetc((&_streams[0])));example.c5:((++(((&_streams[1]))->level)<0)?(unsignedchar)((++((&_streams[1]))->curp)[-1]=((ch))): _fputc(((ch)),(&_streams[1])));example.c6:}6§1.1什么是编译程序可再装配的obj文件:----------------------……

调用sin子程序

……

调用printf子程序

……

-----------Sin()Cos()…Scanf()Printf()…函数子程序库装配/连接程序Sin字程序装配Printf子程序装配连接连接7§1.2编译过程和编译程序的结构概述一、编译过程概述

典型编译程序工作过程:源程序词法分析语法分析语义分析代码优化目标程序中间代码生成目标代码生成8§1.2编译过程和编译程序的结构概述--编译过程概述词法分析主要任务:扫描源程序的ASCII码序列,识别出一个个单词(也称单词符号或(语法)符号)。具体任务:1.拼单词:组合分解源程序中的字符,得到符合语言词法规则的单词。例如某源程序片断如下:

beginvarsum,first,count:real;sum:=first+count*10end.词法分析将其视为字符(ASCII码)序列:begin,varsumt*10•end组合分解成单词符号序列:*10end•beginvarsum,firstcount92.翻译单词:将单词加工成含有特征/属性的机内表示(机内符)例如:上述源程序片断的词法分析的结果为如下二元组序列:

1.保留字begin2.保留字var3.标识符sum4.逗号,

5.标识符first6.逗号,

7.标识符count8.冒号:

9.保留字real10.分号;

11.标识符sum12.赋值号:=13.标识符first14.加号+15.标识符count16.乘号*

17.整数1018.保留字end19.界符·§1.2编译过程和编译程序的结构概述--编译过程概述103.词法检查:检查词法错误(主要是检查单词中使用了非法字符错误)例如:beg#n@nd~^10$等等

4.删除空白符、注释等

语法分析任务:1.对单词(机内符)序列进行分析,组合分解出各类语法单位(语法短语)例如:用id代表标识符,则有:

11.标识符sum12.赋值号:=表达式

13.标识符first14.加号+id1:=id2+id3*1015.标识符count16.乘号*赋值语句

17.整数10§1.2编译过程和编译程序的结构概述--编译过程概述112.检查形式语法错误

例如:Y=A+B;//PASCAL赋值语句其赋值号应为:=Y:=IF*Y;//PASCAL中用保留字作为标识符来使用

a=b++c;//C中两个子表达式之间没有运算符

if=x+y;//C中条件语句出错

(x+y))*z;//C中括号不配对等等说明:关于书中在这里引进的有关语言的“递归规则定义”和“语法树”相关知识,我们暂不讨论。§1.2编译过程和编译程序的结构概述--编译过程概述12

语义分析任务:检查(静态)语义错误,提取语义信息。其中:语义错误分为静态和动态两种.

静态语义错误:在编译期间可以检查的语义错误例如:int*px,*py,i;

…px+py…;//两个运算对象类型不相容

…a[i]…;//a没有声明

gotoloop;//loop没有定义等等(即独立的观察一条语句看不出的错误)

动态语义错误:在目标程序运行时才可以检查的语义错误。例如:sqrt(x)//当x为负数时

1/x//当x为0时

fopen(pf,”r”)//文件如果不存在语义信息包括:标识符的“种类”、“类型”等信息§1.2编译过程和编译程序的结构概述--编译过程概述13

中间代码生成中间代码:介于源程序和目标程序之间的一种结构简单、含义明确的记号系统。如:逆波兰式、三元式、四元式、树形结构表示等例如:源程序(赋值语句)sum:=first+count*10所对应的四元式序列如下:

(inttoreal,10,_,t1)(*,id3,t1,t2)(+,id2,t2,t3)(:=,t3,_,id1)源程序中间代码目标程序目的:方便加工,便于优化。设计原则:容易生成,容易将其翻译成目标代码§1.2编译过程和编译程序的结构概述14§1.2编译过程和编译程序的结构概述--编译过程概述

中间代码优化:为得到高质量的目标代码而进行的变换工作任务:把原中间代码转换成可产生高质量(省时间和省空间)目标代码的中间代码。例如:

(inttoreal,10,_,t1)(*,id3,t1,t2)(*,id3,10.0,t1)(+,id2,t2,t3)(+,id2,t1,id1)(:=,t3,_,id1)优化优化方式局部优化全局优化优化种类常表达式的优化公共子表达式的优化循环优化消减运算强度15

目标代码生成任务:把中间代码或语义分析的结果转换成目标代码程序目标代码的三种形式:1.绝对指令代码:具有绝对地址的机器指令代码,无需连接即可运行。2.可重定位的指令代码:具有浮动地址的机器指令代码,需连接装配后方能运行。3.汇编指令代码:汇编语言形式的目标程序,需经汇编程序汇编产生相应的机器代码。MOVFid3R2MULF#10.0R2MOVFid2R1ADDFR1R2MOVR1id1(*,id3,10.0,t1)(+,id2,t1,id1)生成例如:使用两个寄存器R1、R2,则可有:§1.2编译过程和编译程序的结构概述--编译过程概述16二、编译程序的结构表格管理程序出错处理程序

源程序词法分析程序语法分析程序语义分析程序代码优化程序

目标程序中间代码生成程序目标代码生成程序§1.2编译过程和编译程序的结构概述17三、编译阶段的组合其组合具体实现上可从以下两个角度来考虑1.前端(frontend)和后端(backend)与目标机无关的工作前端词法分析语法分析语义分析中间代码生成中间代码优化后端:只与目标机有关的工作,即目标代码中间代码优点:便于移植(在不同机器或不同语言之间使用)其中:前端可用于在不同机器开发相同语言的编译程序后端可用于在同一台机器上开发不同语言的编译程序§1.2编译过程和编译程序的结构概述--编译程序的结构18一遍扫描的优点:编译的速度快多遍扫描的优点:算法清晰,便于分工,便于优化设:COMP编译程序则有:2.分遍(或趟):是指对源程序或对其等价的中间语言程序从头至尾扫视并完成规定任务的过程(此过程称为扫描)。编译程序按扫描遍数分为:一遍扫描多遍扫描§1.2编译过程和编译程序的结构概述--编译程序的结构19

语法分析程序COMP

词法分析程序

语义分析及代码生成程序取单词送单词语法结构返回源程序目标程序一遍扫描的编译程序的工作流程:/*语法分析为合心*/§1.2编译过程和编译程序的结构概述--编译程序的结构20COMPCOMPnCOMP3COMP2COMP1L0L1L2L3Ln-1Ln源程序中间语言程序目标程序多遍扫描的编译程序的工作流程:§1.2编译过程和编译程序的结构概述--编译程序的结构21§1.3解释程序和一些软件工具源程序初始数据解释程序计算结果一、解释程序

•解释程序(Interpreter):其工作方式是边翻译边执行,其加工的结果是源程序的运行结果。解释程序工作方式:22编译程序和解释程序的不同工作模式对比:§1.3解释程序和一些软件工具—解释程序解释程序编译程序……b:=2;a:=b+2;writea;……MOV#2.0R1MOVR1bMOVbR2ADDR1R2MOVR1a直接将4的值输出(显示)23编译程序和解释程序的不同存储区及内容对比编译阶段和运行阶段存储区内容:§1.3解释程序和一些软件工具—解释程序源程序缓冲区名字表目标代码缓冲区编译程序用中间表示及各种表格目标代码区数据区解释系统源程序工作单元及名字表标号表缓冲区(输入输出)栈区

解释程序的存储区内容:运行时编译时2410PRINT“X,Y=?”20INPUTX,Y30IFX<YTHEN6040LETZ=Y-X50GOTO7060LETZ=X-Y70PRINT“Z=“,Z80ENDBASIC语言程序直接解释源程序工作过程:PrintInputAssig子程序n子程序3子程序2子程序1主程序…§1.3解释程序和一些软件工具—解释程序25编译+解释其工作过程:§1.3解释程序和一些软件工具—解释程序Java源程序(.java)Java编译程序JavaBYTECODES(.class)JavaBYTECODES(来自本地的或经由网络的)编译环境类装载器BYTECODES验证器Java类库解释程序即时编译程序硬件Java虚拟机运行环境(Java平台)261.语言的结构化编辑器(或称智能化编辑器)即编辑器具有检查简单语法错误的功能如:括弧配对检查,关键字组合检查等2.语言程序的调试工具调试(或称纠错):是在测试发现错误之后排错的过程如:debug等3.程序格式化工具格式化:使在编辑窗口中输入的源程序具有一定的清晰可读的结构形式加以显示。如:关键字显示采用非黑色(如:蓝色);注释可以用一种专门的字体或颜色显示;语句的嵌套层次结构可用缩排方式表示。等等二、处理源程序的软件工具§1.3解释程序和一些软件工具274.语言程序测试工具静态分析器基于源程序(不运行其目标程序)进行分析,以发现程序中潜在的错误或异常等。其目的是,检查编译程序的语法分析发现不了的错误。如:检查变量定值与引用的关系;多余的源代码等。动态测试器基于源程序(运行其目标程序)进行分析,以发现程序中存在的逻辑错误等。其目的是,检查编译程序的语法分析和语义分析均发现不了的错误。其中包括:白盒测试(测试路径);黑盒测试(测试结果)§1.3解释程序和一些软件工具—处理源程序的软件工具285.程序理解工具该工具对程序进行分析,确定模块间的调用关系,记录程序数据的静态属性和结构属性,并画出控制流程图,帮助用户理解程序。6.高级语言之间的转换工具如:Pascal<---->CC、Pascal、FORTRAN---->x语言(如Ada语言)目的:解决旧语言程序在新机器新语言编译环境下重用问题。说明:上述转换目前仅限于结构间的转化,而语义间的转换还是待研究、解决的问题。注意:汇编语言程序到高级语言程序的转换不属于该范畴之问题,而是反编译问题。它也是待研究和解决的问题。§1.3解释程序和一些软件工具--处理源程序的软件工具29§1.4程序设计语言范型1.强制(命令)式语言—过

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论