编译原理引言知识点总结

1. 从面向机器的语言到面向人类的语言

1.1面向机器

  1. 机器语言:由0、1字符串组成的机器指令序列。
  2. 汇编语言:用符号表示的指令被称为汇编指令,汇编指令的集合被称为汇编语言。

1.2面向人类

  1. 通用程序设计语言:FORTRAN、Pascal、C/C++、Java、Ada等
  2. 数据查询语言:SQL
  3. 形式化描述语言:核心部分是基于数学基础的产生式。
  4. 其他面向特定应用领域的语言:HTML、MATLAB、Verilog等。

2. 语言之间的翻译

语言分为三个层次:高级语言、汇编语言、机器语言。高级语言与具体的计算机无关,而汇编语言和机器语言均与计算机有关。

2.1 正向工程

  1. 高级语言之间的翻译一般被称为转换或称为预处理
  2. 高级语言可以直接翻译成机器语言,也可以翻译成汇编语言,这个过程被称为编译
  3. 汇编语言到机器语言的翻译被称为汇编
  4. 把一个汇编语言程序汇编为在另一个机器上可以运行的机器指令,称为交叉汇编,建立在交叉汇编基础上的编译模式,也称为交叉编译

2.2 逆向工程

  1. 把机器语言翻译成汇编语言,称为反汇编
  2. 把汇编语言翻译成高级语言,称为反编译

3. 编译器和解释器

3.1 编译器

源程序的翻译和翻译后的运行是两个独立的不同阶段。

  1. 首先是编译阶段,用户输入源程序,经过编译器处理,生成目标程序。
  2. 然后是目标程序的运行,根据目标程序的要求进行适当的数据输入,最终得到运行结果。

3.2 解释器

解释器采用另一种方式,它把翻译和运行结合在一起,翻译一段源程序,紧接着就执行它。这种方式被称为解释。

3.3 两者的区别和比较

主要区别:运行目标程序时,解释器拥有控制权,但是编译器没有。
解释器有以下两个优点:

  1. 具有较好的动态特性。
  2. 具有较好的可移植性。

解释器有两个缺点:

  1. 时间上比编译器慢很多:每一次引用变量,都需要重新进行类型检查,甚至重新进行存储空间的分配。
  2. 空间上占用更多:解释执行时,不但要有用户程序的运行空间,而且解释器和响应的运行支撑系统也要占用内存空间。

4. 编译器的工作原理和基本组成

  1. 词法分析
    词法分析器的输入是源程序,输出是识别出的记号流。每个记号代表一类单词,常见的记号有:关键词(保留字)、标识符(变量名等)、字面量(常数和字符串常量)、特殊符号(运算符、分隔符等)。
  2. 语法分析
    以词法分析器返回的记号流为输入构造句子的结构,并以树的形式表示出来,称之为语法树。
  3. 语义分析
    根据语法树进行适当的语义处理。对于声明语句,进行符号表的查填,符号表中,每一行存放一个符号的信息;对于可执行语句,检查结构合理的表达式运算是否有意义。
    无论是解释器还是编译器,到中间代码生成以前的各阶段是完全一样的。
  4. 中间代码生成
    中间代码生成器对语法树进行遍历,并生成可以顺序执行的中间代码序列。中间代码可以有若干种形式,它们的共同特征是与具体机器无关。最常用的中间代码形式是四元式,它的基本形式为:
    (序号)	(op,	 arg1,	  arg2,	  result)
            操作符   左操作数   右操作数    结果   

上式表示第(序号)个四元式,arg1arg2进行op运算,结果存进result

  1. 中间代码优化
    对于x=y+z*60;来说,中间代码的优化过程如下
(1)(itr, 60,   , T1)
(2)( * ,id3, T1, T2)
(3)( + ,id2, T2, T3)
(4)( = , T3,   ,id1)

其中60是编译时已经知道的常数,所以没必要产生(1)号式;(4)号式的作用仅仅是把T3的值传给id1,也是多余的,经过优化后,4个四元式减少为2个。

  1. 目标代码生成
    最后根据优化后的中间代码生成目标代码,在生成目标代码时需要考虑:计算机的系统结构、指令系统、寄存器的分配以及内存的组织等。
  2. 符号表管理
    记录源程序中符号的必要信息,并加以组织,以便于在编译器的各个阶段能够对它们进行快速准确地查找。
  3. 出错处理
    有动态错误和静态错误两种,动态错误指的是逻辑错误,发生在运行时,如0作为除数、数组越界;静态错误又分为语法错误和静态语义错误,如拼写错误、运算符不匹配等。

5. 编译器的分析/综合模式

对于编译器的各个阶段,逻辑上可以把它们划分为两个部分,即分析部分和综合部分。从词法分析到中间代码生成各个阶段的工作称为分析,而以后直到目标代码生成各阶段的工作称为综合。分析部分也称为编译器的前端,综合部分被称为编译器的后端。

6. 编译器扫描的遍数

每个阶段将程序完整分析一遍的工作模式称为一遍扫描。例如词法分析器对源程序进行第一遍扫描,语法分析器进行第二遍扫描,以此类推,最后生成目标程序。但是一个阶段对应一遍扫描的扫描方式是逻辑上的,编译器往往把若干个阶段结合起来进行一次扫描。原理上希望扫描的遍数越少越少。这就必须保证两点:

  1. 为编译器的运行提供足够大的空间。
  2. 从语言的设计上和编译技术上为减少扫描遍数提供支持。

由于中间代码界定了前后端,因此,往往至少将前端扫描一遍,另外,为了生成高质量的目标代码,需要对中间代码进行优化,而全局性的控制流和数据流分析也应该对中间代码进行一遍扫描。

你可能感兴趣的:(编译原理)