符号表
最后更新于: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
- 递归
```
';