欢迎来到天天文库
浏览记录
ID:41122134
大小:76.00 KB
页数:4页
时间:2019-08-16
《编译原理课件总结》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、符号表也称为环境(environment),其作用是将标识符映射到它们的类型和存储位置。在处理类型、变量和函数的声明时,这些标识符便与其在符号表中的“含义”相绑定。每当发现标识符的使用(非声明性出现)时,便在符号表中查看它们的含义。程序中的每一个局部变量都有一个作用域(scope),该变量在此作用域中是可见的。当语义分析到达每一个作用域的结束时,所有局部于此作用域的标识符都将被抛弃。第六章通常意义上的“栈”:支持压入(push)和弹出(pop)操作的数据结构。但是,局部变量会成批压入和弹出栈,而且,当局部变量在栈
2、中被创建时,它们一般不会被立刻初始化。最后,当向栈中压入很多变量之后,还会需要访问压在栈顶之下较深的变量。因此,抽象的压入和弹出模式并不适合。l可以将栈看成是一个大型数组,并带有一个特殊寄存器,即栈指针(stackpointer)。l栈中空间的划分:l超出栈指针的所有位置为自由存储空间(garbage);l位于栈指针之前的位置为已分配存储空间(allocated)。l栈通常只在函数的入口处增长,它通过增加足以容纳该函数的所有局部变量的一片存储空间来扩大栈。栈在函数的出口处收缩,收缩的空间就是入口时扩大的空间。栈中
3、用来存放一个函数的局部变量、参数、返回地址和其他临时变量的这片区域称为该函数的活动记录(activationrecord)或栈帧(stackframe)。设函数g(…)调用函数f(a1,a2,…an):g是调用者(caller);f是被调用者(callee)。在进入函数f时,栈指针(StackPointer)指向g传递给f的第一个参数。在f的入口,f简单地使SP减去帧的长度而分配一个新栈帧。原来的SP则变成了当前的帧指针(FramePointer)。某些栈帧布局中:FP是一个单独的寄存器;原来的FP保存在存储器中
4、(栈帧内)。当函数f退出时,需要复制FP到SP,并取回保存在存储器中的FP。适合于栈帧大小可变或不连续的情况。如果栈帧的大小是固定不变的,则对于每一个函数f,FP与SP所指的位置总是相差一个已知的常数:“虚”寄存器FP=SP+栈帧大小。将局部变量、表达式的中间结果和其他值保存在寄存器中,而不是放在栈帧中,将有助于编译生成的程序快速地运行。算术指令可以直接访问寄存器。假设函数f在用寄存器r保存了它的一个局部变量的同时调用过程g,而过程g也需用r完成自己的计算:l在g使用r之前先将r保护起来(将它保存在栈帧内);l完
5、成计算而不再需要时将r恢复(从帧栈中取回被保存的内容)。保护和恢复该寄存器的责任:l如果由调用者f来保护和恢复,则称r为调用者保护的(caller-save)寄存器;l如果由被调用者g来保护和恢复,则称r为被调用者保护的(callee-save)寄存器;保护和恢复寄存器的特殊情况:l如果f知道某个变量x的值在函数调用以后将不再需要,它可以把x放在一个调用者保护的寄存器中,并且在调用过程g时不保护它。l如果f有一个局部变量i,并且在若干次函数调用之前和之后都需使用,则可以把i放在某个被调用者保护的寄存器ri中,并且
6、只在f的入口保护ri一次,在f的出口将ri取回一次。这样,明智地为局部变量和临时变量选择调用者或被调用者保护的寄存器,便可以减少程序执行存储操作的次数。第七章中间表示(Intermediaterepresentation,IR):是一种抽象机器语言,它可以表示目标机的操作而不需太多地涉及机器相关的细节且独立于源语言的细节。前端(frontend):lexicalanalysis、parsing、semanticanalysis,andtranslationtointermediaterepresentation.
7、后端(backend):optimizationoftheintermediaterepresentationandtranslationtomachinelanguage一种好的中间表示(IR)应具有以下一些特点:–便于在语义分析阶段生成它;–对于希望支持的所有目标机,它必须便于转变成真实的机器语言;–每一种结构必须具有简单而清晰的含义,以便能够较简单地指定和实现重写中间表示的各种优化变换(optimizingtransformations)。中间表示中的个体成分(individualcomponents)应该
8、只描述特别简单的事情:如单个取、存、加法、传递或转移等操作。表达式(T_exp)代表某个值的计算:lCONST(i):整型常数i;lNAME(n):符号常数n;lTEMP(t):临时变量t,抽象机器中的临时变量类似于真实机器中的寄存器,但可以有无限多个临时变量。lBINOP(o,e1,e2):对操作数e1,e2施加二元操作符o表示的操作。l其中T_binOp的定义如下:n
此文档下载收益归作者所有