Está en la página 1de 12

TEMA1. CONCEPTOS FUNDAMENTALES.

CONTENIDOS 1.1.- Generalidades. 1.1.1.- Tipos de Traductores. 1.2.- Conceptos Bsicos sobre Compiladores. 1.3.- Notaciones. 1.4.- Bootstrapping. 1.5.- Estructura de un Compilador.

1.1. GENERALIDADES Traductor : Es una mquina terica que tiene como entrada un texto escrito en un lenguaje L1 y como salida un texto escrito en el lenguaje L2. Habitualmente se denomina a L1 lenguaje fuente y a L2 lenguaje objeto. 1.1.1. Tipos de Traductores : Las tcnicas que desarrollaremos en esta asignatura no slo son vlidas para el desarrollo de compiladores, sino que son aplicables en general a todos los sistemas de traduccin. Estos sistemas pueden ser de distintos tipos => Traductores de lenguaje natural : Seran los que tradujeran un lenguaje natural en otro, por ejemplo espaol a ingls. Esto en la actualidad no se ha conseguido debido fundamentalmente a la ambigedad del lenguaje natural, los mayores logros en la materia siempre trabajan con un subconjunto del lenguaje natural, limitando las construcciones y /o las palabras, etc... Este tema es tambin abordado con tcnicas de Inteligencia Artificial. Compilador : Es un traductor que convierte un texto escrito en un lenguaje fuente de alto nivel en un programa objeto en cdigo mquina. Intrprete : Es un traductor que realiza la operacin de compilacin paso a paso, para cada sentencia que compone el texto de entrada, ejecuta dicha sentencia y vuelve a iniciar el proceso con la sentencia siguiente. La principal ventaja del proceso de compilacin frente al de interpretacin es que los programas se ejecutan mucho ms rpidamente una vez compilados, por el contrario, es m s cmodo desarrollar un programa mediante un interprete que mediante un compilador puesto que en el intrprete las fases de edicin y ejecucin estn ms integradas. Preprocesador : Procesan un texto fuente modificndolo de una forma ms o menos ligera antes de su compilacin autntica. As se consigue que el usuario tenga a su disposicin un lenguaje m s potente y adaptado a sus necesidades. Por ejemplo la adicin de conjuntos de macroinstrucciones ajenas al lenguaje,... Conversores Fuente-Fuente: Traducen un lenguaje fuente a otro.

Rutina de anlisis de comandos : Son aquellas que actan sobre un programa ya desarrollado sirviendo de intermediarios entre el operador y la entrada a dicho programa. Un ejemplo lo tenemos en el analizador de comandos del Sistema Operativo, el cual transforma una orden de entrada del usuario en una secuencia de llamadas a rutinas del S.O.

1.2. CONCEPTOS BASICOS Ensambladores : Son compiladores cuyo lenguaje de entrada, llamado ensamblador permite la traduccin de cada sentencia fuente a una instruccin en cdigo mquina. Compilador cruzado : Es el que genera un cdigo objeto ejecutable en un ordenador distinto de aquel en el que se realiza la compilacin. Compilacin-Montaje-Ejecucin : En las aplicaciones grandes es conveniente fragmentar el programa a realizar en mdulos que se compilan por separado y una vez que estos estn compilados unirlos mediante un programa denominado montador para formar el mdulo ejecutable. El montador se encarga a su vez de incluir las libreras en donde se guardan las funciones predefinidas de uso comn. Compiladores en una o varias pasadas : Se llama pasada a cada lectura que hace el compilador del texto fuente. Compilador incremental : Este compilador acta de la siguiente manera. Compila un programa fuente. Caso de detectar errores al volver a compilar el programa corregido slo compila las modificaciones que se han hecho respecto al primero. Autocompilador : Es aquel que est escrito en el mismo lenguaje que se pretende compilar. Supongamos por ejemplo que queremos desarrollar la versin 2.0 de un compilador Pascal. Dicho compilador generar un cdigo mucho ms r pido y eficiente que el que generaba la versin anterior 1.0. Sin embargo son ya muchas las m quinas (IBM 370, Serie 1, PDP 11 ..) que disponen del antiguo compilador, o que al menos tienen otro compilador Pascal. La mejor opcin consiste en escribir el nuevo compilador en Pascal, ya que as podr ( el compilador ) ser compilado en las distintas m quinas por los compiladores Pascal ya existentes. Metacompiladores : Es un traductor que tiene como entrada la definicin de un lenguaje y como salida el compilador para dicho lenguaje. Como ejemplo estn los programas Lex y Yacc de Unix. Decompilador : Es el que traduce cdigo mquina a lenguaje de alto nivel. Los decompiladores m s usuales son los desensambladores, que traducen un programa en lenguaje mquina a otro en ensamblador.

1.3. NOTACIONES La notacin ms empleada en compiladores es la notacin en T que representa grficamente los tres lenguajes implicados en el proceso de compilacin: Lenguaje Fuente : lenguaje origen que traduce el compilador. Lenguaje Objeto : lenguaje meta, al cual traduce el compilador. Lenguaje del Compilador : lenguaje en el que esta compilador. escrito el

#include main()

Lenguaje Fuente Lenguaje Del Compilado

Lenguaje Mquina

01010101 01010101 01010111 1010

1.4. BOOTSTRAPPING Es una tcnica muy usada para el desarrollo de compiladores de lenguajes de alto nivel, en especial si queremos obtener un autocompilador. Supongamos que queremos implementar un nuevo lenguaje A(N) en una mquina determinada. Disponemos slo de un ensamblador para dicha mquina. En principio parece que la solucin es escribir un compilador en lenguaje ensamblador que traduzca desde el lenguaje A(N) al lenguaje mquina LM.

Esto en la prctica resulta bastante complicado dado que programar en ensamblador es muy engorroso. Lo que se hace en estos casos es desarrollar un lenguaje restringido A(1) parecido al A(N) pero m s simple, y para este lenguaje escribir el compilador en ensamblador. Posteriormente dado que nuestra m quina es ya capaz de entender el lenguaje A(1) podemos desarrollar un compilador para otro lenguaje A(2) escribindolo en el lenguaje A(2), y as sucesivamente hasta llegar a obtener un autocompilador del lenguaje A(N). Esta tcnica se conoce como bootstrapping y gracias a ella se obtuvo el primer compilador de Pascal desarrollado en Zurich por Wirth.

A(N) A(N-1)

LM

A(N1) A(N-2)

LM

...

1.5. ESTRUCTURA DE UN COMPILADOR Un compilador es un programa, y como tal, podemos distinguir en l dos subprogramas o fases principales : una fase de Anlisis, en la cual se lee el programa fuente y se estudia la estructura y el significado del mismo, y otra fase de Sntesis, en la que se genera el programa objeto, que es la traduccin del anterior a un lenguaje ms simple, capaz de ser ejecutado directamente por la m quina. Estas fases a su vez veremos que pueden subdividirse. Relacionados con estos procesos existen una serie de tablas auxiliares, la ms importante de las cuales es la Tabla de Smbolos, un sistema de manejo o gestin de dichas tablas y una serie de rutinas auxiliares para deteccin de errores. El esquema general de un compilador podra ser el siguiente :

#include <conio.h> main() {

int a; int b;

FASE ANLISIS Anlisis Lexicogrfico Rutinas Tratamiento de Errores

Anlisis Sintctico Anlisis Semntico Rutinas Gestin de Tablas Cdigo Intermedio

FASE SINTESIS

TABLA DE SMBOLOS

Optimizar Cdigo Cdigo Objeto

01110010101 01010101000 01011101010

Las funciones de estos mdulos son las siguientes : * Analizador Lexicogrfico : Lee los caracteres del programa fuente y construye con ellos unos smbolos intermedios (tokens), simplificando el texto para el proceso siguiente. Las principales funciones que realiza son => - Identificar los smbolos. - Eliminar los blancos, caracteres de fin de lnea, ... - Eliminar los comentarios que acompaan al fuente. - Crear unos smbolos intermedios llamados tokens. - Avisar de los errores que detecte. Ejemplo => A partir de la sentencia en PASCAL siguiente Program Prueba; Var nuevo, viejo: integer ; razon: real; Begin nuevo := viejo + razon * 2 End. genera un cdigo simplificado para el anlisis sintctico posterior, por ejemplo. <id1> <:=> <id2> <+> <id3> <*> <cte_ent> Nota: Cada elemento encerrado entre <> representa un nico token. Las abreviaturas id y cte_ent significan identificador y entero respectivamente. * Analizador Sintctico : Comprueba que las sentencias que componen el texto fuente son correctas en el lenguaje en cuestin, creando un lenguaje interno que corresponde a la sentencia analizada, de esta

manera se garantiza que slo ser n procesadas las sentencias que pertenezcan al lenguaje fuente. Durante el anlisis sintctico as como en las dems etapas se van mostrando los errores que se encuentren. Ejemplo => El esquema de la sentencia anterior corresponde al de una sentencia de asignacin del lenguaje Pascal, estas sentencias son de la forma

<ASIGNACIN> <EXPRESIN> <EXPRESIN> <EXPRESIN> <EXPRESIN> <EXPRESIN>

<identificador> <:=> <EXPRESIN> <identificador> <+> <EXPRESIN> <identificador> <*> <EXPRESIN> <identificador> <constante entera> <constante real>

La estructura de nuestra sentencia queda por tanto de manifiesto mediante el siguiente esquema :
<ASIGNACIN>

<id1>

<:=>

<EXPRESION> <+> <EXPRESION> <id3> <*> <EXPRESION>

<id2>

Cte_ent

* Anlisis Semntico : Se ocupa de analizar si la sentencia tiene algn significado. Podemos encontrar sentencias que son sintcticamente correctas pero que no se pueden ejecutar porque carecen de sentido. Muchas veces el anlisis semntico se hace al par que el anlisis sintctico introduciendo en este unas rutinas semnticas.

Ejemplo => En la sentencia que venimos analizando encontramos una variable entera a la cual se le asigna el resultado de una serie de operaciones, sin embargo, algunas de las operaciones se realizan entre identificadores reales, por lo que el resultado de las mismas es real y no puede asignarse a una variable de tipo entero, por lo que tenemos dos alternativas: o emitir un mensaje de error "Discordancia de tipos", o realizar una conversin automtica al tipo superior.

* Generador de cdigo intermedio : El cdigo intermedio es un cdigo abstracto independiente de la mquina para la que se generar el cdigo objeto. Ha de cumplir dos requisitos importantes : ser fcil de generar a partir del anlisis sintctico y ser fcil de traducir al lenguaje objeto final. Esta fase puede no existir si se genera directamente cdigo mquina, pero suele ser conveniente emplearla. Ejemplo => Consideremos por ejemplo un cdigo intermedio de tercetos, llamado as porque en cada una de sus instrucciones aparecen como mximo tres operandos. La sentencia traducida a este cdigo intermedio quedara : temp1 := 2 temp2 := id3 * temp1 temp3 := id2 + temp2 id1 := temp3

* Optimizador de cdigo : A partir de todo lo anterior crea un nuevo cdigo m s compacto y eficiente, eliminando por ejemplo sentencias que no se ejecutan nunca, simplificando expresiones aritmticas, etc... La profundidad con que se realiza esta optimizacin varia mucho de unos compiladores a otros , en el peor de los casos esta fase se suprime. Ejemplo : Siguiendo con nuestro ejemplo vemos que podemos obviar alguna de las operaciones anteriores, quedando por tanto el cdigo optimizado como sigue : temp1 := id3 * 2.0 id1 := id2 + temp1

* Generador de cdigo : A partir de los anlisis anteriores y de las tablas que stos anlisis van creando durante su ejecucin produce un cdigo o lenguaje objeto que es directamente ejecutable por la m quina. Es la fase final del compilador. Las instrucciones del cdigo intermedio se traducen una a una en cdigo mquina reubicable. ( Cada instruccin de cdigo intermedio puede dar lugar a ms de una en cdigo mquina ). Ejemplo : El cdigo anterior traducido a ensamblador quedara : TEMP1:= id3*2.0 MOV id3,R1 MUL #2.0,R1 Id1:=id2+TEMP1 MOV id2,R2 ADD R1,R2 MOV R1,id1 En donde id1,id2,id3 representan las posiciones de memoria en las que se hallan almacenadas estas variables; R1,R2 son los registros de la mquina; y las instrucciones MOV, MUL y ADD representan las operaciones de colocar un valor de memoria en un registro, multiplicar en coma flotante, o sumar.

Como Herramientas auxiliares el compilador utiliza => * Gestor de tablas : Son todos aquellos programas que manejan las tablas y realizan con ellas diversas funciones como aadir nuevos smbolos, buscar un smbolo, etc... * La Tabla de Smbolos : Que es el medio de almacenamiento de toda la informacin referente a las variables, constantes y objetos en general del programa que se est compilando. Ejemplo => hemos visto que en ciertos momentos del proceso de compilacin debemos hacer uso de cierta informacin referente a los identificadores o las constantes que aparecen en nuestra sentencia, como son su tipo, su posicin de almacenamiento en memoria, etc... esta informacin es la que se almacena en la tabla de smbolos. La entrada de elementos en la tabla de smbolos se realiza en la fase de anlisis lexicogrficos, cada vez que se detecte un nuevo identificador o una

nueva constante en el programa que se est compilado. Cada token generado en esta fase es en realidad una pareja de nmeros (i,j), donde i representa el objeto encontrado por ejemplo (1 para indicar que se ha encontrado un identificador, 2 para indicar que se ha encontrado una constante entera, 3 para indicar que se ha encontrado una constante real,...). El nmero j indica la posicin de la tabla de smbolos donde se ha guardado la informacin relativa a ese elemento. Por ejemplo si tenemos el token (1,40) nos indica que se trata de una variable o identificador y que su nombre, tipo, valor, ... est guardado en la posicin 40 de la tabla de smbolos. Opcionalmente tambin pueden existir otras tablas => - La tabla de Bucles. - La tabla de almacenamiento de las tiras de caracteres. - La tabla de almacenamiento para las constantes. * Rutinas de errores : Estn incluidas en cada uno de los procesos de compilacin (anlisis lexicogrfico, sintctico, semntico ) y se encargan de informarnos de los errores que encuentran en nuestro texto fuente. Ejemplo : Como ya vimos el analizador semntico podra emitir un error o al menos un aviso cuando detectase una diferencia en los tipos de una operacin.