Está en la página 1de 36

Programacin de Sistemas

Captulo

Introduccin

Los programas de computadora se utilizan para resolver problemas, y ha habido miles de aos trabajando en matemticas para ste fin. Los lenguajes de programacin estn especificados por reglas para formar instrucciones correctas, organizndolas en mdulos, someterlas hacia un compilador, el cual traduce el cdigo en un lenguaje comprensible para una mquina en particular, y finalmente ejecutar el programa, es decir, someter la entrada hacia la computadora, la cual transforma en una salida de acuerdo con las instrucciones en el programa.

1.1 Lenguajes de Programacin


Un lenguaje de programacin est formado por un conjunto de smbolos bsicos (alfabeto) y un conjunto de reglas que especifican como manipularlos. Tambin debe darle significado a las cadenas formadas al manipular los smbolos bsicos. Los lenguajes de programacin pueden clasificarse de acuerdo a su semejanza con el lenguajes maquina o a su semejanza con el lenguaje humano (generalmente ingls). Los lenguajes que tiene mayor semejanza con el lenguaje humano se les llama lenguajes de alto nivel, mientras que los lenguajes ms parecidos al lenguaje de maquina son conocidos como de bajo nivel. Entre los lenguajes de bajo nivel se encuentra el lenguajes ensamblador. Algunos ejemplos de lenguajes de alto nivel son:

Algol Basic C Cobol Fortran Modula 2 Pascal

1.1.1 Paradigmas del lenguaje

Pag 1

Programacin de Sistemas Un paradigma se puede considerar como una coleccin de caractersticas abstractas que categoriza un grupo de lenguajes que son aceptados y utilizados por un grupo de profesionales. Un estudiante que comprende lo que distingue a cada paradigma y tiene alguna experiencia en programacin con por lo menos un lenguaje en cada paradigma puede considerarse bsicamente educado en el tema de estudio de los lenguajes de programacin. A continuacin se presenta una jerarqua de paradigmas de lenguajes de programacin.
Paradigmas de lenguajes de programacin

Lenguajes Imperativos

Lenguajes Declarativos

De procedimiento C

Basado en objetos Ada

Procesamiento en paralelo Ada Pascal S Occam C-Linda

Lgico PROLOG

Funcional SCHEME

Base de Datos SQL

Estructurado en bloques Pascal Ada

Orientado a Objetos Ada Object Pascal C++ Java

Pag 2

Programacin de Sistemas

1.2 Traductores Un traductor es un programa que recibe como entrada cdigo escrito en un cierto lenguaje y produce como salida cdigo en otro lenguaje. Generalmente el lenguaje de entrada es de ms alto nivel que el de salida. Ejemplos de traductores son los ensambladores y los compiladores. Un ensamblador es un programa que traduce de un lenguaje ensamblador a lenguaje mquina, mientras que un compilador es un programa que traduce de un lenguaje de alto nivel a un lenguaje de bajo nivel o a lenguaje mquina. Un traductor es un programa que toma el texto escrito en un lenguaje (el lenguaje fuente) y lo convierte en el texto equivalente en un segundo lenguaje (el lenguaje destino u objeto). Si el fuente es un lenguaje abstracto o de alto nivel y si el objetivo es un lenguaje de ensamble de bajo nivel o de mquina, el traductor es un compilador. Diseo de lenguajes El lenguaje de programacin puede definirse al describir 1. Lo que parecen sus programas (la sintaxis del lenguaje) 2. lo que significan sus programas (la semntica del lenguaje). La sintaxis del lenguaje se presenta ampliamente con una notacin denominada gramtica libre de contexto o BNF. (Backus-Naur Form). La semntica del lenguaje es ms difcil de expresar que la sintaxis y generalmente se decide por especificarla usando descripciones informales y ejemplos. Ambas situaciones deben ser consideradas por quien disea un nuevo lenguaje para satisfacer las necesidades de los usuarios potenciales. Por ejemplo, alguien puede hacer el siguiente requerimiento: Disear un lenguaje para proporcionar ordenes a un robot para que ste se desplace. Aunque no se especifica qu tipo de rdenes se darn, el diseador deber responder a dos preguntas:

Pag 3

Programacin de Sistemas Cmo expresar lo que queremos que realice la mquina?


o

Cmo debe entender la mquina las rdenes que expresamos?


o

Puede ser que el tipo de rdenes que se darn sean del tipo:
o o o o o

inicio norte sur este oeste

De manera que cuando se de el programa, inicio norte oeste sur el robot tenga el siguiente comportamiento:

Si el robot no fuese real sino que tuviera que simularse, la semntica de cada orden sera determinada por modificar las coordenadas de la posicin del robot a travs de asociar acciones a las reglas gramaticales, como a continuacin se indican: Produccion regla semantica secuencia inicio secuencia.x:=0 secuencia.y:=0 secuencia secuencia instruccin secuencia.x:=secuencia1 .x+instruccin.dx Pag 4

Programacin de Sistemas secuencia.y:=secuencia1 .y + instruccin.dy secuencia este instruccin.dx:=1 instruccin.dy:=0 secuencia norte instruccin.dx:= 0 instruccin.dy:=1 secuencia oeste instruccin.dx:=-1 instruccin.dy:=0 secuencia sur instruccin.dx:=0 instruccin.dy:=1 1.3 Estructura de un Compilador. Cualquier compilador debe realizar dos tareas principales: anlisis del programa a compilar y sntesis de un programa en lenguaje maquina que, cuando se ejecute, realizara correctamente las actividades descritas en el programa fuente. Para el estudio de un compilador, es necesario dividir su trabajo en fases. Cada fase representa una transformacin al cdigo fuente para obtener el cdigo objeto. La siguiente figura representa los componentes en que se divide un compilador. Las tres primeras fases realizan la tarea de anlisis, y las dems la sntesis. En cada una de las fases se utiliza un administrador de la tabla de smbolos y un manejador de errores.

Analizador Lxico Ana. Sintctico Ana. Semantico Gen. de Cdigo Int Optimador de Cd. Generador de Cd.

Administrador de la tabla de Smb.

Manejador de errores.

Pag 5

Programacin de Sistemas

Anlisis Lxico. En la fase de anlisis lxico se leen los caracteres del programa fuente y se agrupan en cadenas que representan los componentes lxicos. Cada componente lxico es una secuencia lgicamente coherente de caracteres relativa a un identificador, una palabra reservada, un operador o un carcter de puntuacin. A la secuencia de caracteres que representa un componente lxico se le llama lexema (o con su nombre en ingls token). En el caso de los identificadores creados por el programador no solo se genera un componente lxico, sino que se genera otro lexema en la tabla de smbolos. Anlisis Sintctico. En esta fase, los componentes lxicos se agrupan en frases gramaticales que el compilador utiliza para sintetizar la salida. Anlisis Semntico. La fase de anlisis semntico se intenta detectar instrucciones que tengan la estructura sintctica correcta, pero que no tengan significado para la operacin implicada. Generacin de cdigo Intermedio. Algunos compiladores generan una representacin intermedia explcita del programa fuente, una vez que se han realizado las fases de anlisis. Se puede considerar esta operacin intermedia como un subprograma para una mquina abstracta. Esta representacin intermedia debe tener dos propiedades importantes: debe ser fcil de producir y fcil de traducir al programa objeto. Optimizacin de Cdigo. En esta fase se trata de mejorar el cdigo intermedio, de modo que resulte un cdigo de mquina ms rpido de ejecutar. Generacin de Cdigo.

Pag 6

Programacin de Sistemas Esta constituye la fase final de un compilador. En ella se genera el cdigo objeto que por lo general consiste en cdigo en lenguaje mquina (cdigo relocalizable) o cdigo en lenguaje ensamblador. Administrador de la tabla de smbolos. Una tabla de smbolos es una estructura de datos que contiene un registro por cada identificador. El registro incluye los campos para los atributos del identificador. El administrador de la tabla de smbolos se encarga de manejar los accesos a la tabla de smbolos, en cada una de las etapas de compilacin de un programa. Manejador de errores. En cada fase del proceso de compilacin es posibles encontrar errores. Es conveniente que el tratamiento de los errores se haga de manera centralizada a travs de un manejador de errores. De esta forma podrn controlarse ms eficientemente los errores encontrados en cada una de las fases de la compilacin de un programa.

Pag 7

Programacin de Sistemas

Captulo

2
2.1 Cargadores.

Elementos de Programacin

La Programacin de Sistemas se refiere a la creacin de programas cuya finalidad es servir a otros programas. Entre los programas que se manejan en la Programacin de Sistemas se encuentran, entre otros, los sistemas operativos, los compiladores, los ensambladores, los cargadores, los macroprocesadores, los manejadores de bases de datos. Un cargador es un programa que coloca en la memoria, para su ejecucin, el programa guardado en algn dispositivo de almacenamiento secundario. Dependiendo de la manera en que se manejen los procesos de liga y de carga, podemos clasificar a los cargadores en:

Cargadores iniciales.- Indican a la computadora la forma de poner, dentro de la memoria principal, unos datos que estn guardados en un perifrico de memoria externa (cinta, disco, etc.). Sirven para cargar en la memoria pequeos programas que inician el funcionamiento de una computadora. Algunas computadoras de carcter general no tienen en memoria ningn programa de forma permanente y cuando se desconectan pierden toda la informacin de su memoria interna. Al volverlos a conectar no son capaces de controlar ningn perifrico (teclado, discos, etc.). Esto se hace as para que sea el usuario el que ponga los programas que le interese ejecutar.

Cargadores absolutos.- Como ya se menciono el programa cargador pone en memoria las instrucciones guardadas en sistemas externos. Independientemente de que sea un cargador inicial o no, si dichas instrucciones se almacenan siempre en ele mismo espacio de memoria (cada vez que se ejecuta el programa cargador), se dice que es un cargador absoluto. Cargadores con reubicacin.- En ocasiones, un mismo programa necesita ejecutarse en diferentes posiciones de memoria. Para esto la traduccin debe estar realizada en forma adecuada, es decir, no utilizando referencias absolutas a direcciones de memoria, sino referencias relativas a una direccin especial llamada direccin de reubicacin.

Pag 8

Programacin de Sistemas El clculo de las direcciones reubicables lo realiza el propio cargador a medida que va guardando las instrucciones en el espacio de memoria que le indique el usuario o el propio sistema operativo de la mquina. A los cargadores que permiten estas operaciones se les denominan cargadores con reubicacin.

Cargadores ligadores.- Conocidos tambin por su trmino ingls Link editor o simplemente Linker, es muy comn tambin referirse a l por la castellanizacin del nombre ingls, <<lincador>>. A la accin de montar se le llama asimismo vulgarmente <<lincar>>. Montar un programa consiste en aadir al programa objeto obtenido en la traduccin las rutinas externas a las que hace referencia dicho programa. El ensamblador debe permitir dichas referencias y las rutinas deben estar a su vez en lenguaje mquina guardadas en algn elemento accesible por el montador. Generalmente, dichas rutinas se encuentran guardadas en un archivo especial al que suele denominarse librera, porque estn almacenadas todas las rutinas externas susceptibles de ser utilizadas por los diferentes programas del usuario. All va el programa ligador cuando esta realizando el montaje de un programa a buscarlas y las adjunta al programa objeto.

En el proceso de carga reubicable (relocalizable), un mismo programa puede ejecutarse en diferentes posiciones de memoria. Para esto, el programa objeto debe utilizar referencias relativas a una direccin especial llamada direccin de reubicacin. EI clculo de las direcciones reubicables es realizado por el cargador a medida quo va ubicando las instrucciones en el espacio de memoria que le indique el sistema operativo. Cuando se utilizan subrutinas en un programa, el cdigo ejecutable de cada una de ellas debe encontrarse en memoria al tiempo de ejecucin. Para esto, antes de cargar un programa, debe ligarse su cdigo objeto con los cdigos objeto (guardados en uno o ms archivos) de cada una de las subrutinas invocadas por l, obteniendo as un programa ejecutable que contiene tanto el cdigo del mdulo invocador como el cdigo de los mdulos invocados. En este punto, es posible guardar el resultado del proceso de liga en un archivo que podr ser utilizado por un cargador, o el mismo programa ligador puede tambin realizar la tarea de carga. Esto ltimo evita el tener que guardar el cdigo ejecutable en un archivo, con lo que se ahorra espacio en disco. Este ahorro de espacio en disco se paga con el tiempo gastado al tener que ligar todos los mdulos cada vez que se necesite ejecutar el programa. Este enlace se llama esttico porque se realiza antes de ejecutar el programa. Existe otro proceso llamado enlace dinmico, el cual consiste en enlazar en tiempo de ejecucin los mdulos que contienen a las subrutinas. Pag 9

Programacin de Sistemas 2.2 Ensambladores. Que es ensamblador y para que sirve? Cuando se empezaron a utilizar smbolos nemotcnicos, se escribieron programas para traducir automticamente los programas escritos en lenguaje ensamblador a lenguaje mquina. A estos programas traductores se les llamo ensambladores. La entrada para un ensamblador es un programa fuente escrito en lenguaje ensamblador. La salida es un programa objeto, escrito en lenguaje de mquina. El programa objeto incluye tambin la informacin necesaria para que el cargador pueda preparar el programa objeto para su ejecucin. Para evitar confusiones, de aqu en adelante llamaremos lenguaje ensamblador al conjunto de nemotcnicos y a las reglas para su manejo. Al programa que traduce un programa objeto a partir de un programa escrito en lenguaje ensamblador lo llamaremos ensamblador. Motivos para utilizarlo.

Rapidez: Como el programador directamente selecciona las instrucciones que se ejecutan en el programa, el programa final queda mas optimizado que un programa generado por un compilador. Mayor control de la computadora: Un programa puede accesar directamente cualquier componente y perifrico de la computadora. Independencia del lenguaje: No depende de libreras o del lenguaje mismo para realizar una tarea especifica. Lenguajes como el Basic limitan al programador a lo que el lenguaje puede hacer. La mayora de las computadoras pueden ensamblar: Los recursos necesarios para ensamblar un programa son mucho menores que los compiladores o interpretes. El ensamblador generalmente es ms rpido ensamblando un programa que un compilador generando un archivo ejecutable.

Motivos para no utilizarlo. Desafortunadamente, tambin existen motivos para no crear los programas con ensamblador.

Dependencia del hardware: El cdigo se hace en extremo dependiente del microprocesador, de los dispositivos, de los controladores, etc. Este punto ser analizado con mas detenimiento en dependencias de hardware. Mayor tiempo de codificacin: El numero de lneas de un programa hecho en ensamblador es mayor a uno hecho en un lenguaje de alto nivel (por ejemplo: Funcin en C puede realizar varias decenas o centenas de instrucciones del microprocesador).

Pag 10

Programacin de Sistemas

Comprensin mas profunda de la computadora: Entender un lenguaje de alto nivel es generalmente ms sencillo que el ensamblador. Comprender ensamblador requiere conocimientos ms exactos sobre el funcionamiento interno de la computadora. Errores mas frecuentes en el programa: El evitar un error o encontrar alguno que ya exista es difcil. Las herramientas para este caso (como el CodeView y el TurboDebbuger) ayudan en gran medida a ver lo que esta ocurriendo en la maquina, pero no localizan los errores.

Entonces, cuando utilizo ensamblador y cuando no? Depende del programa a desarrollar. Si el programa debe controlar en gran medida los componentes internos de la computadora o debe ser lo suficientemente veloz, entonces es recomendable utilizarlo. Si se requiere un sistema grande y no se dispone de mucho tiempo para entregarlo, entonces es mejor juntar un lenguaje de alto nivel con ensamblador (las funciones bsicas del programa realizarlas en ensamblador, y el programa en general codificarlo con el lenguaje de alto nivel). Este punto se discute mas adelante en ensamblador y lenguajes de alto nivel. 2.2.1 Tipos de Ensambladores. Aunque todos los ensambladores realizan bsicamente las mismas tareas, podemos clasificarlos de acuerdo a caractersticas. As podemos clasificarlos en:

Ensambladores Cruzados (Cross-Assembler).

Se denominan as los ensambladores que se utilizan en una computadora que posee un procesador diferente al que tendrn las computadoras donde va a ejecutarse el programa objeto producido. El empleo de este tipo de traductores permite aprovechar el soporte de medios fsicos (discos, impresoras, pantallas, etc.), y de programacin que ofrecen las mquinas potentes para desarrollar programas que luego los van a ejecutar sistemas muy especializados en determinados tipos de tareas.

Ensambladores Residentes.

Son aquellos que permanecen en la memoria principal de la computadora y cargan, para su ejecucin, al programa objeto producido. Este tipo de ensamblador tiene la ventaja de que se puede comprobar inmediatamente el programa sin necesidad de transportarlo de un lugar a otro, como se haca en cross-assembler, y sin necesidad de programas simuladores. Sin embargo, puede presentar problemas de espacio de memoria, ya que el traductor ocupa espacio que no puede ser utilizado por el programador. Asimismo, tambin ocupar memoria el programa fuente y el programa objeto. Esto obliga a tener un espacio de memoria relativamente amplio. Es el indicado para desarrollos Pag 11

Programacin de Sistemas de pequeos sistemas de control y sencillos automatismo empleando microprocesadores. La ventaja de estos ensambladores es que permiten ejecutar inmediatamente el programa; la desventaja es que deben mantenerse en la memoria principal tanto el ensamblador como el programa fuente y el programa objeto.

Macroensambladores.

Son ensambladores que permiten el uso de macroinstrucciones (macros). Debido a su potencia, normalmente son programas robustos que no permanecen en memoria una vez generado el programa objeto. Puede variar la complejidad de los mismos, dependiendo de las posibilidades de definicin y manipulacin de las macroinstrucciones, pero normalmente son programas bastantes complejos, por lo que no suelen ser ensambladores residentes.

Microensambladores.

Generalmente, los procesadores utilizados en las computadoras tienen un repertorio fijo de instrucciones, es decir, que el intrprete de las mismas interpretaba de igual forma un determinado cdigo de operacin. El programa que indica al intrprete de instrucciones de la UCP cmo debe actuar se denomina microprograma. El programa que ayuda a realizar este microprograma se llama microensamblador. Existen procesadores que permiten la modificacin de sus microprogramas, para lo cual se utilizan microensambladores.

Ensambladores de una fase.

Estos ensambladores leen una lnea del programa fuente y la traducen directamente para producir una instruccin en lenguaje mquina o la ejecuta si se trata de una pseudoinstruccin. Tambin va construyendo la tabla de smbolos a medida que van apareciendo las definiciones de variables, etiquetas, etc. Debido a su forma de traduccin, estos ensambladores obligan a definir los smbolos antes de ser empleados para que, cuando aparezca una referencia a un determinado smbolo en una instruccin, se conozca la direccin de dicho smbolo y se pueda traducir de forma correcta. Estos ensambladores son sencillos, baratos y ocupan poco espacio, pero tiene el inconveniente indicado.

Ensambladores de dos fases.

Los ensambladores de dos fases se denominan as debido a que realizan la traduccin en dos etapas. En la primera fase, leen el programa fuente y construyen una tabla de smbolos; de esta manera, en la segunda fase, vuelven a leer el programa fuente y pueden ir traduciendo totalmente, puesto que conocen la totalidad de los smbolos utilizados y las posiciones que se les ha asignado. Estos ensambladores son los ms utilizados en la actualidad.

Pag 12

Programacin de Sistemas 2.2.2 El proceso de ensamble de uno, dos o ms pasos. Como se vio en la seccin anterior, existen ensambladores que realizan su tarea en una o ms fases o pasos. El proceso de ensamble de un paso consiste en leer una lnea de programa fuente y traducirla a lenguaje mquina cuando se trata de una instruccin, o se ejecuta si es una seudoinstruccin. La tabla de smbolos se va construyendo a medida que se avanza en la lectura de las lneas del programa fuente. Para que el ensamble de un paso funcione, todos los smbolos deben estar definidos antes de emplearse. Esto debido a que, para traducir correctamente cada instruccin, se debe conocer la direccin de cada uno de los smbolos que intervienen en ella. En otras palabras, no pueden quedar referencias pendientes porque ya no habr otra oportunidad de resolverlas. Tampoco podrn hacerse saltos hacia lneas posteriores. No es posible saltar hacia una lnea cuya etiqueta todava no ha sido definida. Para resolver el problema que presenta el proceso de ensamble de un paso, se utiliza el proceso de ensamble de dos pasos o fases. En la primera fase, se lee el programa fuente y se construye la tabla de smbolos. En la segunda fase, se vuelve a leer el programa fuente y se traduce totalmente ya que se conoce la totalidad de los smbolos utilizados (incluyendo las etiquetas) y las posiciones de memoria que se les han asignado. Como ya se conocen las direcciones de las etiquetas utilizadas, pueden realizarse saltos hacia adelante.

2.2.3 Literales y Expresiones. En computacin, las literales son mecanismos mediante los cuales se reservan espacios de memoria para guardar valores de cierto tipo. Generalmente, el trmino literal se asocia un smbolo para representar la direccin del primer byte de espacio asignado. En el espacio asignado se pueden almacenar valores constantes o variables. Las expresiones son combinaciones de literales y operadores. En lenguaje ensamblador las expresiones involucran valores constantes y operadores. Los resultados se almacenan como constantes ya que los clculos ocurren durante el ensamble, no durante la ejecucin. Los operadores que se utilizan en las Pag 13

Programacin de Sistemas expresiones de lenguaje ensamblador no tienen ningn efecto en tiempo ejecucin del programa ensamblado. No debe confundirse el manejo expresiones en lenguaje ensamblador con el manejo de expresiones en lenguajes de alto nivel. En los lenguajes de alto nivel, la evaluacin de expresiones se hace en tiempo de ejecucin. de de los las

Cada traductor dar sus reglas de construccin de expresiones y, muy importante, de cmo las evala.

2.3 Macroprocesadores. Con el fin de evitar al programador la tediosa repeticin de partes idnticas de un programa, los ensambladores y compiladores cuentan con macroprocesadores que permiten definir una abreviatura para representar una parte de un programa y utilizar esa abreviatura cuantas veces sea necesario. Para utilizar una macro, primero hay que declararla. En la declaracin se establece el nombre que se le dar a la macro y el conjunto de instrucciones que representar. El programador escribir el nombre de la macro en cada uno de los lugares donde se requiera la aplicacin de las instrucciones por ella representadas. La declaracin se realiza una sola vez, pero la utilizacin o invocacin a la macro (macrollamada) puede hacerse cuantas veces sea necesario. La utilizacin de macros posibilita la reduccin del tamao del cdigo fuente, aunque el cdigo objeto tiende a ser mayor que cuando se utilizan funciones. Es tan comn el empleo de macroinstrucciones que se les considera como una extensin de los lenguajes. De manera similar se considera al procesador de macroinstrucciones o macroprocesador como una extensin del ensamblador o compilador utilizado. El macroprocesador se encarga, en una primera pasada, de registrar todas las declaraciones de macros y de rastrear el programa fuente para detectar todas las macrollamadas. En cada lugar donde encuentre una macrollamada, el macroprocesador har la sustitucin por las instrucciones correspondientes. A este proceso de sustitucin se le denomina expansin de la macro. El macroprocesador elabora dos tablas para el manejo de las macros: Una tabla de macronombres que consiste de los nombres de las macros y un ndice que le permite localizar la definicin de la macro en otra tabla llamada tabla de macrodefiniciones. Como su nombre lo indica, la tabla de macrodefiniciones contiene las definiciones de todas las macros a utilizar en el programa.

Pag 14

Programacin de Sistemas En ocasiones es conveniente agrupar macros, de acuerdo a las tareas que realizan, y almacenarlas en archivos que se constituyen en bibliotecas de macros. De esta manera, cuando se requiera la utilizacin de alguna macro en particular, se incluye en el programa fuente el archivo de la biblioteca de macros correspondiente. La mayora de los ensambladores y compiladores permiten el uso de pseudoinstrucciones condicionales del tipo IF ... ELSE, por medio de las cuales se puede controlar la traduccin de ciertos bloques de programa.

2.4.1 Tipos de Sistemas Operativos. Una forma de clasificacin de los sistemas operativos se basa en el nmero de usuarios que el sistema puede atender al mismo tiempo. As, tenemos sistemas de una sola tarea o trabajo, los cuales pueden atender solo un trabajo (y por lo tanto un solo usuario) a la vez. Un sistema de multiprogramacin permite que se ejecuten varios trabajos al mismo tiempo. El sistema operativo se encarga de intercambiar la atencin del procesador entre los programas en ejecucin y las funciones de apoyo propias. Un sistema de multiprocesamiento difiere del sistema de multiprogramacin por el hecho de trabajar con varios procesadores a la vez. Otra forma de clasificar a los sistemas operativos toma en cuente el tipo de acceso que proporcionan al usuario. En este caso, se tienen: sistemas de procesamiento por lotes (batch processing), donde un trabajo se define como una secuencia de instrucciones de control almacenadas en algn dispositivo para que el sistema operativo pueda leer y ejecutar una serie de trabajos, limitando la intervencin del operador solo al montaje de cintas y discos. Por otra parte se tienen los sistemas de tiempo compartido (multiusuario) que proporcionan acceso interactivo o conversacional a varios usuarios, proporcionando a cada uno de ellos pequeos intervalos de tiempo de acuerdo a la cantidad de usuarios presentes y a la prioridad de cada uno de los procesos.

2.5 Compiladores. La necesidad de establecer comunicacin con dispositivos de cmputo para un creciente nmero de usuarios ha obligado a construir herramientas que permitan que esta comunicacin se realice de manera ms efectiva y con menor consumo Pag 15

Programacin de Sistemas de tiempo. Esto lo podemos apreciar desde finales de la dcada de los 50's, cuando con el advenimiento de computadoras comerciales surge tambin la necesidad de programarlas. Se disearon lenguajes como FORTRAN y COBOL que permiten realizar esta tarea de comunicacin al establecer una relacin entre los problemas de los usuarios y lo que las mquinas eran capaces de realizar. Estos primeros lenguajes tambin vinieron acompaados de un nuevo trmino: Compilador. Se le atribuye a Grace Murray Hopper la acuacin de este trmino y se refera al trabajo que estaba detrs de la programacin en aquellos tiempos: exista una biblioteca de programas constituida de un conjunto de rutinas, cada una de ellas probada individualmente; cuando se necesitaba un programa, se elegan las rutinas necesarias de esa biblioteca y se integraban para conformar el proceso que ejecutara la computadora. Quin realizaba este trabajo de acopio de rutinas y de integracin se le denominaba compilador, de ah que los nuevos lenguajes tuviesen sus propios "compiladores" para la integracin del proceso que programar representaba. En nuestros das, el trmino an se conserva aunque con un sentido ligeramente diferente al planteado por Hopper. Hoy en da, un compilador es un traductor que facilita la comunicacin entre el programador y la mquina, por medio de un proceso de transformacin.

Pag 16

Programacin de Sistemas 3.1 Scanner. El anlisis de un programa fuente durante la compilacin es complejo. La construccin de un compilador puede hacerse ms fcil si el anlisis del programa fuente es separado en dos partes, con una parte identificando las construcciones de lenguaje de bajo nivel (tokens) tales como los nombres de variables, palabras reservadas, etiquetas, y operadores, y la segunda parte determinando la organizacin sintctica del programa. En esta seccin se estudia la primera de estas partes, la cual es llevada a cabo por medio de un analizador lxico o scanner. Nos conciernen dos aspectos de los scanners. Primero, lo que son los tokens (componentes lxicos) del lenguaje en estudio. Para describir los tokens pueden utilizarse gramticas regulares. Otro enfoque descriptivo involucra el uso de expresiones regulares. Ambos mtodos descriptivos son equivalentes en el sentido de que ambos describen el conjunto de lenguajes regulares. El segundo aspecto de los scanners trata con el reconocimiento de tokens. Los aceptores de estado finitos son dispositivos que encajan bien en esta tarea de reconocimiento, principalmente porque pueden especificarse pictricamente utilizando diagramas de transicin.

3.1.1 El proceso del Anlisis Lxico. El proceso de anlisis lxico se refiere al trabajo que realiza el scanner con relacin al proceso de compilacin. El scanner representa una interfaz entre el programa fuente y el analizador sintctico o parser. El scanner, a travs del examen carcter por carcter del texto, separa el programa fuente en piezas llamadas tokens, los cuales representan los nombres de las variables, operadores, etiquetas, y todo lo que comprende el programa fuente. El parser, usualmente genera un rbol de sintaxis del programa fuente como ha sido definido por una gramtica. Las hojas del rbol son smbolos terminales de la gramtica. Son esos smbolos terminales o tokens los que el scanner extrae del cdigo fuente y se los pasa al parser. Es posible para el parser usar el conjunto de caracteres terminales del lenguaje como el conjunto de tokens, pero ya que los tokens pueden ser definidos en trminos de gramticas regulares ms simples que en las gramticas ms complejas utilizadas por los parsers, es deseable usar scanners. Usar solo parsers es costoso en trminos de tiempo de ejecucin y requerimientos de memoria, y la complejidad y el tiempo de ejecucin puede reducirse con el uso de un scanner. La separacin entre anlisis lxico (scanning) y anlisis sintctico (parsing) puede tener tambin otras ventajas. El anlisis lxico de caracteres generalmente es Pag 17

Programacin de Sistemas lento en los compiladores, y separndolo del componente de anlisis semntico de la compilacin, el nfasis particular puede darse para hacer ms eficiente el proceso.

Un analizador de lxico tiene como funcin principal el tomar secuencias de caracteres o smbolos del alfabeto del lenguaje y ubicarlas dentro de categoras, conocidas como unidades de lxico. Las unidades de lxico son empleadas por el analizador gramatical para determinar si lo escrito en el programa fuente es correcto o no gramaticalmente. Algunas de las unidades de lxico no son empleadas por el analizador gramatical sino que son descartadas o filtradas. Tal es el caso de los comentarios, que documentan el programa pero que no tienen un uso gramatical, o los espacios en blanco, que sirven para dar legibilidad a lo escrito. En la terminologa empleada en la construccin de un analizador de lxico se encuentran los siguientes trminos.

Patrn Representa la regla para que una secuencia de caracteres sea considerada cierta unidad de lxico. Ejemplo: El patrn para un identificador de Pascal es: Una letra seguida por letras, dgitos o guiones (_) Lexema El valor actual de un conjunto de caracteres que satisfacen un patrn.Ejemplo: Este_es_1_ejemplo Este es el lexema que satisface el patrn de un identificador Token o Ficha

Pag 18

Programacin de Sistemas El valor asociado a una categora o unidad de lxico. Se representa como un nmero entero o una constante de un byte. Ejemplo: el token de un identificador puede ser 1 id (si id fue definida como 1). Unidades de lxico Categoras en que se clasifican las cadenas de caracteres vlidos en un lenguaje. Los caracteres vlidos reciben el nombre de alfabeto. Por ejemplo, el alfabeto de Pascal es: A-Z, a-z, 0-9, _, =, :, ;, ,, , -, ', ", *, /, (, ), [, ], ., <, > y las unidades de lxico para pascal son:
o o o o o o

identificadores literales numricas operadores aritmticos cadenas de caracteres separadores

operadores relacionales
o o o

operadores lgicos comentarios

Con respecto al lenguaje para controlar al ROBOT, tenemos que su alfabeto es:
o o

n,o,r,t,e,s, ,u,i,c

y las unidades de lxico son:


o o

rdenes

(norte, sur, este, oeste, inicio)


o

y espacios en blanco.

El rol del analizador de Lxico Aunque el analizador de lxico es la primera etapa del proceso de compilacin, no es quien lo inicia. Pudiera considerarse que el analizador de lxico hace su procesamiento y enva sus resultados al analizador gramatical, como Pag 19

Programacin de Sistemas secuencialmente se aprecia en el proceso de compilacin; no es as: La compilacin empieza con el analizador gramatical quien solicita un token para realizar su trabajo; el analizador de lxico reune smbolos y enva el token correspondiente a la unidad de lxico que conform al analizador gramatical y espera una nueva solicitud de token. Como se aprecia en la figura siguiente, el analizador de lxico est supeditado por el analizador gramatical.

Durante estas etapas se tiene comunicacin con la tabla de smbolos que concentra informacin de las entidades empleadas en el programa.

Descripcion de Patrones Un patrn se puede describir: 1. Mediante una descripcin informal, en donde se emplea el lenguaje natural para describir el comportamiento de la regla de lxico. Por ejemplo: un nmero entero es una secuencia de uno o ms dgitos del 0 al 9. O un identificador es una letra seguida de letras, dgitos o guiones de subrayar. La descripcin informal es til slo entre humanos; computacionalmente an no hay herramientas para construir sobre ellas analizadores de lxico. 2. Utilizando expresiones regulares. Una expresin regular es una notacin formal que utiliza operaciones sobre el alfabeto de un lenguaje. Por ejemplo, se puede definir que un identificador es: {letra} ({letra} | {dgito} | {guin})* que interpreta como un elemento del conjunto letra seguido de cero o mas veces (la cerradura Kleene, representada por el asterisco) de una letra, dgito o guin (la seleccin representada por la barra vertical). Esta notacin es formal y computacionalmente til para construir analizadores de lxico empleando la herramienta LEX. 3. Utilizando autmatas finitos (diagramas de transicin o diagramas sintcticos), que son representaciones grficas de las relaciones entre conjuntos de smbolos (aristas) por medio de estados, a los cuales pueden Pag 20

Programacin de Sistemas llegarse o transitarse por ellos al encontrar un smbolo perteneciente a un conjunto. El siguiente diagrama puede ser la representacin de un identificador:

La utilizacin del diagrama sirve para aclarar las posibilidades de accin en un patrn y puede manipularse computacionalmente.

3.2 Diagramas de Estado. Ya que el scanner debe reconocer tokens, debemos buscar la posibilidad describir los tokens a manera de reconocimiento y no de manera generativa. descripcin de los tokens por medio de cmo pueden ser reconocidos aceptados) se hace en trminos de un modelo matemtico llamado un aceptor estado finito. de La (o de

En lo que resta de esta seccin, describiremos un conjunto de tokens por medio de la especificacin de un aceptor que reconocer ese conjunto. Cabe aclarar que las gramticas regulares tambin pueden utilizarse para este propsito. Un aceptor de estado finito o autmata finito puede considerarse como una mquina consistente de una cabeza de lectura y una caja de control de estado finito. La mquina lee una cinta de carcter a la vez, de izquierda a derecha. Existe un nmero finito de estados que la mquina puede adoptar. Cada vez que la mquina lee el siguiente carcter, ocurre en ella un cambio de estado. Siempre que un aceptor de estado finito inicia la lectura de una cinta, ste se encuentra en cierto estado llamado estado inicial. Algunos de los estados que el aceptor puede adoptar se llaman estados finales, y si el aceptor intenta leer ms all del final de la cinta mientras se encuentra en un estado final, la cadena que est en la cinta se dice que fue aceptada por el autmata finito. En otras palabras, la cadena pertenece al lenguaje que es aceptado por el autmata finito.

3.2.1 Diagramas de Estado Finito.

Pag 21

Programacin de Sistemas

Para representar grficamente un aceptor de estado finito, tambin se utilizan los diagramas de estado finito o diagramas de transicin, como el que se muestra en la siguiente figura y que representa el aceptor para un nmero con al menos un dgito despus del punto decimal. Los nodos del diagrama de estado finito representan los estados del aceptor de estado finito. En el diagrama anterior, los nodos se han etiquetado con los nmeros 1, 2 y 3. Los arcos, que van de un estado otro, indican las transiciones de estado. La flecha y la palabra "Inicio" indican cual de los estados es el estado inicial (en este caso el estado 1). El estado etiquetado con el 3 se denomina estado final. Generalmente los estados finales se representan por medio de dos crculos concntricos, pero en nuestro caso, para facilitar su construccin, hemos utilizado un circulo con lnea ms gruesa. Los smbolos sobre los arcos representan los caracteres que, al leerse, obligan al cambio de un estado a otro. Un diagrama de transicin es una representacin grfica donde se tiene un conjunto de estados, los cuales pueden ser:
o o o

iniciales finales intermedi

os los cuales pueden tener una o ms salidas hacia otro estado.

Los estados se relacionan entre s con flechas con un nombre (el caracter o conjunto de caracteres que provoca la transicin de un estado a otro). Un estado final se representa con :

que tambin recibe el nombre de estado de aceptacin. Para construir un diagrama de transicin se debe tener presente: A cada estado debe llegarse con el mismo conjunto de caracteres en todas las ocasiones en que haya un transicin.
o

Para llegar a un estado de aceptacin debe existir una transicin sobre el caracter que rompe el patrn de la unidad de lxico.
o

Pag 22

Programacin de Sistemas Cuando se construye un analizador de lxico utilizando diagramas de transicin para la especificacin de los patrones, se realiza un nico diagrama que, a partir del estado 0, tiene diversas transiciones a cada uno de los patrones de las unidades de lxico que deba reconocer. Cada patrn posee un caracter selector, que permite reconocer de manera nica el patrn que deba aplicarse. Por ejemplo, si queremos reconocer identificadores, comentarios apegados a las reglas del lenguaje C y el fin de archivo, podriamos contruir el siguiente diagrama:

Las descripciones informales de las unidades de lxico son:


o o

Identificador: Letra seguida de letra, dgitos o guiones

Comentario: Empieza con /* y termina con */. Entre estos pares puede haber cualquier smbolo
o o

EOF: cuando se encuentra el caracter eof (fin de archivo)

Error: Cualquier smbolo que no cumpla con los patrones anteriores.

Pag 23

Programacin de Sistemas Los caracteres selectores para cada patrn son:


o o o o

Identificador: letra Comentario: / EOF: eof Error: cualquier smbolo diferente a los anteriores.

En el diagrama tambin aparecen otros estados derivados de patrones incompletos; estos estados se clasifican como Error. Implantacin de un Analizador de Lxico La informacin en un diagrama de transicin puede representarse por medio de una tabla que contenga por columnas a los smbolos del alfabeto del lenguaje y por renglones los diversos estados que constituyen al diagrama. Para el ejemplo anterior donde se describen los patrones de las unidades de lxico Identificador, comentario, EOF y error, se obtendra la siguiente tabla:

Tabla del Analizador de Lxico


Estado A-Z 0-9 _ / * eof otro

0 1 2 3 4

1 1 1 1

13 2 2 2

13 3 3 3

5 4 4 4

13 4 4 4

12 4 4 4

13 4 4 4

Pag 24

Programacin de Sistemas 5 6 7 8 9 10 11 12 13 14 15 14 8 10 8 11 8 14 8 10 8 11 8 14 8 10 8 11 8 14 8 9 8 11 8 6 7 7 7 11 7 14 15 15 15 11 15 14 8 10 8 11 8

Los estados finales o de aceptacin de las unidades de lxico quedan sin informacin en las columnas ya que no existe una transicin al reconocer o aceptar el patrn. Note que la designacin de otro corresponde a los smbolos diferentes a los expresamente indicados y que para cada patrn es contextual. Para poder realizar el anlisis de lxico a partir de la informacin que contiene la tabla se cuenta con un mecanismo que parte del estado 0 y empieza a recorrer el diagrama por cada transicin posible hasta llegar a un estado final. El algoritmo del mecanismo se describe a continuacin.

Analizador_de_Lexico INICIO Estado=0 C=Inspecciona() Cont=0 Nuevo_Estado=TABLA[Estado, C] MIENTRAS Nuevo_Estado no sea Estado_Final REPITE Avanza() C=Inspecciona() Estado=Nuevo_Estado Nuevo_Estado=TABLA[Estado, C]

Pag 25

Programacin de Sistemas Cont=Cont+1 FREPITE SI Cont es 0 ENTONCES Avanza() FSI Regresa Token (Nuevo_Estado) FIN La funcin Ana lizador_de_Lxico utiliza dos funicones que permiten consumir los smbolos del programa fuente: Inspecciona y Avanza. Las funciones consideran la existencia de un apuntador AP que direcciona al caracter prximo a leer. Inspecciona regresa el caracter apuntado por AP pero no lo incrementa. La funcin Avanza no regresa nada pero incrementa el valor de AP para estar en el siguiente smbolo a leer. Utilizacin de Memoria Realizar las lecturas involucradas por Inspecciona y Avanza directamente del archivo donde reside el programa fuente puede ser ineficiente ya que el tiempo que se consume para leer 1 y 1024 caracteres es el mismo. Por ello se considera la existencia de memoria de entrada (buffer) donde se puede depositar imgenes del contenido del archivo del programa fuente y donde se realicen Inspecciona y Avanza directamente en RAM. Esta memoria de entrada tiene una capacidad de 1024 caracteres (o mltiplos de esta cantidad) que llamaremos N. La direccin de inicio de esta regin la denominaremos Buffer.

La regin se mantendr dividida en dos partes, que se llenarn de manera alternativa bajo el siguiente algoritmo.
AP=AP+1 SI AP == Buffer+N/2 ( AP est al final del primer bloque y por lo tanto debe llenar el segundo ) ENTONCES i=Lectura(Buffer+N/2, N/2, archivo) SI i <N/2 ENTONCES Contenido(Buffer+N/2+i)=eof FSI

Pag 26

Programacin de Sistemas
SINO

SI AP == Buffer+N ( AP est al final del segundo bloque y por lo tanto debe llenar el primero ) ENTONCES i=Lectura(Buffer, N/2, archivo) AP=Buffer SI i <N/2 ENTONCES Contenido(Buffer+i)=eof FSI FSI

FSI

Este algoritmo representa el comportamiento de la funcin Avanza, quien determinar cuando transferir a memoria el contenido del archivo del programa fuente. La funcin Lectura (destino, n, fuente) requiere especificar la regin de memoria (destino) donde se depositarn (n) caracteres del archivo (fuente).

3.3 Matrices de Transicin. Una matriz o tabla de transiciones es un arreglo bidimensional cuyos elementos proporcionan el resumen de un diagrama de transiciones. Para elaborar un tabla de transiciones, debe colocarse cada estado del diagrama de transiciones en una fila del arreglo y cada smbolo o categora de smbolos con posibilidades de ocurrencia en la cadena de entrada, en una columna. El elemento que se encuentra en la fila m columna n es el estado que se alcanzara en el diagrama de transiciones al dejar al estado m a travs de un arco de etiqueta n. Al no existir algn arco que salga del estado m, entonces la casilla correspondiente de la tabla se marca como un estado de error. En la siguiente figura se presenta un ejemplo de un diagrama de transiciones que representa la sintaxis para un nmero de punto flotante, seguido de la tabla de transiciones correspondiente.

Estado 1 2 3 4

Dgito 2 2 4 4

. Error 3 Error Error

E Error 5 Error 5

+ Error Error Error Error

Error Error Error Error

FDC Error Error Error Aceptar

Pag 27

Programacin de Sistemas 5 6 7 7 7 7 Error Error Error Error Error Error 6 Error Error 6 Error Error Error Error Aceptar

3.4 Tablas de Smbolos.


Las tablas de smbolos (tambin llamadas tablas de identificadores y tablas de nombres), realizan dos importantes funciones en el proceso de traduccin: verificar que la semntica sea correcta y ayudar en la generacin apropiada de cdigo. Ambas funciones se realizan insertando o recuperando desde la tabla de smbolos los atributos de las variables usadas en el programa fuente. Estos atributos, tales como: el nombre, tipo, direccin de almacenamiento y dimensin de una variable, usualmente se encuentran explcitamente en las declaraciones o ms implcitamente a travs del contexto en que aparecen los nombres de variables en el programa. Una de las estructuras de datos que se encuentran relacionadas con las fases del proceso de compilacin es la tabla de smbolos, la cual tiene como propsito registrar informacin que se comparte entre varias etapas y que permite administrar los recursos asociados a las entidades que manipular el programa. La tabla de smbolos tiene tpicamente la siguiente estructura:

en donde podemos apreciar la designacin de la entidad y su token -derivados del anlisis de lxico- asi como una serie de atributos (tipo de dato, direccin en memoria) que emanan de otras fases (anlisis gramatical y semntico). Las consultas a la tabla de smbolos se realizan por medio del lexema con que se designa a la entidad.

Pag 28

Programacin de Sistemas Esta concepcin de la tabla de smbolos es demasiado simple para fines prcticos si consideramos que el lexema de la entidad es de longitud variable y se desea que la estructura sea homogenea. Una solucin es considerar que en el campo lexema se tiene un apuntador (que siempre ocupa el mismo espacio) hacia donde se registrarn propiamente los lexemas. Eso evitar el desperdicio de memoria al tener el espacio justo para representar a cada lexema.

La creacin de la tabla de smbolos compete inicialmente al analizador de lxico, quien registrar a las entidades (reconocidas bajo el patrn de Identificador) de manera nica, por medio del binomio de operaciones Bsqueda-Insercin. En el contexto de un programa las entidades pueden describir propiamente objetos manipulables por el lenguaje (por ejemplo variables, constantes o funciones) o descriptores de acciones (las palabras reservadas); ambas situaciones son reconocidas bajo el mismo patrn de identificador y la tabla de smbolos se emplea para hacer su discriminacin. El analizador de lxico funciona bajo el siguiente mecanismo:
REPITE Token = AnaLex(); SI Token == Identificador ENTONCES Token= REVISA_RESERVADAS(lexema) FSI HASTA QUE Token == EOF FREPITE

Como las palabras reservadas es un conjunto de entidades conocido y finito, la tabla de smbolos se inicializa con ellas y cuando se reconoce un identificador, su lexema se busca en la tabla y si se encuentra en ella, se regresa el token correspondiente a travs de invocar a la funcin REVISA_RESERVADAS. El algoritmo de la funcion REVISA_RESERVADAS es el siguiente:
REVISA_RESERVADAS(lexema) INICIO p=BUSQUEDA(lexema) SI p == 0

Pag 29

Programacin de Sistemas
ENTONCES p=INSERTAR(lexema) FSI Regresa TABLA[p].Token FIN

Este algoritmo supone al existencia de dos funciones que realizan la bsqueda y la insercin de un lexema en la tabla de smbolos, considerando de la existencia de la siguiente estructura de la tabla de smbolos:

donde ltima_entrada direcciona la ltima entidad registrada y ltimo_lexema la primera localidad disponible donde se registran los lexemas. La funcin BUSQUEDA se guia bajo el siguiente algoritmo:
BUSQUEDA (lexema) INICIO Indice=ltima_entrada MIENTRAS ndice>0 REPITE Si contenido(TABLA[Indice].Ap_lexema)==lexema ENTONCES regresa Indice SINO Indice:=Indice-1 FSI FREPITE Regresa Indice FIN

donde es de notar que la bsqueda se inicia de la ltima entidad registrada hacia la primera bajo el supuesto que en un programa se encuentran con mayor frecuencia referencias a variables (que se registran al final) que a palabras reservadas (que estan registradas al inicio de la tabla). Si la bsqueda fracasa, la entidad tiene que darse de alta por la funcin INSERTAR, cuyo algoritmo es: Pag 30

Programacin de Sistemas
INSERTAR (lexema) INICIO LEXEMAS[ltimo_lexema] = lexema ltima_entrada = ltima_entrada + 1 TABLA[ltima_entrada].Ap_lexema = ltimo_lexema. TABLA[ltima_entrada].Token = ltima entrada. ltimo_lexema = ltimo_lexema + LONGITUD(lexema). Regresa ltima_entrada FIN

Donde LONGITUD es una funcin que determina el nmero de caracteres que conforman al lexema insertado.

3.4.1 Cuando construir la tabla de smbolos y cuando interactuar con ella. El punto del procesador de traduccin en el cual son invocadas las rutinas de manejo de la tabla de smbolos dependen primeramente del nmero y la naturaleza de los pasos del compilador. En un compilador multipasos, la tabla de smbolos es creada durante el paso de anlisis lxico. Por medio de un ndice se entra a la tabla de smbolos para ubicar la variable, a partir del token generado por el scanner.

3.4.2 Contenido de la tabla de smbolos. Una tabla de smbolos puede conceptualizarse como una serie de renglones, cada uno de los cuales contiene una lista de valores de atributos que son asociados con una variable en particular. Las clases de los atributos que aparecen en una tabla de smbolos dependen en algn grado de la naturaleza del lenguaje de programacin para el cual se escribe el compilador. Por ejemplo, un lenguaje puede ser sin tipos, y por lo tanto el atributo tipo no necesita aparecer en la tabla. Similarmente, la organizacin de la tabla de smbolos variar dependiendo de las limitaciones de memoria y tiempo de acceso. A continuacin se presenta un ejemplo de una tabla de smbolos tpica. Nmer Nombre Direcci o Variable n. Tipo Valo Lnea Lnea Liga r Declaraci Referenciada n 2 1 2 9,14,25 3 Pag 31

Empres 0

Programacin de Sistemas a 2 3 4 5 6 7 X3 Formal B Resp M 4 8 48 52 56 1 3 1 1 6 1 0 2 0 0 0 0 3 4 5 5 6 7 12,14 36,37,38 10,11,13,23 11,23,25 17,21 28,29,30,38 0 6 1 2 7 5

Primero 64

Los atributos que se manejan en la tabla anterior y que se describen enseguida, no son estrictamente necesarios para todos los compiladores; sin embargo, cada uno de tales atributos deber ser considerado para la implementacin de un compilador de un compilador en particular. 1. Nombre de la variable. 2. Direccin del cdigo objeto. 3. Tipo. 4. Valor (o nmero de parmetros para uno procedimiento). 5. Nmero de lnea fuente donde fue declarada la variable. 6. Nmeros de lnea fuente donde se hace referencia a la variable. 7. Liga. Campo cuyos valores sirven para listar las variables en orden alfabtico. El nombre de la variable debe estar, en cualquier caso, formando parte de la tabla de smbolos, ya que es el medio por el cual una variable en particular es identificada en las etapas de anlisis semntico y generacin de cdigo. Para proveer un acceso rpido, es conveniente manejar un tamao predefinido pero lo suficientemente grande para los nombres de las variables. Una longitud igual o mayor que 16 caracteres es bastante adecuado. El identificador completo puede almacenarse, justificado a la izquierda, en un campo de longitud fija en la tabla de smbolos. Este criterio posibilita un acceso ms rpido a la tabla de smbolos, a costa de no aprovechar eficientemente el espacio de almacenamiento en el caso de las variables con identificadores cortos. Otro criterio para manejar los identificadores en la tabla de smbolos consiste en colocar una cadena descriptora en el campo Nombre_Variable de la tabla. El descriptor contiene los subcampos posicin y longitud. El subcampo posicin es un apuntador que indica la posicin del primer carcter del nombre de la variable Pag 32

Programacin de Sistemas en un rea general de cadenas, y el subcampo describe el nmero de caracteres del nombre de la variable. Este enfoque produce un acceso ms lento a la tabla de smbolos, pero ofrece un ahorro considerable de espacio de almacenamiento. En el proceso de compilacin, una direccin de cdigo objeto debe asociarse con todo variable en un programa. Esta direccin establece la ubicacin relativa para los valores de la variable en tiempo de ejecucin. La direccin del cdigo objeto se coloca en la tabla de smbolos cuando la variable es declarada (o encontrada por primera vez). Esta direccin es reinvocada desde la tabla cuando la variable es referenciada en el programa fuente. La direccin es luego utilizada en una instruccin objeto que accesa (carga o almacena) el valor de esa variable. El atributo tipo se almacena en la tabla de smbolos cuando los lenguajes compilados tienen tipos de datos explcitos o implcitos. Tradicionalmente, el tipo de dato de una variable es almacenado codificada en la tabla de smbolos; por ejemplo 1 puede representar el tipo real, 2 el tipo integer, etc. Los atributos nmero_de_dimensiones y nmero_de_parametros son importantes en la fase de anlisis semntico. En las referencias a los arreglos, el nmero de dimensiones debe coincidir con el especificado en la declaracin del arreglo, y esto debe ser verificado en la fase de anlisis semntico. El nmero de dimensiones se utiliza tambin como parmetro en el clculo de la direccin de un elemento particular del arreglo. El nmero de parmetros de la invocacin a un procedimiento tambin debe coincidir con el nmero usado en la declaracin. En la construccin de la tabla de smbolos, es conveniente considerar el nmero de parmetros de un procedimiento como su nmero de dimensiones y as combinar estos dos atributos en uno. Adems de conveniente, este enfoque tambin es consistente, ya que el tipo de verificacin semntica para ambos atributos es similar. El atributo liga se ha incluido en la tabla de ejemplo simplemente para facilitar la produccin de un listado de referencias cruzadas ordenado alfabticamente por nombre de variable.

Pag 33

Programacin de Sistemas

4.1.1 Anlisis Descendente. Un analizador gramatical descendente es conducido por una tabla (llamada M) que permite sustituir al axioma por los lados derechos de producciones de la gramtica hasta obtener la entrada que se est analizando. Generalmente esta sustitucin se realiza reemplazando al noterminal ms a la izquierda en una sustitucin anterior por una forma equivalente (el lado derecho de una produccin para ese noterminal). La tabla M tiene entradas por renglones para los noterminales de la gramtica y columnas que representan los terminales. La tabla M se construye con el siguiente algoritmo:

CREACION DE LA TABLA M 1.- Por cada produccin A de la gramtica, hacer 2 y 3. ), agregar agregar b]

2.- Por cada terminal a en primero ( A a M [A, a]

3.Si esta en PRIMERO( ), A a M [A, para cada b en SIGUIENTE(A). 4.- Hacer error para cada localidad vaca.

El analizador descendente se gua consultando la tabla M y realizando las acciones que indica el siguiente algoritmo:

ANALIZADOR RECURSIVO

GRAMATICAL

DESCENDENTE

PREDICTIVO

NO

Entrada: Cuerda W y tabla M para la gramtica G. Salida: Si W est generada de acuerdo a G, se obtiene la derivacin ms a la izquierda; si no, error. Mtodo: Inicialmente $ Axioma estn en la pila del analizador y W$ est en el buffer de entrada. 1.- Colocar ip en el smbolo inicial de W$. 2.- REPETIR. Sea X el simbolo en la cima de la pila y a el simbolo apuntado por ip. Si X es un terminal o $

Pag 34

Programacin de Sistemas Entonces Si X = a Entonces Saca X de la pila y avanza ip Sino error Fin -Si Sino Si M[X,a] = X Y1 Y2 ...Yk Entonces Saca X de la pila. Mete Yk, Yk-1 , ........ Y1 en la pila con Y1 en la cima. Escribe la produccion X Y1 Y2 ...Yk Sino error FinSi FinSi 3.- Hasta - Que X = $ Ejemplo: Considernado la siguiente gramtica (sin recursin izquierda) EXPRESION EXPRESION ' FACTOR TERMINO ' EXPRESION ' (1)

OPSR TERMINO EXPRESION (2) ' (3)

TERMINO TERMINO '

FACTOR TERMINO ' OPMD FACTOR TERMINO'

(4) (5) (6)

FACTOR

( EXPRESION ) OPERANDO

(7) (8) (9) (10) (11) (12)

OPSR

+ -

OPMD

* /

Pag 35

Programacin de Sistemas

Podemos construir la siguiente tabla M: Noterminal EXPRESION EXPRESION' TERMINO TERMINO' FACTOR OPSR OPMD (8) (9) (10 ) (11 (12) ) (4) (6) (6) (5) (5) (7) Operand + o (1) (2) (2) (4) (6) (6) * / ( (1) (3) (3) ) $

Pag 36