stringtranslate.com

tabla de símbolos

En informática , una tabla de símbolos es una estructura de datos utilizada por un traductor de idiomas , como un compilador o intérprete , donde cada identificador (o símbolo ), constante , procedimiento y función en el código fuente de un programa está asociado con información relacionada con su declaración o aparición en la fuente. En otras palabras, las entradas de una tabla de símbolos almacenan la información relacionada con el símbolo correspondiente a la entrada. [1]

Fondo

Es posible que una tabla de símbolos solo exista en la memoria durante el proceso de traducción, o puede estar incrustada en la salida de la traducción, como en un archivo objeto ABI para su uso posterior. Por ejemplo, podría usarse durante una sesión de depuración interactiva o como recurso para formatear un informe de diagnóstico durante o después de la ejecución de un programa. [2]

Descripción

La información mínima contenida en una tabla de símbolos utilizada por un traductor y representación intermedia (IR) incluye el nombre del símbolo y su ubicación o dirección. Para un compilador dirigido a una plataforma con un concepto de reubicación, también contendrá atributos de reubicación (absolutos, reubicables, etc.) y la información de reubicación necesaria para los símbolos reubicables. Las tablas de símbolos para lenguajes de programación de alto nivel pueden almacenar el tipo de símbolo: cadena, entero, punto flotante, etc., su tamaño, sus dimensiones y sus límites. No toda esta información se incluye en el archivo de salida, pero se puede proporcionar para su uso en la depuración . En muchos casos, la información de referencia cruzada del símbolo se almacena o se vincula a la tabla de símbolos. La mayoría de los compiladores imprimen parte o toda esta información en tablas de símbolos y listados de referencias cruzadas al final de la traducción. [1]

Implementación

Hay numerosas estructuras de datos disponibles para implementar tablas. Se pueden utilizar árboles, listas lineales y listas autoorganizadas para implementar una tabla de símbolos. Se accede a la tabla de símbolos en la mayoría de las fases de un compilador, comenzando con el análisis léxico y continuando con la optimización.

Un compilador puede usar una tabla de símbolos grande para todos los símbolos o usar tablas de símbolos separadas o jerárquicas para diferentes ámbitos . Por ejemplo, en un lenguaje con alcance como Algol o PL/I, un símbolo "p" se puede declarar por separado en varios procedimientos, quizás con diferentes atributos. El alcance de cada declaración es la sección del programa en la que las referencias a "p" resuelven esa declaración. Cada declaración representa un identificador único "p". La tabla de símbolos debe tener algún medio para diferenciar las referencias a las diferentes "p".

Una estructura de datos común utilizada para implementar tablas de símbolos es la tabla hash . El tiempo de búsqueda en tablas hash es independiente de la cantidad de elementos almacenados en la tabla, por lo que es eficiente para una gran cantidad de elementos. También simplifica la clasificación de literales en formato tabular al incluir la clasificación en el cálculo de la clave hash. [3]

Como el analizador léxico dedica una gran proporción de su tiempo a buscar en la tabla de símbolos, esta actividad tiene un efecto crucial en la velocidad general del compilador. Una tabla de símbolos debe estar organizada de tal manera que las entradas se puedan encontrar lo más rápido posible. Las tablas hash se utilizan generalmente para organizar una tabla de símbolos, donde la palabra clave o el identificador se "hash" para producir un subíndice de matriz. Las colisiones son inevitables en una tabla hash y una forma común de manejarlas es almacenar el sinónimo en el siguiente espacio libre disponible en la tabla.

Aplicaciones

Un archivo objeto contendrá una tabla de símbolos de los identificadores que contiene y que son visibles externamente. Durante la vinculación de diferentes archivos de objetos, un vinculador identificará y resolverá estas referencias de símbolos. Normalmente, todos los símbolos externos no definidos se buscarán en una o más bibliotecas de objetos . Si se encuentra un módulo que define ese símbolo, se vincula con el primer archivo objeto y cualquier identificador externo no definido se agrega a la lista de identificadores que se buscarán. Este proceso continúa hasta que se hayan resuelto todas las referencias externas. Es un error si uno o más quedan sin resolver al final del proceso.

Al aplicar ingeniería inversa a un ejecutable, muchas herramientas hacen referencia a la tabla de símbolos para verificar qué direcciones se han asignado a variables globales y funciones conocidas. Si la tabla de símbolos se ha eliminado o limpiado antes de convertirla en un ejecutable, a las herramientas les resultará más difícil determinar direcciones o comprender algo sobre el programa.

Ejemplo

Considere el siguiente programa escrito en C :

// Declarar una función externa extern double bar ( double x );   // Definir una función pública double foo ( int count ) { double sum = 0.0 ;       // Suma todos los valores bar(1) a bar(count) for ( int i = 1 ; i <= count ; i ++ ) sum += bar (( double ) i ); suma devuelta ; }               

El compilador AC que analiza este código contendrá al menos las siguientes entradas de la tabla de símbolos:

Además, la tabla de símbolos también puede contener entradas generadas por el compilador para valores de expresión intermedios (por ejemplo, la expresión que convierte la ivariable de bucle en a doubley el valor de retorno de la llamada a la función bar()), etiquetas de declaración, etc.

Ejemplo: SysV ABI

Se puede encontrar un ejemplo de una tabla de símbolos en la especificación SysV Application Binary Interface (ABI), que exige cómo se deben distribuir los símbolos en un archivo binario, de modo que diferentes compiladores, enlazadores y cargadores puedan encontrar y trabajar con el mismo de manera consistente. símbolos en un objeto compilado.

La ABI de SysV se implementa en la utilidad nm de GNU binutils . Este formato utiliza un campo de dirección de memoria ordenado , un campo de "tipo de símbolo" y un identificador de símbolo (llamado "Nombre"). [4]

Los tipos de símbolos en SysV ABI (y la salida de nm) indican la naturaleza de cada entrada en la tabla de símbolos. Cada tipo de símbolo está representado por un solo carácter. Por ejemplo, las entradas de la tabla de símbolos que representan datos inicializados se indican con el carácter "d" y las entradas de la tabla de símbolos para funciones tienen el tipo de símbolo "t" (porque el código ejecutable se encuentra en la sección de texto de un archivo objeto). Además, el uso de mayúsculas en el tipo de símbolo indica el tipo de vínculo: las letras minúsculas indican que el símbolo es local y las mayúsculas indican un vínculo externo (global).

Ejemplo: la tabla de símbolos de Python

El lenguaje de programación Python incluye un amplio soporte para crear y manipular tablas de símbolos. [5] Las propiedades que se pueden consultar incluyen si un símbolo dado es una variable libre o una variable vinculada , si es un alcance de bloque o un alcance global , si se importa y a qué espacio de nombres pertenece.

Ejemplo: tablas de símbolos dinámicas

Algunos lenguajes de programación permiten manipular la tabla de símbolos en tiempo de ejecución, de modo que se pueden agregar símbolos en cualquier momento. Racket es un ejemplo de tal lenguaje. [6]

Tanto el lenguaje de programación LISP como el Scheme permiten asociar propiedades genéricas y arbitrarias con cada símbolo. [7]

El lenguaje de programación Prolog es esencialmente un lenguaje de manipulación de tablas de símbolos; Los símbolos se llaman átomos y se pueden razonar las relaciones entre los símbolos. De manera similar, OpenCog proporciona una tabla de símbolos dinámica, llamada espacio atómico , que se utiliza para la representación del conocimiento .

Ver también

Referencias

  1. ^ ab Cobre y Torczon 2011, p. 253.
  2. ^ Nguyen, Binh (2004). Diccionario de Linux. pag. 1482 . Consultado el 14 de abril de 2018 .
  3. ^ Cobre y Torczon 2011, p. 254.
  4. ^ "nm". fuenteware.org . Consultado el 30 de mayo de 2020 .
  5. ^ tabla simbólica - documentación de Python
  6. ^ Símbolos: documentación de la raqueta
  7. ^ Símbolos: documentación de Guile

Bibliografía