前端后端
目的:增加可移植性
前端
· 与源语言有关、与目标机无关的部分
· 词法分析、语法分析、语义分析与中间代码生成、与机器无关的代码优化,出错处理,符号管理
后端
· 与目标机有关的部分
· 与机器有关的代码优化、目标代码生成
素短语
是一个短语,至少包含一个终结符, 除自身外不再包括其他含终结符的短语(至少包含一个终结符的最小短语)
短语
一棵子树的所有叶子自左至右排列起来 形成一个相对于子树根的短语。
直接短语
仅需要一步推导的句型相对于其父节点是直接短语。
句柄:
一个句型的最左直接短语称为该句型的句柄。(树最左边的一个直接短语)
C语言的活动记录格式
活动记录,就是在程序执行的过程中函数调用时栈上的内容变化。一个函数被调用,反映在栈上的与之相关的内容被称为一帧,其中包含了参数、返回地址、老ebp值、局部变量以及esp和ebp。
C语言默认的调用规约为cdecl,参数从右往左依次入栈,之后是函数的返回地址入栈,接着是老ebp入栈。
指针sp指向现行过程的活动记录在栈中的起始位置,top指向栈顶对任何局部变量X的引用可表示为变址访问: dx[SP]
dx:变量X相对于活动记录起点的地址,在编译时可确定
连接数据: 返回地址;
动态链:指向调用者的活动记录;
静态链:访问存放在其他活动记录中的非局部数据:
形式单元:存放相应的实在参数的地址或值;
局部数据区:局部变量、内情向量、临时工作单元(如存放对表达式求值的结果)。
代码优化方法
公共子表达式的删除;复制传播;无用代码的删除;代码外提;强度削弱和归纳变量删除。
S-属性
分析树结点N上的非终结符号A的属性值由N的产生式所关联的语义规则来定义
L-属性
分析树结点N的属性值由N的父结点所关联的语义规则来定义。
解释器和编译器有什么区别?
解释器:边解释边执行:不断读取源程序的语句,解释语句,读取此语句需要的数据,根据执行结果读取下一条语句,继续解释执行,直到返回结果,类似于自然语言翻译的同声传译
编译器:将源程序完整地转换成机器语言程序或汇编语言程序,然后再处理、执行的翻译程序,高级语言程序→汇编/机器语言程序,类似于自然语言翻译的通篇笔译
词法分析的主要任务是什么?为什么要使用token二元组表示词法分析的结果?
把构成源程序的字符串转换成单词符号的序列,去除无意义的空格和注释等。
但如果只把切分出来的单词符号本身作为输出,是不够的。一个单词符号至少要包含两个方面的信息:单词的类别(词类)、单词的属性值,因此用二元式来表示单词符号。
什么是语法制导定义, 什么是语法制导的翻译方案?二者之间有什么关系?
语法制导定义(SDD)是上下文无关文法和属性以及规则的结合,属性与文法符号相关联,规则和产生式相关联。根据需要,将文法符号和某些属性相关联,并通过语义规则来描述如何计算属性的值。
语法制导的翻译方案(SDT):在产生式体中嵌入程序片断(语义动作)的上下文无关文法。
S属性的SDD
◼ 每个属性都是综合属性
◼ 都是根据子构造的属性计算整个构造的属性。
◼ 在依赖图中,总是通过子结点的属性值来计算父结点的属性值。可以和自顶向下、自底
向上的语法分析过程一起计算
◼ 自底向上:在构造分析树的子结点的同时计算相关的属性
◼ 自顶向下:递归子程序法中,在过程A()的最后计算A的属性
L属性的SDD
◼ 每个属性要么是综合属性,要么是继承属性,且产生式A→X1X2…Xn中计算Xi.a的规则只能使用
· A的继承属性
· Xi左边的文法符号Xj的继承属性或综合属性。
· Xi自身的继承或综合属性。且这些属性的依赖关系不形成环。
特点:
◼ 依赖图的边总是从左到右,从下到上。
◼ 在扫描过程中,计算一个属性值时相关的依赖
属性都已经计算完成了。
符号表在编译程序各个阶段的作用是什么?
符号表是一张表格,由编译程序建立,存在于内存或磁盘中,用于存储程序编译或运行过程中所使用的变量(标识符)和常量(数字常数、字符常数)等信息。
词法分析阶段:建立符号表,查填符号表,将不重复的标识符、数字常数和字符常数的性质填入符号表中,如:名字、类型、数值等,并且将变量(或常数)在符号表中的入口地址写到其自身的TOKEN字中。
语法分析阶段:主要是使用符号表。在分析过程中,需要用到某个标识符(或常数))时,就从符号表的指定入口处查找出该符号。
语义分析及中间代码生成阶段:主要是查填符号表。在生成四元式时,通常不使用变量的名字,而是使用它们在符号表中的入口位置。另外,在翻译说明语句时,要向符号表中填入变量的类型信息等。
数据存储分配:将变量(或常数)所使用的数据区映像地址写入符号表中的地址(ADDR)栏。若数据区是动态数据,则在符号表中存储过程层号和位移量等信息,待运行时再计算具体地址。
代码优化阶段:使用符号表。一方面,遇到变量时,要到符号表中查找它的具体信息,另一方面,在优化过程中,也有可能要使用符号表,例如在进行合并已知量的优化时,要检查变量是否有常数值,这时要使用符号表的数值(VAL)栏进行判断。
目标代码生成阶段:在此过程中主要是查找符号表,为最终生成目标代码提供必要的信息,如建立DAG节点标记时使用符号表暂存变量的引用活跃信息。
自顶向下翻译的思想是什么?FIRST集和FOLLOW集的作用?
寻找输入符号串的最左推导,再试图根据当前输入单词判断使用哪个产生式。
什么是受控的副作用?举两个语法制导定义中的受控副作用的例子并说明他们的作用
在翻译过程中多余的动作,并且对语法翻译没有产生影响的动作。
指出quicksort的访问链。在图中画出来(PPT中的四条线)。
访问链被用于访问非局部的数据。
如果过程p在声明时嵌套在过程q的声明中,那么p的活动记录中的访问链指向上层的q的活动记录。
从栈顶活动记录开始,访问链形成了一个链路,嵌套深度逐一递减。
s
r
e
q
p
显示表:
d1指向深度为1的最近一次的活动(s),d2指向深度为2的最近一次的活动(q(1,9)然后q(1,3)然后e(1,3)),d3指向深度为3的最近一次的活动(p(1,3));同深度之间后一次要指向前一次