Está en la página 1de 40

Facultad de Ingeniera de Sistemas

Lenguajes y Compiladores Introduccin

Compiladores 1

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
Compiladores
2

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
3

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
4

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
5

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
Compiladores
6

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
Compiladores
7

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.
Compiladores
8

Introduccin

Lenguajes de programacin Lenguaje Objeto

Lenguaje Natural

Compiladores
9

Introduccin
Programa fuente Escrito en Lenguaje de programacin

Traductor
Ensambladores. Compiladores. Interpretes.

Lenguaje Natural

Lenguaje Objeto

Compiladores
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
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.
Compiladores
12

Introduccin

Programa fuente assembly language

Ensamblador

Traductor

Lenguaje Objeto

Compiladores
13

Introduccin

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

Compilador

Traductor

Lenguaje Objeto

Compiladores
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
15

Ambiente de compilacin
Fuente Compilador

Objeto Cargador Ed. Enlace Ejecutable

Compiladores
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
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 *
18

Anlisis
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).
Compiladores
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
20

Fases de un compilador
Las fases de un compilador son:
Anlisis lxico Anlisis Sintctico Anlisis Semntico Generacin de cdigo

Compiladores
21

Fases de un compilador
Analizador Lxico Analizador Sintctico Analizador Semntico Generador de Cdigo

Administrador de la tabla de smbolos

Manejador de errores

Optimizador de Cdigo

Compiladores
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
23

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

Compiladores
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
Compiladores
25

Valor del token if x > 0 then modx :=

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.
Compiladores
26

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
Compiladores
27

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.
Compiladores
28

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?
Compiladores
29

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.
Compiladores
30

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

*
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.
Compiladores
32

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.)
Compiladores
33

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
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.
*
Compiladores
35

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
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
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.
Compiladores
38

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
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)?
Compiladores
40

También podría gustarte