Escolar Documentos
Profissional Documentos
Cultura Documentos
TABLA DE SMBOLOS
La tabla de smbolos es una estructura de datos que contiene toda la informacin relativa a cada identificador que aparece en el programa fuente. Los identificadores pueden ser de variables, tipos de datos, funciones, procedimientos, etc. Evidentemente cada lenguaje de programacin tiene unas caractersticas propias que se reflejan en la tabla de smbolos. Cada elemento de la estructura de datos que compone la tabla de smbolos est formado al menos por el identificador y sus atributos. Los atributos son la informacin relativa de cada identificador. Los atributos habituales son: Especificacin del identificador: variable, tipo de datos, funcin, procedimiento, etc. Tipo: en el caso de variables ser el identificador de tipo (real, entero, carcter, cadena de caracteres, o un tipo definido previamente). En el caso de las funciones puede ser el tipo devuelto por la funcin. Los procedimientos se pueden marcar como funciones que no devuelven nada (void). Dimensin o tamao. Puede utilizarse el tamao total que ocupa una variable en bytes, o las dimensiones. As en el caso de variables simples se coloca la dimensin cero, para los arrays la dimensin del array, en el caso de estructuras (struct) o registros (record) el nmero de campos o miembros, en el caso de funciones o procedimientos se puede almacenar el nmero de parmetros, etc. Direccin de comienzo para generar el cdigo objeto. En el cdigo mquina no hay nombre de identificadores, tan slo direcciones de memoria para datos (static, stack,y heap) o para cdigo (usadas por los procedimientos y funciones). Listas de informacin adicional. Contienen informacin de tamao variable, por
Ejemplo: los tipos de los campos miembros de las estructuras o registros, los tipos de los parmetros de estructuras o uniones. Los atributos pueden variar de unos lenguajes a otros, debido a las caractersticas propias de cada lenguaje y a la metodologa de desarrollo del traductor. La tabla de smbolos se crea por cooperacin del anlisis lxico y el anlisis sintctico. El anlisis lxico proporciona la lista de los identificadores, y el anlisis sintctico permite rellenar los atributos correspondientes a cada identificador. El analizador semntico tambin puede rellenar algn atributo. El analizador semntico y el generador de cdigo obtienen de la tabla de smbolos la informacin necesaria para realizar su tarea. Las operaciones fundamentales que se realizan en la tabla de smbolos son la insercin y bsqueda de informacin. En algunos lenguajes de programacin tambin se realizan las operaciones set y reset que activan y desactivan los identificadores locales
~1~
respectivamente. Dada la cantidad de veces que se accede a la tabla de smbolos es necesario que la estructura de datos que alberga la informacin, y los algoritmos de acceso sean optimizados al mximo. En general se utilizan mtodos hash para el manejo de las tablas de smbolos. Las tablas de smbolos constituyen el recipiente donde se almacena toda la informacin relativa al programa fuente en tiempo de compilacin y por tanto se destruyen una vez finalizada la traduccin. Tan slo hay una excepcin en el caso de que se activen opciones de depuracin (debugging), en ese caso los compiladores graban en fichero la tabla de smbolos para poder dar informacin de los identificadores usados en el programa fuente en tiempo de ejecucin. Los fabricantes de compiladores incluyen para esos casos informacin de la tabla de smbolos que emplean.
~2~
En los traductores y compiladores, las TS existen nicamente en tiempo de compilacin, aunque en depuracin (debug) pueden estar almacenadas en disco y dar informacin en tiempo de ejecucin para identificar los smbolos que se deseen inspeccionar. En los intrpretes contienen informacin en tiempo de ejecucin. Las palabras reservadas no estn en la TS.
Una forma de organizacin simple es imaginar la TS como una tabla con una serie de filas, cada fila contiene una lista de atributos que estn asociados a un identificador, tal como se muestra en la Tabla 1. Las clases de atributos que aparecen en una TS dependen de la naturaleza del lenguaje de programacin para el cual est escrito el compilador. Por ejemplo, un lenguaje de programacin puede no tener tipos, entonces el atributo tipo no necesita aparecer en la tabla. La organizacin de la TS variar segn las limitaciones de memoria y tiempo de acceso donde se implemente el compilador.
~3~
La lista siguiente de atributos no es necesaria para todos los compiladores, sin embargo cada uno de ellos se puede utilizar en la implementacin de un compilador particular. Nombre de identificador. Direccin en tiempo de ejecucin a partir de la cual se almacenar el identificador si es una variable. En el caso de funciones puede ser la direccin a partir de la cual se colocar el cdigo de la funcin. Tipo del identificador. Si es una funcin, es el tipo que devuelve la funcin. Nmero de dimensiones del array, o nmero de miembros de una estructura o clase, o nmero de parmetros si se trata de una funcin. Tamao mximo o rango de cada una de las dimensiones de los arrays, si tienen dimensin esttica. Tipo y forma de acceso de cada uno de los miembros de las estructuras, uniones o clases. Tipo de cada uno de los parmetros de las funciones o procedimientos. Valor del descriptor del fichero y tipo de los elementos del fichero en el caso de lenguajes basados en ficheros homogneos. Nmero de la lnea del texto fuente en que la variable est declarada. Nmero de la lnea del texto fuente en que se hace referencia a la variable. Campo puntero para construir una lista encadenada que permita listar las variables en orden alfabtico en las fases de depuracin de cdigo. Nombre del Identificador Los nombres de los identificadores deben estar siempre asociados en la TS, pues as son localizados por el analizador semntico y por el generador de cdigo. El primer problema en la organizacin de la TS es la variacin en la longitud de los nombres de los identificadores. En las primeras versiones de los lenguajes de los aos sesenta tales como el BASIC y el FORTRAN, los identificadores tenan como mximo seis caracteres significativos, el problema era mnimo y poda almacenarse el identificador completo en una longitud de campo con un tamao fijado de antemano. Sin embargo las normas ANSI e ISO de los lenguajes C, C++ y PASCAL permiten un mnimo de 31 caracteres. Si se reservase un espacio fijo de 31 caracteres, las TS que utilicen esta forma de almacenamiento gestionaran la memoria de una forma poco eficiente, aunque el acceso a las tablas es rpido. La poca eficiencia se debe a los huecos dejados por los identificadores con nombres cortos. La manera en que se implementar el nombre depender del lenguaje de programacin en que se implemente la propia TS. En los lenguajes como C y C++ se puede utilizar un campo del tipo puntero a carater (char*) y reservar la memoria dinmica necesaria en cada caso. Tambin en lenguajes como C++, Java, C#, etc. se puede utilizar directamente el tipo String (o equivalente) de la propia biblioteca del lenguaje. Otra solucin para almacenar los nombres de las variables es colocar un descriptor de cadenas de caracteres (strings) en el campo del nombre del identificador. El descriptor Docente: Ing. Mirko Manrique Ronceros ~4~
contiene la posicin y longitud de los subcampos del string donde se encuentra el nombre del identificador tal y como se muestra en la Figura 1, esta forma de acceso a los identificadores es ms lenta pero puede ahorrar bastante almacenamiento.
Atributos de los Identificadores Los identificadores se describen por medio de los atributos que dependern del lenguaje que se est compilando. Algunos de estos atributos se describen en los siguientes prrafos. Direccin en Memoria (Offset) Los lenguajes de alto nivel tienen identificadores, sin embargo en cdigo mquina no existen identificadores, tan solo hay las direcciones donde estn colocados. Si el cdigo objeto que genera el compilador es de muy bajo nivel se tiene que asociar en todo momento a cada identificador su direccin de comienzo. En algunos casos puede que el cdigo objeto sea a nivel de ensamblador, en dicho caso pueden no hacer falta direcciones dado que en el ensamblador se pueden utilizar identificadores. La TS ayuda al generador de cdigo a generar el cdigo objeto, sustituyendo los identificadores por sus direcciones. Las direcciones suelen ser relativas, es decir desplazamientos (offsets) desde una direccin base. As en la Tabla 1 se han colocado STATIC+X, sealando STATIC a la direccin de comienzo de los identificadores del segmento esttico (habitualmente constantes y variables globales). El montador de enlaces (linker) es el encargado de pasar direcciones relativas a absolutas.
~5~
El atributo tipo se almacena en la TS cuando los lenguajes a compilar tienen distintos tipos de datos definidos explcita o implcitamente. Por supuesto, los lenguajes sin tipos no tienen este atributo. Un ejemplo de tipos definidos implcitamente se da en el lenguaje FORTRAN, pues si no se asignan o se declaran previamente, todas las variables cuyo nombre comienza con I, J, K, L M son variables enteras. Todas las dems son reales. El tipo de la variable se utiliza en las comprobaciones semnticas de las sentencias. El tipo tambin se usa como indicacin de la cantidad de memoria que debe ser reservada en tiempo de ejecucin. Por ejemplo, si el tipo es integer, suele ocupar la mitad de un float. Generalmente, el tipo de una variable se almacena en forma de cdigo, as el tipo de float se puede codificar como F, integer como I, carcter como C, etc. El tamao de los tipos de datos depender de cada implementacin del lenguaje, aunque el constructor del compilador suele aprovechar al mximo las caractersticas de mximo rendimiento de la mquina objeto. Nmero de Dimensiones, de Miembros o de Parmetros Los atributos nmero de dimensiones, nmero de miembros y nmero de parmetros son importantes para la verificacin semntica. El nmero que indica la dimensin de un array tambin se utiliza como parmetro en la frmula general de clculo de la direccin de un elemento particular del array. El nmero de parmetros en la llamada a un procedimiento o funcin debe coincidir con el nmero que aparece en la declaracin del procedimiento o funcin. Dependiendo del lenguaje en que se implemente la TS, puede ser conveniente combinar los dos atributos anteriores en uno, ya que la verificacin semntica de ambos es similar. En la Tabla 1 se ha considerado que la dimensin de los identificadores simples es 0, de los arrays unidimensionales 1, de los arrays bidimensionales 2, etc Valor Mximo de las Dimensiones o Rangos de Arrays En la TS debe almacenarse el valor mximo que puede alcanzar un array, as cuando se declara una array en C o en C++, el rango de valores comienza en cero, pero debe almacenarse el nmero de elementos del array: int vector [10], matriz[20][30]; El valor 10 (nmero de elementos del array) o 9 (ltimo subndice permitido) debe almacenarse como atributo del vector, dado que es necesario para calcular la posicin de los elementos vector[i] en la generacin de cdigo. Lo mismo se puede decir de los valores 20 y 30 del array bidimensional matriz. Docente: Ing. Mirko Manrique Ronceros ~6~
En lenguajes como PASCAL se permite definir un rango de valores entre los cuales varan los subndices de los arrays, as por ejemplo: VAR vector : ARRAY [10..20] OF INTEGER; matriz : ARRAY [-10..10, -25..100] OF INTEGER; En estos casos es necesario almacenar el valor inferior y superior del rango. Si el lenguaje de programacin no tiene un valor mximo de dimensiones de los arrays, es necesario definir una lista dinmica con los valores mximos o rangos de cada dimensin del array. Una solucin ms rpida, pero mucho ms limitada, es definir un tamao mximo de dimensiones de los arrays y dejar un campo de tamao fijo para almacenarlos. Esto ltimo era clsico en los compiladores de FORTRAN77, dado que en dicho lenguaje slo se permitan arrays pentadimensionales. Tipo y Forma de Acceso de los Miembros de Estructuras, Registros, Uniones y Clases El tipo de cada uno de los miembros de una estructura, unin o clase, debe ser almacenado en la TS. En el caso de clases tambin debe almacenarse la forma de acceso, as por ejemplo C++ permite las formas de acceso public, private y protected. En el caso de la declaracin de funciones amigas (friend), tambin el nombre de estas debe ir ligado a la clase. En el caso de los tipos simples, en la TS, los tipos se representan habitualmente por las constantes indicadas en el apartado 0. Sin embargo una estructura puede tener anidada otra estructura. En el caso de aparecer otras estructuras definidas previamente, se utilizar el identificador que representa a dicha estructura. Tambin puede ocurrir que tengan varias variables de un tipo estructura al cual no se le ha dado un nombre, en ese caso puede optarse por un puntero que seale donde est definida la estructura o por repetir la estructura para cada identificador. La representacin de las uniones es similar a la de las estructura, excepto en el tamao que ocupan, las uniones tan solo utilizan el tamao del miembro mayor en bytes. Las clases tienen datos y mtodos. La parte de datos se representa como las estructuras, pero los mtodos se almacenan de forma parecida a las funciones, indicando el nombre, tipo de resultado que devuelven, as como el nmero y tipo de parmetros. Por otro lado, tambin tiene que asociarse los accesos (private, public, protected), se sealan las funciones amigas (friend) y se deben almacenar los constructores, destructores y mtodos virtuales.
~7~
El tamao de una clase, adems, tambin debe reservar espacio para un puntero a la tabla de mtodos virtuales. Dado que los lenguajes de programacin no colocan un lmite al nmero de miembros de las estructuras, uniones y clases, ser necesario implementar una lista dinmica para almacenarlos. En algunas implementaciones sencillas se deja un campo de longitud fija, restringiendo el valor mximo del nmero de miembros Tipo de los Parmetros de las Funciones, Funciones Libres, Procedimientos o Mtodos de las Clases El tipo que devuelve una funcin suele ir asociado al tipo base del identificador (ver apartado 0), sin embargo los tipos de sus parmetros deben de ser almacenados en la TS para realizar las comprobaciones semnticas. Los tipos de los parmetros se obtienen en lenguajes como C y C++ de la declaracin de las funciones prototipo. Dado que los lenguajes de programacin no colocan un lmite al nmero de parmetros de las funciones y procedimientos, ser necesario implementar una lista dinmica para almacenarlos. En algunas implementaciones sencillas se deja un campo de longitud fija restringiendo el valor mximo de nmeros de parmetros. Descriptor de Ficheros En la TS se puede almacenar el descriptor del fichero o handle de bajo nivel que est asociado al identificador del fichero y que se utilizar en la generacin de cdigo. En el caso de lenguajes como PASCAL, en los cuales la declaracin del fichero incluye la definicin del tipo de sus elementos, tambin es necesario almacenar dicho tipo. Otros Atributos Los depuradores de cdigo (debuggers) y los analizadores de rendimiento (profilers) utilizan informacin de la TS en tiempo de ejecucin, por lo que las distintas implementaciones de los compiladores incorporan informacin adicional en la TS para estas herramientas que acompaan a los compiladores. Las listas de referencias cruzadas son otros tipos de atributos que proporcionan una ayuda importante cuando se est en fase de depuracin. Estas listas contienen algunos de los atributos vistos anteriormente, tambin contienen el nmero de lnea del texto fuente donde la variable se declar (si est declarada explcitamente) o donde se le hace referencia por primera vez (si su declaracin es implcita). Adems contienen los nmeros de las lneas donde se hace referencia a la variable.
~8~
Universidad Nacional del Santa IDENTIFICADOR anhio b companhia forma1 m TIPO int real int char proc DIMENSIN 0 0 1 2 0
Curso: Teora de Compiladores DECLARADA EN 5 5 2 4 6 REFERENCIAS 11, 23, 25 10, 11, 13, 23 9, 14, 25 36, 37, 38 17, 21
Tabla 2. Tabla de smbolos con referencias cruzadas como atributo de los smbolos.
La Tabla 2 nos muestra una lista de referencias cruzadas. Se pueden tener problemas cuando se representan todas las referencias a una variable, pues el nmero de lneas en que aparece puede ser grande y ocupar mucho espacio en la tabla. Generalmente se utiliza una lista. Por ltimo tambin existe la posibilidad de tener un atributo que sea un puntero cuya inclusin facilitar la construccin de la lista de nombres de las variables ordenados alfabticamente.
~9~
La operacin de bsqueda se lleva a cabo en todas las referencias de los identificadores, excepto en su declaracin. La informacin que se busca (por ejemplo: tipo, direccin en tiempo de ejecucin, etc.) se usa en la verificacin semntica y en la generacin de cdigo. Lenguajes con Declaraciones Implcitas de los Identificadores Las operaciones insercin y bsqueda estn estrechamente unidas. Cualquier identificador que aparezca en el texto fuente deber ser tratado como una referencia inicial, ya que no hay manera de saber a priori si los atributos del identificador ya han sido almacenados en la TS. Operacione s con Lenguajes Estructurados en Bloques Def iniremos en este apa rtad o como lenguajes estructurados en b loques a todos los que t iene a lgn t ipo de bloq ue que defina mb itos de u tilizac in y vis in de identificadores, por tanto estn incluidos en este apartado tambin los lenguajes orientados a objetos y no slo los lenguajes estructurados. Operaciones de Activacin y Desactivacin de Tablas de Smbolos Los lenguajes estructurad os en bloques tienen dos operaciones ad iciona les llama da s set y res et. La operacin de set s e uti liza cuando el compilador detecta el comienzo d e un bloque o mdulo en el cua l s e pueden declarar identificad ores locales o automticos. La operacin complementaria reset, se utiliz a cuando se detec ta el final del bloque o mdulo. La naturaleza y n eces ida d de estas opera ciones se muestra en el sigu iente fragmento de progra ma: En el fragmento del progra ma anterior, la variable X se declara en ms de un b loque y en cada uno d e estos bloques X t ien e distintos atributos. En un lenguaje an idado es necesario asegurarse, en cada caso, que el nombre de la variab le s e aso cia con un conjunto nico de atributos o de huecos en la TS. La solucin de este pro blema son las opera c iones set y r eset. Con la entrad a de un bloque, la operacin set crea una nueva subta bla (dentro de la TS) en la cual los atr ibutos de las variables declara das en el nuevo b loque se a lmacenan. La forma de crear esta subtabla depende de la Docente: Ing. Mirko Manrique Ronceros ~ 10 ~
orga nizacin de la TS. En los apa rtados 0 y 0 se vern varias t cnicas par a la creaci n de las subtab las. Mediante el uso de subtab las se so luciona la amb igedad pro vocada por la bsqueda de identifi cad ores del mism o nombr e en d istintos b loques. Por ejemplo, supongamos que se realiza una operacin de bsqueda de la variable X en el progr ama anterior y que las subtablas activas en este momento estn ordenada s de manera que la inspeccin com ienc e por la ltima creada y siga por las an teriores hasta llegar a la primera (como s e muestra en la Figura 1).
Con esta inspec cin en orden inverso de creac in s e gar antiza que la primera X que aparezca ser la del bloque ms cercano al uso de dicha variable qu e es lo que s emnticame nte pretende el compilador. Ntes e que no est permitido usar dos variables con el mismo nombre en mismo bloque, de esta forma queda resuelto el problema de la ambigedad de los nombr es de las variabl es. Con la salida del bloque, la opera cin reset suprime las entrada s a la subtabla del bloque qu e se acaba de cerrar. Esta supresin de las entrad as significa que las variables del b loque recin acab ado no tienen va lide z en el resto del progr ama. Las tcnicas para el cierre de las subtablas se vern tamb in en los apa rtad os 0 y 0.
~ 11 ~
El primer estimador que se usar para medir la complejidad de una operacin en la TS es la Longitud Med ia de In vest igacin (av erage length of search), en ad elante LMI. Se d efine la LMI como el nmero m edio de comparaciones que se nec esitan par a encontrar un registro de la tabla de smbolos en una organizacin dada. Como se ha definido anteriormente, el conjunto de atributos almacenados en la TS par a un smbolo determ inado se define como registro de la tabla de smbolos (s ymbol-table record). Lenguaje s Estructurados en Bloques En este apartad o se estudiarn los problemas que se presentan en el manejo de tablas de Smbolos c uando se compilan lenguajes estructurad os en bloques. (Aunque tambin sean lenguajes estructurados los lenguajes orientados a objetos se tratarn en o tro apar tado). Se entiende por lenguaje estructur ado en bloques a todo lenguaje c on estructura de bloques o mdulos qu e a su vez pu ede cont ener submd u los anidados y de manera que cada submdulo pueda contener u n conjunto de identificad ores con mb ito local. Docente: Ing. Mirko Manrique Ronceros ~ 12 ~
Un identificador declara do dentro de un mdulo A es accesible dentro de l mdulo a no ser que el m ismo nombre del identificador se redefina dentr o del subm dulo A. La redef inic in de una variab le es v lida exclus ivame nt e dentro del mbito (scope) del Sub mdulo. Por ejemplo en FORTRAN el mb ito de una variable es una subrut ina. E n general este concepto se apl icar ms a los lenguajes tipo ALGOL, PASCAL, C e inc luso a los propios lenguajes or ientad os a objetos. Representacin OO de Smbolos y Tipos en Compiladores de Una Pasada En los sistemas orientados a objetos apa recen nuevos prob lemas a la hora de implementar la tabla d e s mbolos que s e estudian en los sigu ien tes apar tados. En estos momentos hay dos lenguaje s implicados que pueden ser or ientad os a objetos: el lenguaje a compi lar y el lenguaje d e implementacin del comp ilad or, en este caso el lenguaj e de implem entac in de la pr opia ta bla de smbolos (Figur a 2). En los siguientes pr rafos se considera que el lenguaje de implementaci n es orienta do a obj etos, esto pr opor ciona benefic ios de impleme ntacin de la TS. Todo lo estud iado en este apa rtado es aplicable par a el caso de lenguajes fuente estructurados (tamb in or ien tados a objetos). Queda fuera del alcance de este documento las TS de lenguajes OO implementados en lenguajes estruc turados convenciona les.
Figura 2. Esquema del compilador (t) en que se muestra que el lenguaje fuente y el de implementacin son orientados a objetos.
~ 13 ~