自己动手构造编译系统:编译、汇编与链接2.1.3 符号表管理

简介:

2.1.3  符号表管理

  

       符号表是记录符号信息的数据结构,它使用按名存取的方式记录与符号相关的所有编译信息。编译器工作时,少不了符号信息的记录和更新。在本书定义的高级语言中,符号存在两种形式:变量和函数。前者是数据的符号化形式,后者是代码的符号化形式。语义分析需要根据符号检测变量使用的合法性,代码生成需要根据符号产生正确的地址,因此,符号信息的准确和完整是进行语义分析和代码生成的前提。见图2-6。

  对于变量符号,需要在符号表中记录变量的名称、类型、区分变量的声明和定义的形式,如果变量是局部变量,还需要记录变量在运行时栈帧中的相对位置。例如以下变量声明语句:

extern int var;

  该语句声明了一个外部的全局变量,记录变量符号的数据结构除了保存变量的名称“var”之外,还需要记录变量的类型“int”,以及变量是外部变量的声明形式“extern”。

  对于函数符号,需要在符号表中记录函数的名称、返回类型、参数列表,以及函数内定义的所有局部变量等。例如下面的函数定义代码:

int sum(int a,int b)

{

     int c;

     c=a+b;

     return c;

}

  符号表应该记录函数的返回类型“int”、函数名“sum”、参数列表“int,int”。函数的局部变量除了显式定义的变量“c”之外,还暗含参数变量“a”和“b”。

  由于局部变量的存在,符号表必须考虑代码作用域的变化。函数内的局部变量在函数之外是不可见的,因此在代码分析的过程中,符号表需要根据作用域的变化动态维护变量的可见性。

相关文章
|
存储 自然语言处理 编译器
编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)
编译和链接(翻译环境:预编译+编译+汇编+链接​、运行环境)
|
10月前
|
自然语言处理 编译器 C语言
为什么C/C++编译腰要先完成汇编
C/C++ 编译过程中先生成汇编语言是历史、技术和实践的共同选择。历史上,汇编语言作为成熟的中间表示方式,简化了工具链;技术上,分阶段编译更高效,汇编便于调试和移植;实践中,保留汇编阶段降低了复杂度,增强了可移植性和优化能力。即使在现代编译器中,汇编仍作为重要桥梁,帮助开发者更好地理解和优化代码。
205 25
为什么C/C++编译腰要先完成汇编
|
存储 缓存 Linux
C语言编译过程——预处理、编译汇编和链接详解
C语言编译过程——预处理、编译汇编和链接详解
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
|
编译器 C语言
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(二)
|
存储 Unix 编译器
汇编语言----X86汇编指令
汇编语言----X86汇编指令
1044 2
|
存储 机器学习/深度学习 移动开发
汇编语言指令系列
汇编语言指令系列
2768 0
|
存储 移动开发 C语言
【ARM汇编速成】零基础入门汇编语言之指令集(三)
【ARM汇编速成】零基础入门汇编语言之指令集(三)
323 0
|
编译器 C语言 计算机视觉
【ARM汇编速成】零基础入门汇编语言之指令集(二)
【ARM汇编速成】零基础入门汇编语言之指令集(二)
1182 0