第八章1中间代码.ppt
《第八章1中间代码.ppt》由会员分享,可在线阅读,更多相关《第八章1中间代码.ppt(61页珍藏版)》请在三一办公上搜索。
1、第八章符号表、中间代码及其管理,符号表中间表示的介绍中间代码的形式语言结构的翻译中间表示(IR)的设计更象一种艺术,受到设计者个人风格的影响,符号表的作用,收集符号的属性根据程序的声明部分,收集标识符的各种属性,并在符号表中登记显式声明语言和隐式声明语言临时变量表项数据类型作用域和可见性语义合法性检查的依据属性的一致性和合法性声明的唯一性 标识符的地址分配依据,标识符的存储种类、可见性和生命期(1),存储种类大多数语言允许指定变量的存储种类指明了变量的作用域、可见性和生命期作用域规则也决定了符号表的结构和动态时变量访问的形式作用域:静态的程序单元,可嵌套分程序结构可见性:与作用域相关一个变量的
2、可见性指这个变量名指定一个特定的实例的区域C语言中全局量和局部量的可见性生命期:在运行时刻,变量从第一次可见到最后一次可见之间的时间段,标识符的存储种类、可见性和生命期(2),全局类型的变量几乎所有的语言都有这类变量其生命期覆盖了程序的整个执行出现的位置对作用域的限定可以被局部量的声明覆盖声明的形式Pascal的最外层作用域声明的变量C语言的全局量extern:其它文件可见,全局量file、module:局部于某个文件和模块Fortran:common变量特殊性:只有声明了同名公用块的过程才可见,标识符的存储种类、可见性和生命期(3),自动变量(栈变量)作用域只是其声明出现的程序单元,不具有全
3、局作用域生命期只是这个程序单元的一次活动程序块和过程静态变量C语言中的static属性变量或Fortran语言中的save变量在过程中声明,但其结合的存储单元在程序的整个执行期间都保持作用域不能扩展值可以跨越过程的活动有效,标识符的存储种类、可见性和生命期(4),数据对象的动态生命期动态作用域具有易变属性(volatile)的变量其值的修改是异步的,如I/O设备对程序的优化有重要影响,编译器难以自动判断变量是否易变a=b+5c=d*(b+5)如果b或a是volatile的,则不能用a代替第二个赋值语句中的b+5寄存器变量,符号需要记录的典型属性,名字 类型描述Name 字符串符号的名字Clas
4、s 枚举类型存储种类Volatile 布尔型易变量Size 整型这个符号占据内存的字节数Bitsize 整型这个符号占据内存的数位数Boundary 整型对齐的字节数Bitbdry 整型对齐的数位数Type 指针/枚举数据类型Basetype 指针/枚举构造类型的元素类型Machtype 枚举机器定义类型Nelts 整型元素个数Register 布尔型这个变量是否存在寄存器中Reg 字符串对应的寄存器名Basereg 字符串基址寄存器名Disp 整型偏移量,标识符属性介绍(1),符号名变量名、函数名和过程名等在一个作用域内,变量一般不允许重名重名变量根据作用域规则处理重载的过程或操作名:依靠参
5、数的个数、类型和返回值的类型区分,以达到唯一性符号的类型变量、函数名等有类型类型的种类:基本类型、组合类型为类型检查提供条件类型的描述:类型的枚举类型表,标识符属性介绍(2),符号的存储种类存储种类的决定根据显式的关键字决定存储种类Fortran语言中的COMMON、SAVE等C语言中的Static、register等符号声明的位置存储种类是语义处理、检查和存储分配的重要依据决定了变量的作用域、可见性和生命期等符号的作用域和可见性全局量:程序的整体局部量:局部作用域、可见性,存储分配在活动记录中,结合随着活动的结束而释放静态量:局部作用域、可见性,存储分配在静态数据区域中,结合不会随着活动的结
6、束而释放形式参数:局部作用域、可见性,存储分配由于参数传递的方式不同而有所变化,标识符属性介绍(3),符号的存储分配信息所在存储区域静态存储区域动态存储区域相对地址和偏移量数据对齐结构分量和结构的关系符号的其它属性形式参数?数组?初值?等价变量?,符号表的分类,可以构造一个统一的符号表集中管理各类表项存在巨大的差别,管理复杂属性完全相同的符号构成一个表每个符号表的属性结构完全相同,个数一致管理简单符号表过多分类符号表具有类似属性的符号构成一种符号表类型表、常数表、标号表、符号表等同一个表中部分表项有效的属性的处理,部分表项有效的属性的处理,如果符号a和b同时进入一个符号表,a有s1,s2,s3
7、三种属性,b有s1,s2,s4三种属性冗余表示的方法符号表中有4个属性域:s1,s2,s3,s4各个符号要求的属性域的简单聚集s3和s4可能是冗余的,浪费空间操作简单复用表示的方法符号表中有3个属性域:s1,s2,s34根据各个属性域的使用情况,当一些域的使用随着符号种类的不同而不会重叠时可以考虑将其合并,引用时根据符号种类的不同来决定这个域的解释空间比较节省操作复杂,符号表表项的设计,元组表示将每个符号表的表项表示为一个元组元组的每个分量表示符号的一种属性或一组属性a:array 1.3,1.5 of char;可以表示为:,char,定长域的记录可用相应的数据类型来表示,如符号存储的长度、
8、是否为易变量或静态量等不定长域的记录如果最大长度适中,可以按最大长度空间,但可能浪费可以用动态指针,动态申请数据空间符号名、数组的内情向量等,结构化符号表表项的设计,结构化的表示方法不同种类的符号对应不同结构类型一类符号可能是另一类符号的特例:符号名和过程名、过程名和函数名等,如何表示这些种类的符号间的关系?综合成一个通用的结构:个性属性的域可以如下解决冗余项域的不同解释专用的结构:每一小类的符号有专门的结构表示不同的数据结构间存在的“基本结构 vs.特例结构”间的关系表示麻烦操作的通用性考虑某些操作对不止一类符号有意义,但是数据结构的不同导致这些操作可能难以通用可以用冗余域作为填充,实现通用
9、,struct Nameblockfield tag;int index;field vtype;field vclass;field vstg;expptr vleng;char varnameVL+2;unsigned vdovar:1;unsigned vdcldone:1;unsigned vadjdim:1;unsigned vsave:1;unsigned vprocclass:3;unsigned vregno:4;unsigned varray:1;unsigned vequiv:1;,unionint varno;struct Intrpacked intrdesc;/*bi
10、ts for intrinsic function*/vardesc;int veqno;struct Dimblock*vdim;ftnint voffset;unionstruct Headblock*hp;Chainp namelist;/*points to chain of names in*/Chainp vstfdesc;/*points to(formals,expr)pair*/varxptr;int enamep;int index_varxptr;/*名字是语函时为语函描述链头的链区索引*/*名字是段头时为符号常数链头的链区索引*/*name is namelist的链区
11、索引*/*参数块时是否要在前申明类型*/int index_dim;/*由于该结构要强制转换为Pramblock,故新加的数据结构应在末尾处*/int length;unsigned is_shared:1;/*该变量是否为共享变量*/,面向对象的符号表表项设计,不同种类的符号对应不同的类(class)符号表的一个表项就是某个类的一个实例继承关系的应用表示不同种类的符号间存在的固有关系过程名类是符号基类的子类省略了相同属性的重复声明增加新的域表示子类符号的新属性,如过程名类中增加关于形式参数链的域等父类中的某些属性在子类中是不需要的,此时可以不必考虑这些属性,如符号类中可能有类型域,但过程名类
12、中,这个域是不需要填充和管理的父类中的某些域可以在子类中重新解释,class Symbol:public Basic protected:SYMBTAGm_tag;CString*m_pName;class VarSymbol:public Symbol protected:union struct unsignedm_bInitialized:1;/*has initialize value*/unsignedm_bUsed:1;/*be used in this procedure*/unsignedm_bReturn:1;/*return value*/unsignedm_bArgume
13、nt:1;/*formal argument flag*/unsignedm_bStatic:1;/*static variable*/unsignedm_bGlobal:1;/*global variable*/unsignedm_bExternal:1;/*external variable*/unsignedm_bCallRule:2;/*0:default,1:value,2:reference,3:content*/;UINT32 u;Type*m_pType;Expression*m_pInitExpr;,class ProcedureSymbol:public Symbol pr
14、otected:union struct unsignedm_bSubProcedure:1;/*subprocedure flag*/unsignedm_bHasDeclaratives:1;/*has decl part*/;UINT32 u;Type*m_pProcType;/*procedure type*/CompoundStmt*m_pBodyStmt;/*body state of this proc,including declaratives*/INT32m_iProcIndex;/*procedure index*/ProcedureSymbol*m_pParentProc
15、edure;/*parent proc symbol*/ProcedureList*m_pSubProcedureList;/*sub-proc list*/SymbList*m_pFormalArgs;/*formal argument list*/ProcSymbTable*m_pCurPorcSymbTable;/*sym tab of proc*/;,符号表表项的排列方法(1),线性表按扫描的先后次序建立管理简单效率低:查找要扫描整个表如果符号表的表项数目比较小(如小于20项),这种方式效果比较好排序组织和二分法按符号的排序值建表可以实现为二叉树的形式,插入和查找按二分法进行空间开销和
16、存储开销与线性表基本相同效率好于线性表、但算法复杂性也高于线性表,符号表表项的排列方法(2),散列表(hash表)根据符号名的Hash函数值决定表项的位置不同的符号具有相同Hash函数值的处理散列冲突可以通过更多次的Hash解决编译器通常采用的方法:从冲突的下一项开始寻找空白表项,找到后作为欲插入的表项,具有相同的Hash值的表项建立一个链对满的Hash表再插入新的表项会引起溢出Hash函数的设计影响符号表的效率编译器的设计者根据经验和实验决定Hash函数通常采用对名字的字符串叠加等方式决定Hash函数值在散列表的基础上,增加一个顺序链将各个表项连接起来,符号表表项的排列方法(3),散列表的例
17、子Key1Key2Keyn Hash Keys 符号表表项,符号表的分层管理,程序的结构一个程序包含一系列的文件或模块等文件和模块包含一系列的过程等过程可能有分程序结构全局符号表:记录全局量、全局可见的过程名等各个文件和模块的符号表指针文件或模块的符号表记录文件或模块可见的名字过程符号表指针过程符号表程序块的符号表,class SymbTable:public Basic protected:SymbList*m_pSymbList;TypeList*m_pTypeList;SymbTable*m_pParentSymbTable;class ProcSymbTable:public Symb
18、Table private:ProcedureSymbol*m_pProcSymbol;SymbList*m_pArgsList;class FileSymbTable:public SymbTable protected:CString*m_pFileName;ProcSymbTabList*m_pProcdureSymbolTableList;class ProjectSymbTable:public SymbTable protected:CString*m_pProjectName;FileSymbTabList*m_pFileSymbolTableList;,局部符号表的管理,符号表
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八 中间 代码

链接地址:https://www.31ppt.com/p-5998002.html