符号表

最后更新于:2022-04-02 04:08:15

[TOC] ## TinScript 运行时的内存分布 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/43/ba/43ba3556c4b98daf216bf05ceff74d8f_800x414.png) - 堆:存类,存链表等 - 未分配: 注意查看 0x0000-0xffff, 堆是自低位向高位增加,栈是高位向地位正常 - 栈:存储的都是规则数据每个都是32位(或者64位) ## 符号表 - 用于存储符号(变量、常量、标签)在源代码中的位置、数据类型,以及位置信息决定的**词法作用域**和运行时的**相对内存地址** - 符号 - 常量表 - 变量表 ### 静态符号表(Static Symbol Table) 实现:哈希表 用途:用于存储常量在常量区的位置 ### 符号系统 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/83/37/8337aad852cf81ebed3c7b3a3f041233_1280x622.png) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/ca/17/ca17cec38b984ae8882890794ec1ac44_400x168.png) 符号表示例: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/a5/28/a528e4b5c1b7e63fb909f7d7d7fdaa49_400x257.png) 注意查看child0 中的b,如果发现不是声明的,则他会有引用指针到上一层 ### 符号运行时编排-符号的Offset ``` var a=0 var b=1 { c=b+1 d=c+1 } { var e=0 var f=1 } ``` - offset 决定符号在内存中编排的**相对位置** - a的offset=0 - b的offset=1 --- - c的offset=0 - d的offset=1 --- - e的offset=0 - f的offset=1 ### 查找符号(递归向上的过程) ``` symbolTable.find - symbolTablle.parent.find - symbolTable.parent.parent.find - 递归 ```
';