概述
编译:生成独立的可执行文件,直接运行,运行时无法控制源程序,效率高。
编译过程基本上划分为词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。
解释:不生成可执行文件,可以逐条解释执行,用于调试模式,可以控制源程序,执行速度慢,效率低。
程序设计语言组成:语法(一组规则)、语义(语法成分的含义)、语用(构成语言的各个记号和使用者之间的关系)
基本成分
数据成分:数据和数据类型。数据分为常量、变量、全局量(存储空间在静态数据区分配)、局部量(存储空间在堆栈区分配)。数据类型包括整型、字符型、双精度、单精度浮点型、布尔型等。
运算成分:运算符号及运算规则。包括算术运算、逻辑运算、关系运算、位运算等。
控制成分:语言允许表述的控制结构。包括顺序结构、选择结构、循环结构(初始化+循环体+循环条件)。
传输成分:数据传输方式。如赋值处理,数据的输入输出。
函数:C程序由一个或多个函数组成,main函数有且只有一个,是程序的起点。函数使用涉及函数定义、函数声明、函数调用。
传值调用:将实参传递给形参,形参的改变不改变实参的值。实参可以是合法的变量、常量、表达式或函数调用。
传址调用:引用调用,将实参的地址传给形参,相当于实参存储单元的地址引用,改变了形参相当于改了这个地址内的数据,相当于改变了实参。实参可以是合法的变量和表达式。
编译程序基本原理
编译程序的功能是把高级语言书写的源程序翻译成与之等价的目标程序(汇编语言或机器语言),分为六个阶段:
- 词法分析:从左到右一个字符一个字符的读入源程序,即构成源程序的字符流进行扫描然后根据构词规则识别单词。
- 语法分析:将单词序列组合成各类语法短语,如“程序”、“语句”、“表达式”等等,语法分析判断源程序在结构上是否正确。
- 语义分析:对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。如类型匹配、除法除数不为0等。又分为静态语义错误(在编译阶段可查找出来)和动态语义错误(在运行时发现)。
- 中间代码和目标代码生成:是根据语义分析产生的,需要经过优化链接,最终生成可执行的目标代码。引入中间代码的目的是进行与机器无关的代码优化处理。常用的中间代码有后缀式(逆波兰式)、三元式(三地址码)、四元式和树等形式。需要考虑三个问题:如何生成较短的目标代码;如何充分利用计算机中的寄存器,减少目标代码访问存储单元的次数;如何充分利用计算机指令系统的特点,提高代码质量。
文法定义
一个形式文法是一个有序四元组G=(V,T,S,P),其中:
V:非终结符,不是语言组成部分,不是最终结果,可理解为占位符。能够推导出其他元素。
T:终结符,是语言的组成部分,是最终结果。V∩T=∅。
S:起始符,是语言的开始符号。
P:产生式。用终结符替换非终结符的规则。形如α→β
语法分析方法
自上而下:最左推导,从左至右,如递归下降。
自下而上:最右推导,从右至左。