Javac (J2SE) 编译器符号表管理介绍.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Javac (J2SE) 编译器符号表管理介绍

4 符号表管理符号表管理 符号表管理符号表管理 4 符号表管理 1 4.1 GJC 中符号表管理相关的类 2 4.2 Java 语言中符号的种类 3 4.3 符号名字的管理 5 4.4 符号的表示 9 4.5 类型的表示 12 4.6 可见性的管理 16 4.7 符号表管理程序运行实例分析 21 4.8 符号表管理小结 23 符号表 (symbol table )在编译的过程中起着非常重要的作用,主要体现在它一方面可 以帮助语义分析程序进行语义正确性检查,另一方面可以辅助代码生成器生成正确的代码。 对符号表的操作主要是两种,插入和检索。通常,在编译过程中每遇到对符号的定义,编译 器就要检索符号表,检查这个符号是否已经存在。若是属于重复定义,则报告错误信息;若 是一个新的名字,则填入符号表中去。在编译的过程中遇到对某个符号的使用,编译器要检 索符号表,检查该符号是否已经定义,并按照符号表中的定义来使用符号。 符号表中存储的是与符号相关的属性。这些属性主要有: 符号的名字 (Name ) 符号的种类 (kind ),例如,符号可以分为表示类型的符号,表示方法的符号,表示变 量的符号 符号的类型 (type ),例如,整型,无符号整型,单精度浮点型,布尔型,指针类型, 数组类型等等 对于不同种类和类型的符号有着该种类和类型特有的信息,例如,对于方法,符号表要 存储和它相关的信息,这包括这个方法参数的个数,参数的类型,方法返回值的类型。 对于传统语言中的结构体和面向对象语言中的类,符号表要存储成员的个数,成员的名 称、类型、偏移等信息。 在符号表中存储了很多复杂的信息,不同的符号及其相关联属性是不同的,因此符号表 结构的设计就显得非常重要,否则会造成存储空间的浪费。 另一方面在编译的过程中,对于符号表的操作是非常频繁的,早期的研究 (Mckeeman 1974)指出,在某种语言的编译器中,当使用线性查找的方法时,有将近四分之一的编译时 间是消耗在符号表的操作上了。虽然这个比例在不同的编译器中会有不同的比值,在现代编 译器中由于编译器在代码的优化上花费了大量时间力争提高生成的代码的质量,从而使符号 表操作所占的时间比例有所缩小,但是这个时间仍是一个不可轻视的问题。 符号表的两种操作 (插入和检索)是相关联的。对于无序的符号表,插入表项时非常简 单不需要维护某种有序的状态,简单地把最新的表项放到符号表的最后即可,而且插入操作 时间开销很小;然而,相应的检索操作就要从头检索到尾,非常耗时。对于有序符号表,在 符号的插入阶段,要维护某种有序的状态,要慢于无序符号表的插入操作,但是检索时可以 使用折半查找法提高速度。 前面讨论的两种符号表的组织方式其查表的平均查找长度都与具体的表长有关。在现代 编译器中,对于符号表的组织和管理一般采用哈希表的技术,大幅度提高了符号表两种操作 的速度。哈希技术本质上是查表时间与表中记录数量无关的一种符号表组织方式。为了充分 描述哈希表的概念,这里需要引入一些新的术语。 名字空间名字空间 K 是可以在程序中出现的变量名的集合。 名字空间名字空间 地址空间地址空间 A 是表中记录存储单元的集合{1,2 ,3 。。。m} 。 地址空间地址空间 负载因子负载因子是空间利用率的重要衡量标准,它被定义为表中记录个数与记录存储单元之 负载因子负载因子 比。如果表中当前有n 个记录,则负载因子α=n/m 。 哈希函数哈希函数在形式上被定义为一个映射 H:K→A 。即哈希函数H 将一个变量名取做它的变 哈希函数哈希函数 元并产生一个存放该变量属性的表地址。 通常名字空间中的每一元素都是由字母和数字所组成的字符串,把这个字符串变成容易 利用哈希函数进行处理的形式,称作预处理。 采用最广的哈希函数是除法,它被定义为: H(x)=(x mod m)+1 这里假设存储单元共有 m 个,而且地址的编号是从 1 开始的。如果地址的编号是从 0 开始的那么哈希函数就简化为: H(x)= x mod m 哈希函数完成了名字空间到地址空间的映射,但是我们忽略了地址冲突的问题。哈希函 数是一个多对一映射,而且一般来说名字空间亦要比

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档