编译原理-第二节(东南大学廖力老师)
附:bilibili视频链接 https://www.bilibili.com/video/BV1cW411B7DW?p=38
一.语义分析和中间代码生成
***任务**
对语法分析出的各类语法范畴,分析其含义,进行和初步翻译,产生介于源代码和目标代码之间的一种代码
***分为两阶段工作**
-对每种语法范畴进行静态语义检查
-若语义正确就进行中间代码的翻译
***中间代码形式**
-四元式、三元式、逆波兰式
二.优化
***任务**
对前面产生的中间代码,进行加工变换,以期在最后阶段能够产生更为高效的目标代码。
***原则**
等价变换
***主要方面**
公共子表达式的提取、合并已知量、删除无用语句、循环优化等
三.目标代码生成
***任务**
把经过优化的中间代码转换成特定机器上的低级语言代码
***目标代码形成**
-绝对指令代码:可立即执行的目标代码
-汇编指令代码:汇编语言程序,需要通过汇编程序汇编后才能执行
-可重定位指令代码:先将各目标模块连接起来。确定变量数、常数在主存中的位置,
装入主存后才能成为可以执行的绝对指令代码
四.表格与表格管理
***表格的作用**
-用来记录源程序的各种信息及编译过程中的各种状况
***与编译前三阶段有关的表格有**
-符号表、常数表、标号表、分程序入口表、中间代码表
1)符号表
用来登记源程序中的变量名、常量名、数组名、过程名等,记录他们的性质定义和引用情况
2) 常数表与标号表
3)入口名表
作用:登记过程的层号,分程序符号表入口等
4)中间代码表
五.出错处理
***任务**
如果源程序有错误,编译程序应设法发现错误,并报告给用户。
***完成**
由专门的出错程序完成
***错误类型**
-语法错误:在词法分析和语法分析阶段检测出来
-语义错误:一般在语义分析阶段检测
六.遍
遍:指对源程序或者源程序的中间结果从头到尾扫描一遍,并做有关的加工处理,生成新的中间结果或者目标代码。
(注:遍与阶段的含义毫无关系)
一遍扫描:
多遍扫描:
-优点:节省内存空间,提高目标代码质量,使编译的逻辑结构清晰。
-缺点:编译时间较长
-注:在内存许可的情况下,还是遍数尽可能少些为好
1.3编译程序生成
*直接用机器语言编写编译程序
*用汇编语言编写编译程序(注:编译程序核心部分常用汇编语言编写)
*用高级语言编写编译程序(注:这是普遍采用的方法)
*自编译
*编译工具
-LEX(词法分析器)与YACC(用于自动产生LALR分析表)
*移植
同种语言的编译程序在不同类型的机器之间移植
1.4编译程序构造
*在某机器上为某种语言构造编译程序要掌握以下三个方面
-源语言
-目标语言
-编译方法
第二章 编译基础知识
一、高级语言
程序语言是一个记号系统
-语法
-语义
二、语法
-任何语言程序都可以看成是一定字符集(字母表)上的字符串
-语法使得这串字符形成一个形式上正确的程序
-语法=词法规则+语法规则