1、2018/10/14,编译原理与技术讲义,1,编译原理与技术,2018/10/14,编译原理与技术讲义,2,第一章 引论,什么是编译程序?翻译程序、解释程序和汇编程序编译程序的组成结构编译程序的生成相关话题,2018/10/14,编译原理与技术讲义,3,语言翻译过程,算法描述,求某整数n的阶乘fact(n), n0 1 / n = 0 fact(n) = n * fact( n-1 ) / n! = n * (n-1)!伪语言描述fact(n) = if n 0 then 1 else n*fact(n-1),2018/10/14,编译原理与技术讲义,4,语言翻译过程,高级程序设计语言描述,(
2、如C语言)int fact( int n )if (n 记号流,position = initial + rate * 60 字符流,scanner,id1 = id2 + id3 * 60 记号流,标识符 赋值运算符 标识符 加运算符 标识符 乘运算符 整型常量,2018/10/14,编译原理与技术讲义,16,编译程序的组成结构,语法分析阶段parser记号流 分析树(语法树),id1 = id2 + id3 * 60 记号流,parser,=,id1,id2,+,*,id3,60,语法树,2018/10/14,编译原理与技术讲义,17,编译程序的组成结构,语义分析语义树带有语义信息的分析树
3、(语法树),id1,id2,+,*,id3,60,=,int float,进行类型转换,2018/10/14,编译原理与技术讲义,18,编译程序的组成结构,中间代码生成形式多样 三地址码,p-code等t1 := int_to_float( 60 )t2 := id3 * t1t3 := id2 + t2id1 := t3,2018/10/14,编译原理与技术讲义,19,编译程序的组成结构,代码优化得到“优化”后的中间代码;也可以在最后的代码生成阶段实施“优化”t1 := rate * 60.0 / 直接用浮点数60.0position := initial + t1 / 去除多余的/ 临时变
4、量较优化前,减少2条中间代码,2018/10/14,编译原理与技术讲义,20,编译程序的组成结构,代码生成与目标机器有密切联系,如指令选择,寄存器的使用等。movf rate, R1mulf #60.0, R1movf initial, R2addf R2, R1movf R1, position,2018/10/14,编译原理与技术讲义,21,编译程序的组成结构,符号表管理,编译程序中使用的符号表,2018/10/14,编译原理与技术讲义,22,编译程序的组成结构,出错处理程序错误分类出错处理的目标与方法1) if ( n = 0 return 1; / missing “)”2) if (
5、 n = 0 ) return 1 / missing “;” else return ( n * fact(n-1) );,2018/10/14,编译原理与技术讲义,23,编译程序的组成结构,semantics,parser,scanner,optimizer,code generator,符号表管理,出错处理,2018/10/14,编译原理与技术讲义,24,编译程序生成,手工编写耗时,“效率”问题。自动生成 各个阶段基本上有相应的自动生成工具,如 lex、yacc。自展(bootstrapping),2018/10/14,编译原理与技术讲义,25,编译程序生成,编译程序的自展/自编译T型图
6、,源语言S,目标语言T,编译程序的实现语言I,2018/10/14,编译原理与技术讲义,26,编译程序生成,编译程序的自展/自编译 我们的目标是在机器A(目标语言)上,用语言A(实现语言)构造高级语言L(源语言)的编译程序。,2018/10/14,编译原理与技术讲义,27,编译程序生成,编译程序的自展/自编译 Step1: 我们可以考虑源语言L的子集语言S, S L。在机器A(目标语言)上,用语言A(实现语言)构造语言S的编译程序。,2018/10/14,编译原理与技术讲义,28,编译程序生成,编译程序的自展/自编译 Step2: 在机器A(目标语言)上,用语言S(实现语言)构造语言L的编译程
7、序。,2018/10/14,编译原理与技术讲义,29,编译程序生成,编译程序的自展/自编译 Step3:,2018/10/14,编译原理与技术讲义,30,编译程序生成,编译程序的移植/交叉编译考虑将A机器上语言L的编译实现移植到机器B上,即我们的目标是:,2018/10/14,编译原理与技术讲义,31,编译程序生成,编译程序的移植/交叉编译我们已有的编译程序是:,2018/10/14,编译原理与技术讲义,32,编译程序生成,编译程序的移植/交叉编译Step1:,用语言L编写的语言L到语言B的编译程序,借助已有的A机器上语言L的编译程序,得到机器A上(实现语言)语言L到语言B的编译程序,2018
8、/10/14,编译原理与技术讲义,33,编译程序生成,编译程序的移植/交叉编译Step2:,用语言L编写的语言L到语言B的编译程序,新的A机器上语言L到语言B的编译程序,得到机器B上(实现语言)语言L到语言B的编译程序,2018/10/14,编译原理与技术讲义,34,编译程序相关的软件,预处理程序preprocessor宏替换macro包含文件展开include files汇编程序assembler两趟扫描解释程序interpreter连接程序linker装入程序loader重定位,2018/10/14,编译原理与技术讲义,35,编译程序相关的软件,调试程序debuggercc 编译器中 g 选项;与-O的关系描述程序profiler性能分析,