只是写给自己看的课堂笔记,边学边改,有错误及时指正,希望能画上一个圆满的问号(?)。
编译原理(一)
一、翻译、编译程序
翻译程序:把一种语言程序(源语言程序)等价的转化成另一种语言程序(目标语言程序)。
编译程序:把一种高级语言等价的转换成另一种低级语言的程序。
(解释程序:边解释边执行源程序。)
二、编译过程
1.词法分析:-->输入:源程序-->输出:单词符号
依循的原则:构词规则
描述工具:有限自动机
(有限自动机?:)
2.语法分析:-->-输入:单词符号-->输出:语法单位
依循的原则:语法规则
描述工具:上下文无关文法
(上下文无关文法?:)
3.中间代码生成:-->输入:语法单位-->输出:中间代码
依循的原则:语义规则
4.优化程序代码:-->输入:中间代码-->输出:优化后的中间代码
依循的原则:程序的等价变换规则
5.目标代码生成:-->-输入:优化后的中间代码-->输出:目标代码
目标代码的三种形式:
绝对指令代码:可直接运行
可重新定位指令代码:需要连接装配
汇编指令代码:需要进行汇编
三、程序结构
1.表格和表格管理
常见的表格:符号名表(编译中最重要),常数表,标号表,入口名表,过程引用表。
格式: 名字(name) | 信息(information)
2.出错处理
出错处理程序:发现错误并通知用户。
3.遍(pass)
遍:扫描源程序(从开头到结尾或从中间到结尾)
注意:并不是每种语言都能用单遍编译程序实现。
4.编译前端和后端
前段:与源语言有关但与目标机无关的部分(词法分析、语法分析、中间代码生成)。
后端;与目标机有关(优化,目标代码的产生)。
Java跨平台:为了实现编译程序可改变目标机,通常需要多支持的中间语言,类似Java的操作平台无关性:Java定义一种虚拟机代码:Bytecode,Java编译器将java源代码编译成字节码bytecode,平台无关性就是基于相同bytecode规范做出不同平台的虚拟机。