Anda di halaman 1dari 40

Escuela de Ingeniera de Sistemas

Lenguajes y Compiladores Introduccin

Compiladores 2007

Objetivos

Conocer los fundamentos de construccin de Compiladores en todas sus fases, presentando los conceptos bsicos, definiciones formales, tcnicas utilizadas, las clases de compiladores, el contexto en el que se desarrollan, as como el tratamiento y recuperacin de errores Aplicar estos conceptos al desarrollo de:

Software de base Software de uso especfico Interfaces de usuario


2

Compiladores 2007

Introduccin

Por qu es importante el estudio de compiladares? Conocer el diseo de los compiladores y su efecto sobre los lenguajes:

Permite desarrollar algoritmos eficientes: por ejemplo cuando usar recursin. Mejora el uso del lenguaje disponible: si el uso de apuntadores es eficiente o no. Ayuda a la depuracin de los errores tanto sintcticos como semnticos

Compiladores 2007

Introduccin
En 1940 surge el 1 lenguaje utilizado en la programacin de computadoras : El lenguaje de mquina (lenguaje de 1era generacin). Cul era ventaja de programar en lenguaje de mquina ? El lenguaje de mquina, es el nico lenguaje que la computadora entiende directamente. Cules eran los inconvenientes o desventajas? Dificultad y lentitud en la codificacin. Gran dificultad para verificar y poner a punto los programas.

Compiladores 2007

Introduccin
Las desventajas Las ventajas. Surge la necesidad de buscar otros lenguajes. Que sucedi a comienzos de la dcada de 1950 ? Criterio : Usar notacin simblica. Cmo se llam a esos lenguajes? Fue el primer intento. Esos lenguajes fueron de alto o bajo nivel? Esos lenguajes presentaron la mayora de inconvenientes que presentaba el lenguaje de mquina?.

>

Compiladores 2007

Introduccin

La interface (de programacin) entre los humanos y las mquinas son los Lenguajes de programacin: La solucin a un problema se especifica a travs de un programa fuente escrito en un Lenguaje de programacin. Es necesario un proceso de traduccin para que los programas fuentes sean entendidos (ejecutados) Los compiladores son necesarios para el desarrollo de cualquier sistema, caso contrario tendramos que programar en lenguaje ensamblador o peor an en lenguaje mquina
6

Compiladores 2007

Lenguajes de programacin

Los lenguajes de programacin han evolucionado


Lenguaje de mquina: combinacin de 1s y 0s Lenguaje montador (ensamblador): uso de mnemnicos y direcciones de memoria Lenguajes basados en clculos numricos:
ForTran, AlGol, PL/1, Pascal, Basic

Lenguajes para los negocios: COBOL Lenguajes para inteligencia artificial: LISP Lenguajes para sistemas: C Lenguajes orientados a objetos: C++, Object Pascal Lenguajes visuales: Entornos de desarrollo
7

Compiladores 2007

Introduccin

Lenguaje Objeto: Conjunto de instrucciones que un computador entiende y ejecuta, es una combinacin de 1s y 0s. Lenguaje ensamblador: Conjunto de instrucciones cuyas operaciones se especifican a travs de mnemnicos que representan cdigos de operaciones. Es como un lenguaje objeto codificado. Lenguaje de programacin: Conjunto de instrucciones ms cercanas al lenguaje humano y que permiten especificar algoritmos y estructuras de datos.
8

Compiladores 2007

Introduccin

Lenguajes de programacin Lenguaje Objeto

Lenguaje Natural

Compiladores 2007

Introduccin
Programa fuente Escrito en Lenguaje de programacin

Traductor
Ensambladores. Compiladores. Interpretes.

Lenguaje Natural

Lenguaje Objeto

Compiladores 2007

10

Traduccin

La idea bsica es tener un traductor que permita al computador entender (ejecutar) un programa escrito en un lenguaje de programacin. Los softwares que realizan estas traducciones son conocidos como Compiladores En una visin simplista el compilador recibe una programa fuente y genera un programa objeto.
Fuente

Compilador

Objeto

Compiladores 2007

11

Tipos

Ensamblador: recibe un programa en lenguaje ensamblador y genera programa objeto. Compilador: recibe un programa escrito en un lenguaje de programacin y genera un programa objeto. Intrprete: Analiza una instruccin fuente y la ejecuta directamente sin generar cdigo objeto. Preprocesador. Permite sustituir macros, incluir archivos, entre otras funciones. Generalmente es un paso anterior a la traduccin.
12

Compiladores 2007

Introduccin

Programa fuente assembly language

Ensamblador

Traductor

Lenguaje Objeto

Compiladores 2007

13

Introduccin

Programa fuente Escrito en Lenguaje de Programacin de A.N.

Compilador

Traductor

Lenguaje Objeto

Compiladores 2007

14

Ambiente de compilacin

Luego de la generacin del cdigo objeto a veces es necesario importar algunas funciones estndares lo que significa combinar el cdigo obtenido con otros previamente almacenados, de manera que se forme un cdigo ejecutable y se pueda ubicar en la memoria para su ejecucin. Los encargados de realizar estas funciones son conocidos como Cargadores y Editores de enlaces.

Compiladores 2007

15

Ambiente de compilacin
Fuente Compilador

Objeto Cargador Ed. Enlace Ejecutable


Compiladores 2007

16

Cargadores y Editores de enlace

Editor de enlace: permite formar un solo programa a partir de varios archivos de cdigo de mquina reubicables, ya obtenidos de compilaciones o almacenados en bibliotecas de rutinas. Cargadores: Resuelve el problema de direcciones absolutas y/o programas reentrantes. Tiene como objetivo ubicar el programa en memoria para su ejecucin.

Compiladores 2007

17

Modelo
En el proceso de traduccin existen dos tareas bsicas: Anlisis (front-end): El texto de entrada es examinado, verificado y comprendido. Generacin de Cdigo (back-end): Se genera cdigo objeto equivalente a la cadena de entrada. Esto permite que: Front-end y back-end se comuniquen solo a travs de la representacin intermedia. Front-end depende slo del lenguaje fuente (independe del lenguaje objeto) Back-end depende exclusivamente del lenguaje objeto (independe del lenguaje fuente). Compiladores *

2007

18

Anlisis

Compiladores 2007

Normalmente asociamos la Sintaxis a la idea de forma, mientras que la Semntica se asocia a significado o contenido. As la sintaxis de un lenguaje debe describir todos los aspectos relativos a la forma de construccin de programas correctos, mientras que la semntica debe describir lo que sucede cuando el programa es ejecutado. Tericamente slo los programas correctos pertenecen al lenguaje y los programas incorrectos no tienen inters. Un programa o es del lenguaje (est correcto) o no es del lenguaje (no est correcto).
19

Anlisis

Pero en la prctica cuando un programa no est correcto un buen compilador debe indicar este hecho y tratar de ayudar al usuario a transformalo en un programa correcto. El tratamiento de errores incluye mensajes informativos y una recuperacin del error para que el anlisis contine y otros errores sean detectados. Normalmente el anlisis se divide en lxico, sintctico y semntico.

Compiladores 2007

20

Fases de un compilador

Las fases de un compilador son:


Anlisis lxico Anlisis Sintctico Anlisis Semntico Generacin de cdigo

Compiladores 2007

21

Fases de un compilador
Analizador Lxico

Analizador Sintctico
Analizador Semntico

Administrador de la tabla de smbolos

Generador de Cdigo

Manejador de errores

Optimizador de Cdigo

Compiladores 2007

22

Analizador Lxico

Tiene como finalidad la separacin e identificacin de los elementos que componen un programa, igualmente elimina los elementos decorativos como blancos, comentarios, etc. Como resultado de este anlisis los items como identificadores, palabras reservadas, operadores, etc. son reconocidos (comnmente a travs de un cdigo y una cadena de caracteres).

Compiladores 2007

23

Analizador Lxico

Ejemplo:
if x > 0 then modx := x {x es positivo} else modx := (-x) {x es negativo}

Compiladores 2007

24

Analizador Lxico

Luego del anlisis lxico tendramos la secuencia de elementos (tokens):


Tipo de token palabra reservada if identificador operador mayor literal numrico palabra reservada then identificador operador de atribucin Valor del token if x > 0 then modx :=
25

Compiladores 2007

Analizador Lxico

Normalmente los tipos de tokens se representan con valores de un tipo enumerado o con valores numricos Generalmente la implantacin de un analizador lxico (scanner) se basa en un autmata finito que reconoce las diferentes construcciones. El anlisis lxico puede ser complicado dependiendo del lenguaje fuente, por ejemplo Fortran no tiene palabras reservadas, permite el uso de blancos en los identificadores entre otras caractersticas que hacen que el scanner sea bastante complejo.
26

Compiladores 2007

Analizador Lxico

Ejemplo: DO 10 I = 5

Puede ser el inicio de un comando de asignacin DO 10 I = 5. Puede ser el inicio de un comando repetitivo DO 10 I = 5, 10

Note que slo cuando aparece el . o la , se sabe con seguridad que comando estamos analizando. La mayora de los lenguajes modernos trata de simplificar la implantacin de los scanners
27

Compiladores 2007

Analizador Sintctico

Tambin conocido como Parser. Tiene como finalidad reconocer la estructura global del programa, verificando que los comandos, declaraciones, expresiones cumplan con las reglas de composicin (est bien escrito). Para el programa presentado antes se debera reconocer que se trata de un <comando>, mas especficamente de un <comando-if> compuesto de la palabra reservada if, seguido de una <expresin>, seguida de la palabra reservada then, etc.
28

Compiladores 2007

Analizador Sintctico

Normalmente las reglas de formacin de los lenguajes se expresan mediante reglas gramaticales (que se conoce como gramtica de un lenguaje) Existen tipos de gramticas y a cada uno corresponde una forma de realizar el anlisis sintctico, lo que da origen a los diferentes mtodos de parsers. Un aspecto importante de los analizadores sintcticos es la recuperacin de errores es decir una vez detectado el error cmo continuar con el anlisis sintctico?
29

Compiladores 2007

Analizador Sintctico

Ejemplo: forb I := 1 to 10 do ..; Si se detecta el error en el identificador forb seguido de otro identificador I (no es inicio de ningn comando vlido), podemos considerar forb como error y asumir que I es el inicio de una asignacin; cuando se encuentra la palabra reservada to nuevamente dar error puesto que una asignacin no contiene esa palabra reservada. Es claro que seguiremos generando errores (que no existen) como consecuencia de una palabra reservada mal escrita y principalmente de una recuperacin no muy correcta.
30

Compiladores 2007

Analizador Semntico

Bsicamente el anlisis Semntico trata los aspectos sensibles al contexto de la sintaxis de los lenguajes de programacin. Por ejemplo no se puede representar en una gramtica libre de contexto una regla como: todo identificador debe ser declarado antes de ser usado, es responsabilidad del anlisis semntico verificar si esa regla se cumpli o no. En muchos casos un gran apoyo para esta fase es la denominada Tabla de smbolos

Compiladores 2007

*
31

Analizador Semntico

Se dice que el anlisis semntico es dirigido por la sintaxis: se asocia a cada regla de la gramtica una accin (accin semntica) que ser ejecutada cada vez que se seala la regla. Estas acciones son implantadas frecuentemente como llamadas a rutinas semnticas y pueden ser responsables por realizar el anlisis semntico y la generacin de cdigo. No existe una frontera definida entre lo que debe ser tratado por el anlisis sintctico o lo que debe ser tratado por el anlisis semntico, quedando esta decisin a criterio del diseador del compilador.
32

Compiladores 2007

Tabla de Smbolos

Tambin conocida como tabla de identificadores Es una estructura de datos que contiene un registro por cada identificador del programa (con sus atributos). Esta estructura permite encontrar rpidamente el registro para cada identificador y almacenar o consultar de manera eficiente los campos dentro de ese registro. Por tanto guarda informacin sobre los identificadores (nombre, tipo, mbito, direccin de memoria, nmero de parmetros y tipo si fuera un nombre de procedimiento, etc.)
33

Compiladores 2007

Tabla de Smbolos

Es una tabla muy importante por cuanto apoya a las diferentes etapas de la traduccin. Su estructura y organizacin en general depende de las caractersticas del lenguaje fuente.

Compiladores 2007

34

Generacin de cdigo

A veces se construye una representacin intermedia del programa fuente para ser usada como base para la generacin del cdigo objeto. Suponiendo que la forma de ese cdigo intermedio es buena entonces el proceso de generacin de cdigo depende slo de la arquitectura de la mquina para la cual el cdigo ser generado. Las mquinas sencillas ofrecen pocas opciones y eso implica en un proceso de generacin de cdigo ms directo.
*
35

Compiladores 2007

Generacin de cdigo

Ejemplo: para la expresin


x := a + b * c

Usando variables temporales para guardar operaciones intermedias, podemos generar el siguiente cdigo, que aunque correcto puede ser optimizado:

Compiladores 2007

36

Generacin de cdigo
Load b Mult c Store t1 Load a Add t1 Store t2 Load t2 Store x

Podemos notar que hay instrucciones no necesarias. Un cdigo optimizado sera:


Compiladores 2007
37

Generacin de cdigo
Load b Mult c Add a Store x

Este tipo de optimizacin de cdigo se denomina dependiente de la mquina porque usa las caractersticas de la mquina para optimizar el cdigo. Hay optimizaciones que son independientes de la mquina y cuya preocupacin principal es analizar el programa ms que las caractersticas de la mquina.
38

Compiladores 2007

Tratamiento de errores

Un problema muy importante que hay resolver en cualquier fase de un traductor es la recuperacin de errores. Es es: como continuar con el proceso una vez que se detect un error de manera tal a no emitir mensajes de errores no existentes. Errores lxicos: abre y no se cierran Errores sintcticos: comandos mal escritos Errores semnticos: variable no declarada.

Compiladores 2007

39

Tratamiento de errores

Se han realizado intentos para tener compiladores que no slo se recuperen de un error sino mas bien traten de corregir los errores para continuar con un programa sin error que se pueda ejecutar. No se trata de un problema trivial y se tendran que aplicar tcnicas de inteligencia artificial Por ejemplo si tenemos: forb I := 10 Cul fue el error? Variable mal escrita (forbI) o palabra reservada mal escrita (for)?
40

Compiladores 2007