符号表的作用:
符号表中存放的信息:
记录源程序中出现的各种名字及其属性信息是符号表的首要任务。
同一个名字在一段程序中应该表示同一个对象 即同一个符号表中不能出现相同的名字 因此名字可以作为符号表的关键字。
符号表中的名字:
名字字符长度可变又没有限制 识别起来就很麻烦 解决:
引入一个单独的字符串表 将符号表中的全部标识符集放在这个字符串表 在符号表表项的名字部分只要给出相应标识符的首字符在字符串表中的位置即可
建立了索引呗~
符号表中的属性:
多个独立符号表存储不同种类的符号——重名问题
不同种类符号表所需存放属性信息大小、数量不同——对齐问题 空间浪费
解决:还是指针
用扩展属性指针来表示函数及参数的组织关系。
符号的地址属性:
静态存储分配策略:addr=base+offset
动态存储分配策略:符号的地址是程序执行过程中动态绑定的。
栈式存储分配:i.addr=sp(栈指针)+i.offset(相对于活动记录起始地址的偏移量)
符号表中各符号的地址属性是该符号相对于第一个符号的偏移地址。
Q:基地址另外存储?
符号表的组织结构:
线性表实现:
对有序数组来说:每次查找所需时间为O(log2n) 执行e次即为第一项;
而每次插入符号也需要完成:1.找到应该插入的位置;2.因为是数组 部分数组元素要整体后移来让出这个坑位。
第一步的时间复杂度为logi累加(这里i从1累加是默认从0开始构造的有序数组),平均每次插入要移动的数组元素为i/2,所以第二步的时间复杂度为i/2累加。
散列表实现:
哈希表 根据键值key的值直接访问内存位置。
符号表&作用域:
最近嵌套可看:http://t.csdnimg.cn/d0c9z
实现 :为每个程序块单独建立一个符号表并通过指针来刻画嵌套作用域。
实现2:将所有块的符号表做成一个数组;引入程序块表来建立索引。
局部变量有释放时机:内层块运行完成进入外层块。
不存放块编号的话需要提前存储每一块在符号表中的首尾位置
从上图还能看出一个:插入的时候直接插到链表表头 比如b=1这一条替代b=0成为了表头(这不是数组是链表 这样很河里)
C语言符号表:
一遍走只适用于无嵌套函数的情况
每个函数分别编译成目标代码,最后链接装配成一个可执行程序。
引入局部名字表,用于管理当前编译的函数中的符号 这个表位于符号表中。
这次是为每个函数建造一个符号表 使用指针将符号表之间的参数传递关系描述出来~