编译原理过程

合集下载

编译原理 编译的过程

编译原理 编译的过程

编译原理编译的过程编译原理是计算机科学与技术领域的一个重要学科,它研究的是将高级程序语言转化为机器语言的过程,以实现程序的运行。

编译的过程可以分为以下几个步骤。

1. 词法分析(Lexical Analysis):将输入的源代码序列划分为一个个的词素(Token),并对每个词素进行分类。

2. 语法分析(Syntactic Analysis):根据语法规则,利用词法分析得到的词法单元序列,生成抽象语法树(Abstract Syntax Tree),以表达程序的结构。

3. 语义分析(Semantic Analysis):对生成的抽象语法树进行语义的验证,包括类型检查、作用域检查等。

同时,将高级语言的语句转化为中间代码表示。

4. 优化(Optimization):对生成的中间代码进行优化,以提高程序的执行效率。

包括常量折叠、公共子表达式消除、循环优化等。

5. 中间代码生成(Intermediate Code Generation):将优化后的中间代码转化为目标机器独立的中间代码表示,如三地址码、虚拟机指令等。

6. 目标代码生成(Code Generation):根据目标机器的特点,将中间代码转化为目标机器代码,如汇编语言代码或机器指令。

7. 目标代码优化(Code Optimization):对生成的目标代码进行优化,以进一步提高程序的执行效率。

8. 目标代码的链接与装载(Linking and Loading):将编译得到的目标代码与库进行链接,生成可执行程序,并将其加载到内存中执行。

编译过程中的每个阶段都具有特定的功能和任务,它们相互协作,最终将高级语言的源代码转化为目标机器可执行的代码。

这个过程可以分为前端和后端两个部分,前端主要负责语法和语义分析等,后端主要负责中间代码的生成、目标代码生成和优化等。

编译过程需要充分考虑程序的正确性、效率和可维护性等方面的要求。

编译原理词法分析与语法分析的过程与方法

编译原理词法分析与语法分析的过程与方法

编译原理词法分析与语法分析的过程与方法编译原理是计算机科学领域中的重要内容之一,它研究如何将高级语言程序转化为机器语言的过程。

其中,词法分析和语法分析是编译原理中的两个重要阶段。

本文将详细介绍词法分析与语法分析的过程与方法。

一、词法分析的过程与方法词法分析是编译器的第一个阶段,其主要任务是将源程序的字符序列划分成有意义的语言单元,也就是词法单元。

以下是词法分析的过程与方法:1. 扫描:词法分析器从源程序中读取字符序列,并按照事先定义的规则进行扫描。

2. 划分词法单元:根据事先定义的规则,词法分析器将字符序列划分为不同的词法单元,如关键字、标识符、常量、运算符等。

3. 生成词法单元流:将划分好的词法单元按照顺序生成词法单元流,方便后续的语法分析阶段使用。

4. 错误处理:在词法分析过程中,如果发现了不符合规则的字符序列,词法分析器会进行错误处理,并向用户报告错误信息。

二、语法分析的过程与方法语法分析是编译器的第二个阶段,其主要任务是分析词法单元流,并判断是否符合语法规则。

以下是语法分析的过程与方法:1. 构建语法树:语法分析器根据语法规则构建抽象语法树(AST),用于表示源程序的语法结构。

2. 自顶向下分析:自顶向下分析是一种常用的语法分析方法,它从根节点开始,按照语法规则向下递归分析,直到生成叶子节点对应的词法单元。

3. 底部向上分析:底部向上分析是另一种常用的语法分析方法,它从词法单元开始,逐步合并为更高级的语法结构,直到生成抽象语法树的根节点。

4. 错误处理:在语法分析过程中,如果发现了不符合语法规则的词法单元流,语法分析器会进行错误处理,并向用户报告错误信息。

三、词法分析与语法分析的关系与区别词法分析和语法分析在编译原理中起着不同的作用:1. 关系:词法分析是语法分析的前置阶段,它为语法分析提供了有意义的词法单元流。

语法分析基于词法单元流构建语法树,判断源程序是否满足语法规则。

2. 区别:词法分析主要关注词法单元的划分和分类,它是基于字符序列的处理;而语法分析主要关注词法单元之间的组合和语法结构的判断,它是基于语法规则的处理。

编译原理(龙书)课后习题解答(详细)

编译原理(龙书)课后习题解答(详细)

编译原理(龙书)课后习题解答(详细)编译原理(龙书)课后题解答第一章1.1.1 :翻译和编译的区别?答:翻译通常指自然语言的翻译,将一种自然语言的表述翻译成另一种自然语言的表述,而编译指的是将一种高级语言翻译为机器语言(或汇编语言)的过程。

1.1.2 :简述编译器的工作过程?答:编译器的工作过程包括以下三个阶段:(1) 词法分析:将输入的字符流分解成一个个的单词符号,构成一个单词符号序列;(2) 语法分析:根据语法规则分析单词符号序列中各个单词之间的关系,确定它们的语法结构,并生成抽象语法树;(3) 代码生成:根据抽象语法树生成目标程序(机器语言或汇编语言),并输出执行文件。

1.2.1 :解释器和编译器的区别?答:解释器和编译器的主要区别在于执行方式。

编译器将源程序编译成机器语言或汇编语言等,在运行时无需重新编译,程序会一次性运行完毕;而解释器则是边翻译边执行,每次执行都需要进行一次翻译,一次只执行一部分。

1.2.2 :Java语言采用的是解释执行还是编译执行?答:Java一般是编译成字节码的形式,然后由Java虚拟机(JVM)进行解释执行。

但是,Java也有JIT(即时编译器)的存在,当某一段代码被多次执行时,JIT会将其编译成机器语言,提升代码的执行效率。

第二章2.1.1 :使用BNF范式定义简单的加法表达式和乘法表达式答:<加法表达式> ::= <加法表达式> "+" <乘法表达式> | <乘法表达式><乘法表达式> ::= <乘法表达式> "*" <单项式> | <单项式><单项式> ::= <数字> | "(" <加法表达式> ")"2.2.3 :什么是自下而上分析?答:自下而上分析是指从输入字符串出发,自底向上构造推导过程,直到推导出起始符号。

C语言编译原理编译过程和编译器的工作原理

C语言编译原理编译过程和编译器的工作原理

C语言编译原理编译过程和编译器的工作原理C语言是一种广泛使用的计算机编程语言,它具有高效性和可移植性的特点。

在C语言程序的运行之前,需要通过编译器将源代码翻译成机器可以执行的目标代码。

编译器是一种专门用于将高级语言源代码转换为机器语言的程序。

编译过程分为四个主要阶段,包括词法分析、语法分析、语义分析和代码生成。

下面我们逐一介绍这些阶段的工作原理。

1. 词法分析词法分析是编译过程的第一步,它将源代码分解成一系列的词法单元,如标识符、常量、运算符等。

这些词法单元存储在符号表中,以便后续的分析和转换。

2. 语法分析语法分析的目标是将词法单元按照语法规则组织成一个语法树,以便进一步的分析和优化。

语法分析器使用文法规则来判断输入的字符串是否符合语法规范,并根据语法规则生成语法树。

3. 语义分析语义分析阶段对语法树进行分析并在合适的地方插入语义动作。

语义动作是一些与语义相关的处理操作,用于检查和修正代码的语义错误,并生成中间代码或目标代码。

4. 代码生成代码生成是编译过程的最后一个阶段,它将中间代码或语法树翻译为目标代码,使得计算机可以直接执行。

代码生成阶段涉及到指令的选择、寄存器分配、数据位置的确定等一系列的优化操作,以提高程序的性能和效率。

编译器是实现编译过程的工具。

它接收源代码作为输入,并将其转换为目标代码或可执行文件作为输出。

编译器工作原理可以简单概括为:读取源代码、进行词法分析和语法分析、生成中间代码、进行优化、生成目标代码。

编译器在编译过程中还涉及到符号表管理、错误处理、优化算法等方面的工作。

符号表用于管理程序中的标识符、常量、变量等信息;错误处理机制用于检测和纠正程序中的错误;优化算法用于提高程序的性能和效率,例如常量折叠、无用代码删除等。

总结起来,C语言编译过程涉及到词法分析、语法分析、语义分析和代码生成等阶段,每个阶段都有特定的工作原理和任务。

编译器作为实现编译过程的工具,负责将源代码转换为机器可以执行的目标代码。

keil编译原理

keil编译原理

keil编译原理
Keil是一个用于开发嵌入式系统的集成开发环境(IDE),它提供了完整的工具链,包括编译器、链接器、调试器和仿真器等。

Keil的编译原理可以概括为以下几个步骤:
1. 预处理:在这个阶段,编译器读取源代码,并对其中的预处理指令进行处理。

例如,include指令告诉编译器在编译之前包含指定的文件。

2. 编译:编译阶段将预处理后的代码转换成汇编语言。

这个阶段会检查语法错误,并生成汇编代码。

3. 汇编:汇编阶段将编译生成的汇编代码转换成目标文件(.obj)。

这个阶段还会检查汇编代码的语法错误。

4. 链接:链接阶段将生成的目标文件和其他依赖的库文件合并成一个可执行文件。

这个阶段还会解决符号引用的问题,例如函数和变量的调用。

在Keil中,编译过程可以使用不同的编译器和链接器选项来自定义。

Keil还提供了调试器和仿真器,用于在嵌入式系统开发中进行调试和测试。

以上信息仅供参考,如需更专业的解释,建议咨询计算机编程领域的专业人员。

c语言的编译原理

c语言的编译原理

c语言的编译原理
编译原理是指将高级语言(如C语言)编写的程序转换成机
器语言的过程。

它主要分为四个步骤:词法分析、语法分析、语义分析和代码生成。

词法分析是将源代码分解成一个个标记(token)的过程,每
个标记代表着一个词法单元,例如关键字、标识符、运算符等。

词法分析器会利用正则表达式等方法来识别源代码中的词法单元,并生成标记序列。

语法分析是将标记序列按照语法规则进行分析的过程。

它会将标记序列组织成一个由语法规则定义的语法树(Syntax Tree)。

语法分析器会利用文法规则和语法分析算法(如LL(k)算法、LR(k)算法等)来构建语法树。

语义分析是在构建语法树的基础上,对表达式、语句等进行语义检查和语义转换的过程。

语义分析器会检查类型匹配、作用域等语义规则,并将源代码转换成中间代码或目标代码。

代码生成是将中间代码或目标代码生成可执行文件的过程。

它包括了代码优化、目标机器指令的生成和链接等步骤。

代码生成器会根据目标机器的特性和约束,生成对应的机器指令,最终生成可执行文件。

总的来说,C语言的编译原理涉及了词法分析、语法分析、语
义分析和代码生成等几个关键步骤,通过这些步骤将C语言
程序转换成机器语言,从而使计算机能够理解和执行这些程序。

编译原理实验报告

编译原理实验报告一、实验目的编译原理是计算机科学中的重要课程,旨在让学生了解编译器的基本工作原理以及相关技术。

本次实验旨在通过设计和实现一个简单的编译器,来进一步加深对编译原理的理解,并掌握实际应用的能力。

二、实验环境本次实验使用了Java编程语言及相关工具。

在开始实验前,我们需要安装Java JDK并配置好运行环境。

三、实验内容及步骤1. 词法分析词法分析是编译器的第一步,它将源代码分割成一系列词法单元。

我们首先实现一个词法分析器,它能够将输入的源代码按照语法规则进行切割,并识别出关键字、标识符、数字、运算符等。

2. 语法分析语法分析是编译器的第二步,它将词法分析得到的词法单元序列转化为语法树。

我们使用自顶向下的LL(1)语法分析算法,根据文法规则递归地构建语法树。

3. 语义分析语义分析是编译器的第三步,它对语法树进行检查和转换。

我们主要进行类型检查、语法错误检查等。

如果源代码存在语义错误,编译器应该能够提供相应的错误提示。

4. 代码生成代码生成是编译器的最后一步,它将经过词法分析、语法分析和语义分析的源代码翻译为目标代码。

在本次实验中,我们将目标代码生成为Java字节码。

5. 测试与优化完成以上步骤后,我们需要对编译器进行测试,并进行优化。

通过多个测试用例的执行,我们可以验证编译器的正确性和性能。

四、实验心得通过完成这个编译器的实验,我收获了很多。

首先,我对编译原理的知识有了更深入的理解。

在实验过程中,我深入学习了词法分析、语法分析、语义分析和代码生成等关键技术,对编译器的工作原理有了更系统的了解。

其次,我提高了编程能力。

实现一个完整的编译器需要处理复杂的数据结构和算法,这对我的编程能力是一个很好的挑战。

通过实验,我学会了合理地组织代码,优化算法,并注意到细节对程序性能的影响。

最后,我锻炼了解决问题的能力。

在实验过程中,我遇到了很多困难和挑战,但我不断地调试和改进代码,最终成功地实现了编译器。

程序设计语言编译原理

程序设计语言编译原理
程序设计语言编译原理是一种将源代码转换为机器可执行代码的过程。

它是程
序员使用指令来编写程序的关键部分。

一门程序设计语言首先需要有编译原理来将设计语言翻译与其他计算机语言进行交流。

编译原理提供了一个可行的平台,使程序员可以设计出可执行程序,并使编程变得更简单。

编译原理包括三个部分,分别为输入,处理与输出。

输入部分包括程序设计语
言源程序,在程序设计语言编译原理中扮演着十分重要的角色,处理部分实现从源语言到目标语言的转换,处理的具体诱导有词法分析,解析,语法树分析,语义分析,代码优化,最终代码生成。

最后是输出部分,编译后的机器代码可以驱动计算机执行。

程序员只需要按照设计语言规范来写源代码,编译器就可以帮助他们将源代码转换为可执行程序。

程序设计语言编译原理的出现让软件开发更加容易,也大大提高了编译的效率。

但没有一种编译语言是完全理想的,针对于不同的设计语言而言,都需要为每一种编译语言提供适当的编译原理。

程序设计语言的编译原理也有许多,根据不同的设计语言,可以采用不同的编译原理,以确保机器代码可以正确执行。

编译原理文字总结

编译原理文字总结编译原理文字总结1.高级程序设计语言的翻译主要有两种方式:编译和解释。

2.编译过程概述:(1)词法分析:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词(亦称单词符号或符号)如基本字,标识符,常数,算符和界符。

(2)语法分析:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴),如短语,子句,句子,程序段和程序等(3)语义分析与中间代码产生:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。

包括静态语义检查和中间代码的翻译。

(4)优化:对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效(省时间和空间)的目标代码。

(5)目标代码生成:把中间代码(或经优化处理之后)变换成特定机器上的低级语言代码。

编译程序结构框图3.文法是表述语言的语法结构的形式规则。

4.所谓上下文无关文法是这样一种文法,它所定义的语法范畴(或语法单位)是完全独立于这种范畴可能出现的环境的。

一个上下文无关文法G包括四个组成部分:一组终结符号,一组非终结符号,一个开始符号,以及一组产生式。

5.形式上说,一个上下文无关文法G是一个四元式(VT,VN,S,&)其中VT是一个非空有限集,它的每个元素称为终结符号;VN是一个非空有限集,它的每个元素称为非终结符号,VT∩VN=;S是一个非终结符号,称为开始符号;&是一个产生式集合,每个产生式的形式是P→a,其中P属于VN,a属于(VT∪VN)*。

开始符号S至少必须在某个产生式的左部出现一次。

6.推导每前进一步总是引用一条规则(产生式)。

7.假定G是一个文法,S是它的开始符号。

如果Sa,则称a是一个句型(0步或若干步)。

仅含终结符号的句型是一个句子。

文法G所产生的句子的全体是一个语言,将它记为L(G)。

L(G)={a|Sa&a∈VT*}例如终结符号串(i*i+i)是文法(2.1)的一个句子。

编译原理流程

编译原理流程
编译原理的流程可以概括为以下几个步骤:
1. 词法分析:将源代码按照语法规则划分为一个个的词法单元(Token),例如标识符、关键字、字符常量等。

2. 语法分析:将词法单元按照语法规则进行分析,构建相应的语法树(Parse Tree)。

常用的语法分析方法有递归下降分析、LL(1)分析、LR分析等。

3. 语义分析:对语法树进行处理,进行类型检查、生成中间代码等。

语义分析会解决一些语法上无法检测到的问题,例如类型不匹配、未声明的变量等。

4. 中间代码生成:将语法树转换为中间代码形式,例如三地址代码、虚拟机代码等。

中间代码是一个介于源代码和目标代码之间的抽象表示。

5. 代码优化:对中间代码进行优化处理,以提高程序的执行效率和运行速度。

常见的代码优化技术包括常量折叠、死代码删除、循环优化等。

6. 目标代码生成:根据目标机器的特性和要求,将优化后的中间代码转换为目标代码,例如汇编代码或者机器码。

7. 目标代码优化:对生成的目标代码进行优化,以进一步提高程序的执行效率和运行速度。

8. 符号表管理:在编译过程中维护一个符号表,用于存储变量、函数等的信息。

符号表可以用于语义分析、中间代码生成等阶段的处理。

9. 错误处理:在编译过程中会检测并处理词法、语法、语义等方面的错误,包括报错提示和恢复处理等。

10. 目标代码生成和链接:将优化后的目标代码生成可执行文件,并进行链接,包括解决外部引用、重定位等过程。

以上是编译原理的基本流程,不同编译器或编译器生成的目标代码可能会有不同的细节处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理过程及分析
姓名:王伟
学号: 20142217
(2016.12)
编译原理过程及分析
编译器最基本的功能就是把高级语言(例如C/Fortran)编写的代码转化为机器指令(就是01串),从这个角度来说它本质上是个转换过程。

经典的编译过程主要包括:
1、词法分析(Lexical Analysis)
词法分析就是从输入代码中识别出各种记号(token),例如对于C语言我们就需要知道if,else等是语言的关键字,myvar是个标识,而123myvar不能被识别为一个标识。

负责实现词法分析的模块有时也称为scanner。

词法分析的关键当然是语言定义的规则了,比如哪些是关键词,哪些是合法的标识等,这些规则一般是通过正则表达式(RE,Regular Expression)来给出,运行时从输入缓冲区中读入一部分,然后看和哪个RE匹配就知道它到底是个什么token。

下一个问题就是正则表达式的匹配过程如何实现,经典理论对此都会提到有限状态机(FSM, Finite State Machine)。

关于FSM在可行性计算里一般都会有不少篇幅分析,在编译里谈到的FSM和RE主要是如何从输入的构成出对应的FSM。

构造的过程一般分为三个步骤:
(1)根据Thompson构造法从RE构造出对应的非确定性有限状态机(NFA,
Non-deterministic Automata);
(2)经过不断计算epison-闭包(也成为可到达集)构造出确定性有限状态机(DFA, deterministic Automata);
(3)将DFA最小化,方法是增量式地合并不可区分(对于同一输入的下一个状态都一样)的两个状态。

2、语法分析
语法分析的输入是一连串的token(词法分析的输出),根据语言的语法规则不断解析最后得到一棵抽象语法树(AST, Abstract Syntax Tree),负责语法分析模块通常也被叫做Parser。

在词法分析中,我们经常使用正则表达式来表示语言所接受的token的规则,类似的,在语法分析中,我们使用文法(Grammar)来表示语言的语法规则,这也早期计算机语言设计中的研究热点(同样也是大学里学习编译时最容易让人头晕的东西)。

编译里常说的文法指的是一种上下文无关文法(Context-Free Grammar),简单地说文法里包含终结符(terminal,就是26个字符、数字等等)、非终结符(nonterminal,实际是一种抽象)和产生式(production)。

上下文无关文法要求每个产生式的左边必须恰好是一个非终结符,而右边是0个或多个终结符与非终结符的组合,最后整个文法还必须有一个起始符(某个终结符)。

文法里还有些很重要的基本概念,例如推导(derivation)、归约(reduction)、二义性(ambiguity)、最左推导等等。

文法中最重要的基本概念是FIRST集和FOLLOW集的构造。

根据这两个集合就可以很容易构造出一个预测分析表,每个行的名字是一个非终结符,每个列的名字是一个终结符,如果每个表格内没有两个以上的项,那么说明是一个LL(1)文法(Left-to-right parse, Leftmost-derivation, 1-symbol lookhead),简单地说就是向右边看一个符号就能确定下一步动作。

当原文法不是LL(1)文法时,可以尝试通过消除左递归(Eliminate Left Recursion)和提取左因子(Left Factoring)对原文法进行变形得到等价的LL(1)文法。

begin find (n-1);
t: =t*n end ;
end;
begin
write (‘n=’);
readln (n);
find (n);
writeln (n,‘!=’,t)
end.
递归调用(n进栈)达到结束条件时(n=0,t赋初值1)就停止调用开始返回,再把保存的值取出(n出栈),使n恢复原来的值,并计算t,返回主程序,输出结果t。

follow集合算法:
计算所有非终结符号A的follow(A)集合时,不断应用下面的规则,直到再没有新的终结符号可以被加入到任意的follow集合中为止。

1、将$放到follow(S)中,其中S是开始符号,而$是输入右端的结束标记。

2、如果存在一个产生式A→αBβ,那么first(β)中除ε之外的所有符号都在follow(B)中。

3、如果存在一个产生式A→αB,或存在产生式A→αBβ且first(β)包含ε,那么follow (A)中的所有符号都在follow(B)中。

举个例子来说明下,假设有如下文法:
①E→TE'
②E'→+TE' |ε
③T→FT'
④T'→*FT' |ε
⑤F→(E)| id
对于每个非终结符号,我们都可以求出其follow集:
根据(1),首先将$加入到follow(E)中,即follow(E)={$},由⑤可知,)也应该在follow(E)中,即follow(E)={$,)};
对于E',根据规则(3)以及产生式①,应该将follow(E)加入到follow(E‘)中,即follow (E')={$,)};
对于T,根据规则(2)以及产生式①,应该将first(E')加入到follow(T)中,即follow (T)={+},根据规则(3),由于first(E')包含ε,所以应该将follow(E')加入到follow(T)中,即follow(T)={+,$,)};
对于T',根据规则(3)以及产生式③,应该将follow(T)加入到follow(T‘)中,即follow (T')={+,$,)};
对于F,根据规则(2)以及产生式③,应该将first(T')加入到follow(F)中,即follow (F)={*},根据规则(3),由于first(T')包含ε,所以应该将follow(T')加入到follow(F)中,即follow(F)={*,+,$,)};
3、语义分析(Sematic Analysis)
语义分析包括一些经典的问题。

(1)类型检查(Type Checking),例如在语法树上a+b看起来是没问题的,因为a和b
都是合法的变量名,并且语法中支持变量间+这种操作。

但是可能a是一个字符串,而b是一个浮点数,这两者之间的+操作就不符合语义规范了,这种问题在这个阶段都会被找出来。

(2)符号管理,最经典的问题就是如何管理变量(变量的名字,类型,变量的作用域(scope)等),在分析代码时,符号管理肯定是被频繁的搜索,因此它通常会使用hash来组织。

4、中间代码(IR, intermediate Representation)生成
IR是非常非常重要的,它被引入的初衷是提高编译器开发的效率。

IR是编译过程的一个汇聚点,在IR之前我们通常都认为是编译的前端,而IR之后是编译的后端,这样当编译器需要多支持一种高级语言时主要工作就是提供一个前端,而当需要移植到一种新的平台上时主要工作就是提供对应的后端。

关于IR的表示典型的有三地址码。

IR生成的过程就是将一棵抽象语法树(这是编译器前端对源代码的理解和抽象)变成一串IR定义的代码(IR指令种类简单,这便于优化)。

这个转换过程都是比较固定的套路,例如if-else,while/for等基本结构如何转都是一个固定的套路。

5、编译优化
这一部分是现代编译器最核心所在,主要有两类,一类是通用的优化手段,比如死代码删除、循环不变量外提、强度削弱等,另一类就是体系结构相关的,说白了就是某种体系结构针对某类应用提供了特殊指令,例如intel的MMX,SSE2等等。

为支持优化工作的开展,我们首先需要能够比较方便的描述代码。

最基本的当然是一条指令,但是这个太细微,于是往上抽象出基本块(Basic Block),这个基本上是所有优化开展必备的工作,然后多个基本块还可以构成一个超级块(region)。

此外,经典的方法还包括控制流分析和数据流分析,这里常用的包括d-u链等。

最后一个经典的topic就是寄存器分配。

6、目标代码生成
这里直接和具体平台相关,这里的平台同时包括软件和硬件,例如哪种目标文件格式(ELF, PE),哪种平台(指令集)。

不过现在编译器一般生成的是字符形式的汇编文件,所以前面一个问题基本不大,主要影响在后者。

编译程序的最后一项任务是生成目标代码。

目标代码生成器把中间代码变换成目标代码,通常有3种变换形式:
1、立即执行的机器语言代码。

这种方式对应静态连接方式,程序中所有地址都重定位,执行效率最高,但是占用的存储空间最大。

2、待装配的机器语言模块。

该方式不连接系统共享的程序库,在需要使用的时候会由系统加载共享程序库。

3、汇编语言代码。

该方式经过汇编程序汇编后,直接生成可以在操作系统上运行的目标代码。

生成目标代码需要考虑3个影响生成速度的问题:
1、是采用什么方法生成比较短小的目标代码;
2、是如何在目标代码中多使用寄存器,减少目标代码访问外部存储单元的次数;
3、是如何根据不同平台计算机指令特性进行优化,提高程序运行效率。

相关文档
最新文档