编译程序和解释程序
解释程序
- 不生成独立的目标程序
- 解释程序和源程序参与程序的运行过程中
编译程序
- 将源程序翻译成独立保存的目标程序,机器上运行的是目标程序
- 源程序和编译程序都不参与目标程序的运行过程
程序的三种基本控制结构:顺序、选择、循环(重复)
传值调用与传引用调用
传值调用:
将实参的值传递给形参,实参可以是变量、常量和表达式。
不可以实现形参和实参间双向传递数据的效果
传引用(地址)调用:
将实参的地址传递给形参,形参必须有地址,实参不能是常量(值),表达式。
可以实现形参和实参间双向传递数据的效果,即改变形参的值同时也改变了实参的值。
符号表
符号表的作用是记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效地查找、插入、修改和删除等操作
编译程序基本原理
编译方式:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成
解释方式:词法分析、语法分析、语义分析
不可省略且顺序不可交换
编译器方式的中间代码生成和代码优化不是必要,可省略,即可以直接到目标代码生成
词法分析
输入:源程序;输出:记号流
分析构成程序的字符及由字符按照构造规则构成的符号是否符合程序语言的规定
正规式
|:或 ,* :0次或者多次
有限自动机
- 词法分析的一个工具,它能正确地识别正规集
- 确定的有限自动机(DFA):对每一个状态来说识别字符后只有一个转移状态
- 不确定的有限自动机(NFA):对每一个状态来说识别字符后有一个以上的转移状态
语法分析
输入:记号流;输出:语法树(分析树)
语法分析阶段可以发现程序中的所有语法错误
对各条语句的结构进行合法性分析;分析程序中的句子结构是否正确
语义分析
输入:语法树(分析树)
进行类型分析和检查
语义分析阶段不能发现程序中所有的语义错误
可以发现静态语义错误不能发现动态语义错误,动态语义错误运行时才能发现
目标代码生成
目标代码生成阶段的工作与具体的机器密切相关
寄存器的分配工作处于目标代码生成阶段
中间代码
常见的中间代码有:后缀式、三地址码、三元式、四元式和树(图)等形式。
- 中间代码与具体的机器无关有利于进行与机器无关的优化处理
- 可以将不同的高级程序语言翻译成同一种中间代码
- 中间代码可以跨平台
- 因为与具体的机器无关,使用中间代码有利于进行与机器无关的优化处理和提高编译程序的可移植性
上下文无关文法
大多数程序设计语言地语法规则用上下文无关文法描述
考点:根据文法推导结果
中缀、后缀表达式
?:+-x/ 优先级1.() 2、X / 3、+ 一
中缀式:a ? b
后缀式(逆波兰式):ab?
后缀式利用栈进行求值
语法树的后缀式为后序遍历、中缀式为中序遍历