编译器工作流程详解

来源:互联网 发布:c语言写入txt文件 编辑:程序博客网 时间:2024/05/21 17:47

编程语言对人或机器来说是用来描述计算任务的符号和规则。能够在机器上运行的所有软件都是用某种编程语言编写的程序。但是在程序运行前,必须要将其转化为机器能够执行的格式,编译器的功能就是这里的“转化”。

编译器是将高级编程语言转化为汇编语言或是机器语言的一系列工具集软件的总和,从这个概念理解,编译器包括源语言到另外一种语言的编译器、源语言到汇编语言编译器、汇编语言到另外一种汇编语言的编译器这些都是编译器的范畴。从是否可重定位,编译器又可以分为传统编译器和可重定位编译器。

编译的过程就是将源语言经过词法分析、语法分析、语义分析以及经过一系列优化后生成汇编代码。通常一个编译器包含4个步骤。

词法分析:在一个编译器中,词法分析的作用是将输入的字符串流进行分析,并按一定的规则将输入的字符串流进行分割,从而形成所使用的源程序语言所允许的记号(token),在这些记号序列将送到随后的语法分析过程中,与此同时将不符合规范的记号识别出来,并产生错误提示信息。通常采用确定的有限状态自动机(Deterministic Finite AutomatonDFA)来构造词法分析工具。已有一些专门的、开源的词法分析程序自动生成器可供免费使用,例如Lex,其GNU版本为Flex

语法分析:语法分析的过程是分析词法分析产生的记号序列,并按一定的语法规则识别并生成中间表示形式,以及符号表。符号表记录程序中所使用的标识符及其标识符的属性。同样,将不符合语法规则的记号识别出其位置并产生错误提示语句。词法分析与语法分析及其符号表的关系图如图 1所示。目前大多数开源编译器使用的语法分析方法有两类,一种是自顶向下(Top-Down Parsing)的分析方法,另一种是自底向上(Bottom-Up Parsing)的分析方法。目前已有一些专门的、开源的语法分析程序自动生成器可供免费使用,例如yacc,其GNU版本为bison。在编译器开发中通常联合使用词法分析工具LEX和语法分析工具YACC,这样可以大大减少前端设计工作量。

                                  图 1 词法分析与语法分析关联图

语义分析:也即静态语法检查,静态语义检查的作用是分析语法分析过程中产生的中间表示形式和符号表,以检查源程序的语义是否与源语言的静态语义属性相符合。由于现有的大部分高级编程语言的语言是语法制导翻译的语言,因此目前通常使用的静态语义检查的方法是语法制导翻译的方法。语法制导翻译的方法是通过语法制导的属性文法来进行程序的语义分析。静态语义检查的根本目的是确认程序是否满足源编程语言要求的静态语义属性,可以理解检查为标识符的声明和使用是否相一致。

代码生成:目前大多数编译器前端会将源程序转换成中间表示形式,因此在代码生成阶段是将中间表示形式的代码转换成可直接运行的目标机器代码形式的等价机器代码。

现代编译器的整个过程如图2所示。其中前三个阶段词法分析、语法分析和语义分析称为编译器的前端,源语言程序经过前端的分析会产生中间表示形式。后两个阶段代码优化和汇编代码产生为编译器的后端。

                                                    图2 现代编译器结构框图

编译器产生的中间表示形式的代码后通过优化器进行代码优化,代码优化的作用是将中间表示形式进行分析并转换为功能等价但是运行时间更短或占用资源更少的等价中间代码。对于现如今的很多高级编程语言来说。图 2中编译器的代码优化阶段可以在对代码的一遍分析处理中完成,这样就可以构成一个快速的一遍编译器,而此编译器完全可以满足一般的、性能要求不高的用户需求。然而,这样的编译器通常是不能期望它提供非常高质量的目标代码。现代编译器的优化阶段通常会很复杂,往往划分为很多个阶段,在不同的编译器中这个阶段的叫法不一样,在GCC中叫做一个优化遍(pass)。有的阶段还会包含子阶段,有些阶段可能会被重复执行多遍,以保证优化效果最佳。

0 0
原创粉丝点击