A Tabela de Símbolos é uma estrutura de dados essencial na arquitetura de um compilador, atuando como o "banco de dados" que conecta as diversas fases da compilação (análise léxica, sintática, semântica e geração de código). Ela armazena informações sobre os identificadores encontrados no código-fonte.
Com base no propósito e no conteúdo típico dessa estrutura de dados, assinale a alternativa que apresenta uma informação que NÃO é armazenada na Tabela de Símbolos.
a. O tipo de dado (ex.: inteiro, real, ponteiro) e o escopo (nível de aninhamento ou bloco) de uma variável declarada no código-fonte.
b. O deslocamento de memória (offset) de uma variável local em relação ao ponteiro base da pilha de execução, utilizado para a geração de código de máquina.
c. O valor dinâmico (estado atual) armazenado em uma variável durante a execução do programa compilado.
d. A assinatura de uma função ou procedimento, incluindo o tipo de retorno, a quantidade de parâmetros e os tipos de dados de cada parâmetro formal.
e. A categoria do identificador (ex.: variável simples, vetor, função, tipo definido pelo usuário) e atributos especiais (ex.: const, volatile, modo de passagem de parâmetro por referência).
A Tabela de Símbolos armazena informações estáticas (conhecidas em tempo de compilação) sobre os identificadores: nomes, tipos, escopos, endereços/offsets, assinaturas de funções, etc.
O valor dinâmico de uma variável, ou seja, o conteúdo efetivamente armazenado nela enquanto o programa está sendo executado, é uma informação de tempo de execução. Esse valor muda conforme o programa roda, depende de entradas do usuário, de cálculos realizados, de chamadas de função, etc. O compilador não tem acesso a esse valor e, portanto, não o armazena em sua tabela de símbolos.
Diante do exposto, vamos analisar cada uma das afirmações a seguir:
a. O tipo de dado (ex.: inteiro, real, ponteiro) e o escopo (nível de aninhamento ou bloco) de uma variável declarada no código-fonte.
Sim, pois são essenciais para a análise semântica (verificação de tipos e regras de escopo).
b. O deslocamento de memória (offset) de uma variável local em relação ao ponteiro base da pilha de execução, utilizado para a geração de código de máquina.
Sim, sendo atribuído durante a geração de código para que o compilador saiba como acessar a variável em memória.
c. O valor dinâmico (estado atual) armazenado em uma variável durante a execução do programa compilado.
Não, este valor só existe em tempo de execução (runtime), na memória do computador, quando o programa já compilado está rodando. O compilador não tem como conhecer nem armazenar esse valor.
d. A assinatura de uma função ou procedimento, incluindo o tipo de retorno, a quantidade de parâmetros e os tipos de dados de cada parâmetro formal.
Sim, sendo necessária para validar chamadas de função e gerar o código de invocação correto.
e. A categoria do identificador (ex.: variável simples, vetor, função, tipo definido pelo usuário) e atributos especiais (ex.: const, volatile, modo de passagem de parâmetro por referência).
Sim, informações como const, volatile e passagem por referência são fundamentais para as fases semântica e de geração de código.