Tabla de Símbolos y String Interning

Archivo: src/symbol_table.rs

En el diseño de lenguajes de programación, los identificadores (nombres de variables, funciones, clases, etc.) se repiten constantemente por todo el código fuente. Comparar nombres usando cadenas de caracteres tradicionales (con strcmp u operaciones similares) es lento ($O(n)$ en base al tamaño de la cadena) y consume mucha memoria debido a duplicaciones.

Para resolver esto de forma óptima, Forja implementa una Tabla de Símbolos global con String Interning. Esta técnica almacena únicamente una copia única de cada cadena en memoria y representa cada una mediante un identificador numérico liviano de 32 bits (SymId). Esto permite realizar comparaciones sintácticas y semánticas en tiempo constante ($O(1)$) mediante simples comparaciones de enteros.

Estructuras Clave

struct SymId

Estructura SymId
pub struct SymId(pub u32);

struct SymbolTable

Estructura SymbolTable
pub struct SymbolTable &brace;
    strings: Vec<Rc<str>>,
    lookup: HashMap<Rc<str>, SymId>,
}

Desglose de Funciones de SymbolTable

pub fn new() -> Self

pub fn intern(&mut self, s: &str) -> SymId

pub fn intern_rc(&mut self, s: &Rc<str>) -> SymId

pub fn get(&self, id: SymId) -> &str

pub fn len(&self) -> usize