费曼学习法(符号表)

符号表是编译过程中收集标识符信息的一种数据结构,一般有数组、链表、哈希表、二叉搜索树等等。相同的标识符会组织到一起,形成常量表、变量名表、函数名表等等。编译阶段会不断的生成符号表,不断使用符号表去进行解析,这也是编译过程最主要的一个开销。
符号表最主要的作用有三个:
①词法解析阶段:编译器会根据空格把一个一个标识符识别出来,然后在同一个作用域内,按照符号属性分类,记录到符号表中,每个标识符都和它的数据类型、作用域、名称、在内存中的地址等信息绑定到一起。主要就是收集符号的属性。
②语法解析阶段:通过收集到的符号表,进行语法树的建立,主要是为了检查上下文的合法性。比如说在同一个作用域内,搜集到相同名称的变量时,会报错,错误原因是重复定义变量。再比如说,在一个新作用域内,会生成一个新的符号表进行收集信息,那么假如又出现了一个内部作用域,就会再生成一个新的符号表进行收集,并且这个内部作用域对应的符号表会有一个指针,指向上一层外部作用域所对应的符号表,当需要解析这个标识符时,如果在当前作用域的符号表内找不到,就要顺着指针到上一层作用域对应的符号表中查找,如果一直到最外层作用域的符号表中都还是找不到,就会报错,错误信息是使用未声明的变量。主要的作用其实就是检验上下文的合法性。
③代码经过预处理、编译、汇编之后,生成的是目标文件,在linux下就是.O文件,这种文件携带有很多符号表,那么需要经过链接器,把这些.O文件打包,链接,生成最终的可执行二进制文件。那么这个过程就需要符号表,确定标识符在最终二进制文件中的相对地址和所在的内存布局区域。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值