① 典型的编译器可以划分成几个主要的逻辑阶段
这是我们今天的作业,
典型的编译器可以划分成七个主要的逻辑阶段,分别是词法分析器、语法分析器、语义分析器、中间代码生成器、独立于机器的代码优化器、代码生成器、依赖于机器的代码优化器。各阶段的主要功能:
(1)词法分析器:词法分析阅读构成源程序的字符流,按编程语言的词法规则把它们组成词法记号流。
(2)语法分析器:按编程语言的语法规则检查词法分析输出的记号流是否符合这些规则,并依据这些规则所体现出的该语言的各种语言构造的层次性,用各记号的第一元建成一种树形的中间表示,这个中间表示用抽象语法的方式描绘了该记号流的语法情况。
(3)语义分析器:使用语法树和符号表中的信息,依据语言定义来检查源程序的语义一致性,以保证程序各部分能有意义地结合在一起。它还收集类型信息,把它们保存在符号表或语法树中。
(4)中间代码生成器:为源程序产生更低级的显示中间表示,可以认为这种中间表示是一种抽象机的程序。
(5)独立于机器的代码优化器:试图改进中间代码,以便产生较好的目标代码。通常,较好是指执行较快,但也可能是其他目标,如目标代码较短或目标代码执行时能耗较低。
(6)代码生成器:取源程序的一种中间表示作为输入并把它映射到一种目标语言。如果目标语言是机器代码,则需要为源程序所用的变量选择寄存器或内存单元,然后把中间指令序列翻译为完成同样任务的机器指令序列。
(7)依赖于机器的代码优化器:试图改进目标机器代码,以便产生较好的目标机器代码。
② 编译器的逻辑阶段可以怎样分组
编译器的逻辑阶段通常可以分为以下几个部分:
词法分析(Lexical Analysis):将源代码转换为单词序列,也称为词法单元或记号。词法分析器将源代码字符流扫描,边扫描边识别记号,然后将这些记号作为输出传递给下一个阶段。识别出的词法单元通常是关键字、标识符、运算符、界符、常量等。
语法分析(Syntax Analysis):将单词序列转换为语法分析树,也称为语法树。语法分析器通过词法分析器输出的记号序列构建出语法树,检查代码是否符合语法规则。如果发现不符合语法规则的语句,会生成一个错误消息。
语义分析(Semantic Analysis):对语法树进行语义检查。语义分析器会检查语法树中的语法单元是否符合语义规则,例如变量是否已声明,数据类型是否匹配,函数参数是否正确等。如果发现不符合语义规则的语句,会生成一个错误消息。
中间代码生成(Intermediate Code Generation):将语法树转换为中间代码。中间代码是一种与源代码无关的代码形式,通常使用一种类似于汇编语言的中间表示形式如伍蠢。
代码优化(Code Optimization):对中间代码进行优化,以提高程序的性能和效率。代码优化器会应用一些优化技术,例如常量折叠、死代码消除、循环展开等。
目标代码生成(Code Generation):将中间代码橘配转换为机器码或目标代码。代码生成器会将中间代码转换为目标机器的机器码或汇编代码,以便可执行程序的生成。
符号表管理(Symbol Table Management):维护变量、函数等符号的信息。符号表管理器会记录符号的类型、作用域、存储位置等信息,并提供符号的查找、插入、删除等操作。
以上是编译器的典型逻辑阶段,不同的编译器可能会渣陪有所不同,但通常都会包含以上阶段的一部分或全部。