驱动开发系列69 - GLSL编译器实现 - 符号表的定义
一:概述
在编译器中,无论是C、C++ 还是 GLSL,都需要管理源代码里的标识符,比如(变量,函数,结构体,内置函数等),这个管理就是通过:符号表 来完成的。
符号表有以下几个作用:
1. 存储符号信息,每个符号都有对应的信息,拿变量来说,有名字,类型,作用域(局部/全局),数据地址,大小,引用次数,自定义析构函数等。
2. 在 C、C++ 以及 GLSL 等语言中,作用域是分层次的,包括全局作用域、函数作用域以及代码块作用域等。符号表负责记录当前符号的作用域层级以及父子关系,从而实现快速、准确的符号查找和管理。
3. 快速查找, GLSL 编译器在解析变量或函数时,需要快速定位符号,使用hash表或哈希条目快速查找可加快效率。
二:GLSL符号表举例
#version 450// 全局作用域
uniform mat4 uModelViewProjection; // 全局 uniform
const float PI = 3.14159;vec3 globalLightDir = vec3(0.0, 1.0, 0.0);// 函数作用域
float computeLighting(vec3 normal, vec3 lightDir) {// 局部变量作用域float d