编译原理-第一章 引论-1.2 编译器的基本结构

编译器:

  • 定义:将目标程序编译为可执行程序的系统。
  • 基本结构:

                        

      1.分析部分

      • 特点:又可称为前端。前端:源程序→中间表示。只依赖于源语言。收集有关源程序的信息,并把信息存储到称为符号表的数据结构中,符号表和中间形式一起传送给综合部分。
      • 划分的意义:
        • 简化编译器的设计
        • 提高编译器的效率
        • 增强编译器的可移植性
      • 组成:
        • 词法分析(或扫描):词法分析器读入组成源程序的字符流,并且将它们组织成为有意义的词素的序列。对于每个词素,词法分析器产生词法单元作为输出,其形式为<token-name,attribute-value>(token-name:一个由语法分析步骤使用的抽象符号,attribute-value:指向符号表中关于这个词法单元的条目)。

                                                

        • 语法分析(或解析):语法分析器使用由词法分析器生成的各个法单元的第一个分量来创建树形的中间表示,该表示给出了词法分析产生的词法单元流的语法结构。一个常用的表示方法是语法树,树中的每个内部结点表示一个运算,而该结点的子结点表示该运算的分量。(把词法记号流依照语言的语法结构层次分组,以形成语法短句)

                                         

        • 语义分析:语义分析器使用语法树符号表中的信息来检查源程序是否和语言定义的语义一致。它同时也收集类型信息,并把这些信息存放到语法树符号表中,以便在随后的中间代码生成过程中使用。(类型检查类型转换语法指导翻译)
        • 中间代码生成:中间代码位于高级编程语言和机器语言(目标程序)之间。(后缀表达式抽象语法树三地址码)

                                    

      2.综合部分

      • 特点:又可称为后端。后端:中间表示→目标程序。依赖于目标机器,一般独立于源语言,与中间语言有关。
      • 组成:
        • 代码优化:改进中间代码,以便生成更好(通常意为着更快,但也可能有其他目标)的目标代码。

                                         

        • 代码生成:代码生成器以源程序的中间表示作为输入,并把它映射到目标语言,生成可重定位的代码。其重要的方面是合理分配寄存器以存放变量的值。

      3.符号表管理:

      • 编译器的一项重要工作是记录源程序中使用的标识符,并收集每个标识符的各个属性。
        • 这些属性提供标识符的存储分配、类型和作用域等信息。
        • 如果是过程标识符,这些信息还包括:它的参数的个数和类型、参数的传递方式和返回值类型。
      • 符号表是为每个标识符保存一个记录条目的数据结构记录的域就是标识符的属性
        • 该数据结构允许我们迅速地找到一个标识符的记录,在此记录中存储和读取数据。
      • 词法分析器源程序的标识符填入符号表。但是,词法分析期间不能确定一个标识符的属性
      • 其余阶段把标识符的信息填入符号表,然后以不同的方式使用这些信息。         

      4.出错管理:

      • 每个阶段都有可能发现源程序的错误。发现错误后,该阶段必须处理此错误,使得编译可以继续进行,以便进一步发现源程序的其他错误。
        • 词法分析:当前被扫描的字符串不能形成语言的词法记号。
        • 语法分析:词法记号流违反语言的语法规则。
        • 语义分析:编译器试图找出语法正确但对所含的操作来说是无意义的结构。  
  •  执行过程:

                                          

 

Q1:什么是编译器?

A1:将源程序编译为目标可执行程序的系统。

Q2:编译器的前端分析由哪些部分构成?

A2:词法分析、语法分析、语义分析、中间代码生成。

Q3:编译器的后端由哪些部分构成?

A3:代码优化、代码生成

Q4:什么是词法分析?

A4:逐个读构成源程序的字符,把它们组成词法单元。

Q5:什么是语法分析?

A5:把词法记号流依照语言的语法结构按层次分组,以形成语法短句

Q6:什么是标识符、表达式、语句?

A6:标识符是由字母或数字以及某些特殊符号(因为不同的高级语言而不同)组成的,但是是以字母开头的一个字符串。

认为两者为平行关系:可以返回值的是表达式,不能返回值的是语句。认为两者包含关系:表达式是可以返回值的语句。

Q7:中间代码有哪三种表达式?

A7:1.后缀表达式;2.抽象语法树;3.三地址码。

Q8:什么是符号表?

A8:符号表是为每个标识符保存一个记录条目的数据结构,记录的域就是标识符的属性。

Q9:什么是出错管理?

A9:检查并处理每阶段中源程序的错误。

 

参考-《编译原理(第二版)》,慕课-苏州大学-王中卿老师

 

posted @ 2020-03-03 20:44  方知有  阅读(673)  评论(0编辑  收藏  举报