proyecto fernando compiladores 1

33
COMPILADORES 1 COMPILADORES Y ANALIZADOR LEXICOS FERNANDO JACOME MONTES CORPORACION UNIVERSITARIA REMINGTON FACULTAD DE INGENIERIA DE SISTEMAS SEMESTRE VI 2014

Upload: fernando-jacome-montes

Post on 22-Jul-2015

90 views

Category:

Business


0 download

TRANSCRIPT

Page 1: Proyecto fernando compiladores 1

COMPILADORES

1

COMPILADORES Y ANALIZADOR LEXICOS

FERNANDO JACOME MONTES

CORPORACION UNIVERSITARIA REMINGTON

FACULTAD DE INGENIERIA DE SISTEMAS

SEMESTRE VI

2014

Page 2: Proyecto fernando compiladores 1

COMPILADORES

2

TABLA DE CONTENIDO

1. INTRODUCCION………………………………………………………………3

2. JUSTIFICASION……………………………………………………………….4

3. OBJETIVOS…………………………………………………………………….5

3.1 0BJETIVOS GENERALES……………………………………………….5

3.2 OBJETIVOS ESPECIFICOS……………………………………………..6

4. COMPILADOR………………………………………………………………….7

5. FASES DEUN COMPILADOR………………………………………………..8

5.1 ANÁLISIS LÉXICO…………………………………………………………9

5.2 ANALISIS SINTACTICO…………………………………………………..11

5.3 ANALISIS SEMANTICO…………………………………………………...12

5.4 GENERACION Y OBTIMIZACION DE CODIGO INTERMEDIO………13

5.5 GENERACION DE CODIGO OBGETO…………………………………..14

6. ANALISIS LEXICO………………………………………………………………16

7. AUTOMATA FINITO…………………………………………………………….17

7.1 AUTOMATA FINITO DETERMINISTA…………………………………...19

7.2 AUTOMATA FINITO NO DE TERMINISTA……………………………...21

8. AUTOMATA DE PILA…………………………………………………………...23

9. DIAGRAMA DE ESTADO……………………………………………………….26

10. DIAGRAMA DE PILA…………………………………………………………….27

11. PRESENTACION Y DEFINICION E IMÁGENES…………………………….30

12. CONCLUSION…………………………………………………………………...32

13. BIBLIOGRAFIA…………………………………………………………………..33

Page 3: Proyecto fernando compiladores 1

COMPILADORES

3

1. INTRODUCCION

Los principios y técnicas que se usan en la escritura de compiladores se pueden

emplear en muchas otras áreas. Se basa en los conceptos de teoría de autómatas y

lenguajes formales que se están exponiendo en la parte teórica y constituyen un

campo de aplicación práctica bastante directa.

Además de ser sencillo en su manejo y sobre todo confiable,

siendo estas características indispensables para el usuario final. Quien no se fija, ni

pregunta cómo se realiza determinada tarea, pero si es buen critico a la hora de ver

resultados, pero hay otros que contrarios a estos, se hace la pregunta del millón,

"¿Cómo se logra hacer tal y tal cosa? ,"¿Cómo es posible que un graficado trabaje tan

rápido?, ¿Cómo es posible que un procesador de palabra a la hora de usar un

diccionario sea tan eficiente?, ¿Cómo es posible llevar los resultados de una aplicación

a otra?, o ¿Cómo es posible que un programa que fue creado por una empresa puede

trabajar con los datos de obtenidos de otro programa, echo por otra empresa ?.Muchas

pueden ser las respuestas, algunos argumentaran que es el sistema operativo, otros

dirán que son las normas y estándares establecidos

Page 4: Proyecto fernando compiladores 1

COMPILADORES

4

2. JUSTIFICACION

Con esta denominación se agrupan temas que, en currículos clásicos, pueden ser

incluidos de lenguajes formales y de compiladores. Por lo que se consigue establecer

esta comunicación entre seres humanos y computadores con un tipo de lenguaje a

medio camino entre ambos interlocutores, conocido como lenguaje de programación, el

cual se puede definir como un conjunto de notaciones usadas para describir procesos

computacionales a las personas y las maquinas (programas), y su importancia radica

en que han ayudado a construir el mundo actual que conocemos basado en el

computador, esto debido a que todo el software existente en un computador debe ser

escrito en algún lenguaje de programación, pero antes de que un programa pueda ser

ejecutado realmente en un computador, el mismo primero debe ser traducido a una

forma especial que pueda ser ejecutada y comprendida por un computador, siendo esta

labor de traducción llevada a cabo por un software muy especializado conocido con el

nombre de compilador o interprete.

Page 5: Proyecto fernando compiladores 1

COMPILADORES

5

3. OBJETIVOS

3.1 OBJETIVOS GENERALLES

Adquirir una visión general de las técnicas de implementación de traductores de

lenguaje de programación.

En esta asignatura se pone en juego, desde un punto de

vista aplicando los conocimientos adquiridos a lo largo de la carrera proporciona un

buen ejercicio de síntesis sobre la teoría los métodos y las técnicas aprendidas en

programación tales como los compiladores sus fases y cada uno de sus componentes

que se proporcionan a lo largo de este proceso

3.2 OBJETIVOS ESPECIFICOS

Conocer el problema que debe resolver un compilador. Su complejidad así como las

faces que lo conforman.

Aprender a implementar programas en código objeto, para

después aprender a traducir códigos de un lenguaje de alto nivel a código objeto.

Page 6: Proyecto fernando compiladores 1

COMPILADORES

6

Conocer el funcionamiento del analizador léxico, el tipo de

gramáticas que debe reconocer y la forma en la que se puede implementar.

Page 7: Proyecto fernando compiladores 1

COMPILADORES

7

4. COMPILADOR

Los compiladores son programas de computadora que traducen de un lenguaje a otro.

Un compilador toma como su entrada un programa escrito en lenguaje fuente y

produce un programa equivalente escrito en lenguaje objeto.

Generalmente al lenguaje fuente se le asocia como lenguaje

de alto nivel, mientras al lenguaje objeto se le conoce como código objeto (código de

maquina) escrito específicamente para una maquina objeto. A lo largo del proceso de

traducción el compilador debe informar la presencia de errores en el lenguaje fuente.

Diseñar y desarrollar un compilador, no es tarea fácil, y

quizás pocos profesionales de la computación se vean involucrados en esta tarea.

Page 8: Proyecto fernando compiladores 1

COMPILADORES

8

No obstante, los compiladores se utilizan en casi todas las

formas de la computación y cualquiera involucrado en esta área debería conocer la

organización y el funcionamiento básico de un compilado.

Page 9: Proyecto fernando compiladores 1

COMPILADORES

9

5. FACES DE UN COMPILADOR

Un compilador se compone internamente de varias etapas, o fases, que realizan

operaciones lógicas.

Es útil pensar en estas fases como piezas separadas dentro

del compilador, y pueden en realidad escribirse como operaciones codificadas

separadamente aunque en la práctica a menudo se integran.

A continuación describiremos brevemente cada una de ellas:

Análisis Léxico

Análisis Sintáctico

Análisis Semántico

Generación y Optimización de código intermedio

Generación de código objeto

Page 10: Proyecto fernando compiladores 1

COMPILADORES

10

Imagen 1 Faces Del Compilador

Page 11: Proyecto fernando compiladores 1

COMPILADORES

11

5.1 Análisis Léxico: lee la secuencia de caracteres de izquierda a derecha del

programa fuente y agrupa las secuencias de caracteres en unidades con significado

propio (componentes léxicos o “tokens” en inglés).

Las palabras clave, identificadores, operadores, constantes

numéricas, signos de puntuación como separadores de sentencias, llaves, paréntesis,

etc., son diversas clasificaciones de componentes léxicos.

Page 12: Proyecto fernando compiladores 1

COMPILADORES

12

5.2 Análisis Sintáctico: determina si la secuencia de componentes léxicos sigue la

sintaxis del lenguaje y obtiene la estructura jerárquica del programa en forma de árbol,

donde los nodos son las construcciones de alto nivel del lenguaje.

Se determinan las relaciones estructurales entre los

componentes léxicos, esto es semejante a realizar el análisis gramatical sobre una

frase en lenguaje natural. La estructura sintáctica la definiremos mediante las

gramáticas independientes del contexto.

Page 13: Proyecto fernando compiladores 1

COMPILADORES

13

5.3 Análisis Semántico: realiza las comprobaciones necesarias sobre el árbol

sintáctico para determinar el correcto significado del programa.

Las tareas básicas a realizar son: La verificación e inferencia

de tipos en asignaciones y expresiones, la declaración del tipo de variables y funciones

antes de su uso, el correcto uso de operadores, el ámbito de las variables y la correcta

llamada a funciones. La correcta llamada a funciones.

Nos limitaremos al análisis semántico estático (en tiempo de

compilación), donde es necesario hacer uso de la Tabla de símbolos, como estructura

de datos para almacenar información sobre los identificadores que van surgiendo a lo

largo del programa. El análisis semántico suele agregar atributos (como tipos de datos)

a la estructura del árbol semántico.

El analizador semántico registrara el árbol sintáctico con los

tipos de datos de las sub-expresiones y verificara que la asignación tiene sentido para

los tipos, en caso contrario mandara un mensaje de error en correspondencia de tipos.

De esta forma se obtiene un árbol sintáctico con anotaciones.

Page 14: Proyecto fernando compiladores 1

COMPILADORES

14

5.4 Generación Y Optimización De Código Intermedio: La optimización consiste en

la calibración del árbol sintáctico donde ya no aparecen construcciones de alto nivel.

Generando un código mejorado, ya no estructurado, más fácil de traducir directamente

a código ensamblador o máquina, compuesto de un código de tres direcciones (cada

instrucción tiene un operador, y la dirección de dos operándoos y un lugar donde

guardar el resultado), también conocida como código intermedio. Resultado), también

conocida como código intermedio.

La etapa de optimización sólo dependen del lenguaje fuente

(y no de la máquina), se busca principalmente: eliminar sub-expresiones comunes,

identificar código muerto, sustituir operaciones aritméticas, cálculo previo de

constantes, variables de inducción, propagación de copias o código inalcanzable. Suele

ser una fase lenta y compleja.

Page 15: Proyecto fernando compiladores 1

COMPILADORES

15

5.5 Generación De Código Objeto: toma como entrada la representación intermedia y

genera el código objeto. La optimización depende de la máquina, es necesario conocer

el conjunto de instrucciones, la representación de los datos (número de bytes), modos

de direccionamiento, número y propósito de registros, jerarquía de memoria,

encauzamientos, etc.

Suelen implementarse a mano, y son complejos porque la

generación de un buen código objeto requiere la consideración de muchos casos

particulares.

Page 16: Proyecto fernando compiladores 1

COMPILADORES

16

6. ANALIZADOR LEXICO

un analizador léxico o analizador lexicográfico (en inglés scanner) es la primera fase

de un compilador consistente en un programa que recibe como entrada el código

fuente de otro programa (secuencia de caracteres) y produce una salida compuesta de

tokens (componentes léxicos) o símbolos. Estos tokens sirven para una posterior etapa

del proceso de traducción, siendo la entrada para el analizador sintáctico (en inglés

parser).

Page 17: Proyecto fernando compiladores 1

COMPILADORES

17

7. AUTÓMATA FINITO

Un autómata finito (AF) o máquina de estado finito es un modelo computacional que

realiza cómputos en forma automática sobre una entrada para producir una salida.

Este modelo está conformado por un alfabeto, un conjunto

de estados y un conjunto de transiciones entre dichos estados. Su funcionamiento se

basa en una función de transición, que recibe a partir de un estado inicial una cadena

de caracteres pertenecientes al alfabeto (la entrada), y que va leyendo dicha cadena a

medida que el autómata se desplaza de un estado a otro, para finalmente detenerse en

un estado final o de aceptación, que representa la salida.

La finalidad de los autómatas finitos es la de reconocer

lenguajes regulares, que corresponden a los lenguajes formales más simples según la

Jerarquía de Chomsky.

Page 18: Proyecto fernando compiladores 1

COMPILADORES

18

Imagen 2 Autómata Finito

Page 19: Proyecto fernando compiladores 1

COMPILADORES

19

7.1 Autómata Finito Determinista: AFD que reconoce el lenguaje regular conformado

exclusivamente por las cadenas con un número par de ceros y par de unos.

Un autómata finito determinista (abreviado AFD) es un

autómata finito que además es un sistema determinista; es decir, para cada estado q ∈

Q en que se encuentre el autómata, y con cualquier símbolo a ∈ Σ del alfabeto leído,

existe siempre a lo más una transición posible δ(q,a).

En un AFD no pueden darse ninguno de estos dos casos:

Que existan dos transiciones del tipo δ (q, a)=q1 y δ (q,

a)=q2, siendo q1 ≠ q2;

Que existan transiciones del tipo δ (q, ε), salvo que q sea un

estado final, sin transiciones hacia otros estados.

Page 20: Proyecto fernando compiladores 1

COMPILADORES

20

Imagen 3 Autómata Finito Determinista

7.2 Autómata Finito No Determinista: AFND con transiciones δ (q0, b)=q0 y δ (q0,

b)=q1, que acepta el lenguaje regular sobre el alfabeto {a} conformado por todas las

palabras que terminan en b; es decir, que equivale a la expresión regular (a|b)*b+.

AFND-ε a cuyo estado 2 se puede acceder pasando por el estado 3, sin procesar

símbolos de entrada.

Page 21: Proyecto fernando compiladores 1

COMPILADORES

21

Un autómata finito no determinista (abreviado AFND) es

aquel que, a diferencia de los autómatas finitos deterministas, posee al menos un

estado q ∈ Q, tal que para un símbolo a ∈ Σ del alfabeto, existe más de una transición

δ(q,a) posible.

Haciendo la analogía con los AFD, en un AFND puede darse

cualquiera de estos dos casos:

Que existan transiciones del tipo δ (q, a)=q1 y δ (q, a)=q2,

siendo q1 ≠ q2;

Que existan transiciones del tipo δ(q, ε), siendo q un estado

no-final, o bien un estado final pero con transiciones hacia otros estados.

Page 22: Proyecto fernando compiladores 1

COMPILADORES

22

Cuando se cumple el segundo caso, se dice que el autómata

es un autómata finito no determinista con transiciones vacías o transiciones ε

(abreviado AFND-ε). Estas transiciones permiten al autómata cambiar de estado sin

procesar ningún símbolo de entrada.

Imagen 4 autómata finito no determinista

8. AUTOMATA DE PILA

Page 23: Proyecto fernando compiladores 1

COMPILADORES

23

Un autómata con pila, autómata a pila o autómata de pila es un modelo matemático de

un sistema que recibe una cadena constituida por símbolos de un alfabeto y determina

si esa cadena pertenece al lenguaje que el autómata reconoce. El lenguaje que

reconoce un autómata con pila pertenece al grupo de los lenguajes libres de contexto

en la clasificación de la Jerarquía de Chomsky.

8.1 Funcionamiento: Los autómatas de pila, en forma similar a como se usan los

autómatas finitos, también se pueden utilizar para aceptar cadenas de un lenguaje

definido sobre un alfabeto A. Los autómatas de pila pueden aceptar lenguajes que no

pueden aceptar los autómatas finitos. Un autómata de pila cuenta con una cinta de

entrada y un mecanismo de control que puede encontrarse en uno de entre un número

finito de estados. Uno de estos estados se designa como estado inicial, y además

algunos estados se llaman de aceptación o finales.

A diferencia de los autómatas finitos, los autómatas de pila

cuentan con una memoria auxiliar llamada pila. Los símbolos (llamados símbolos de

pila) pueden ser insertados o extraídos de la pila, de acuerdo con el manejo last-in-first-

out (LIFO). Las transiciones entre los estados que ejecutan los autómatas de pila

dependen de los símbolos de entrada y de los símbolos de la pila. El autómata acepta

una cadena x si la secuencia de transiciones, comenzando en estado inicial y con pila

vacía, conduce a un estado final, después de leer toda la cadena x.1

Page 24: Proyecto fernando compiladores 1

COMPILADORES

24

Al igual que un autómata finito un autómata de pila cuenta

con un flujo de entrada y un flujo de control que puede encontrarse en uno de entre un

número finito de estados. Uno de estos estados se designa como el inicial y por lo

menos un estado es de aceptación.

La principal diferencia es que los autómatas de pila cuentan

con una pila en donde pueden almacenar información para recuperarla más tarde.

Page 25: Proyecto fernando compiladores 1

COMPILADORES

25

Imagen 5 Representación De Autómata De Pila

9. DIAGRAMA DE ESTADO

Page 26: Proyecto fernando compiladores 1

COMPILADORES

26

Los diagramas de estados son una técnica conocida para describir el

comportamiento de un sistema. Describen todos los estados posibles en los que

puede entrar un objeto particular y la manera en que cambia el estado del

objeto, como resultado de los eventos que llegan a él. En la mayor parte de las

técnicas OO, los diagramas de estados se dibujan para una sola clase,

mostrando el comportamiento de un solo objeto durante todo su ciclo de vida.

Existen muchas formas de diagramas de estados, cada una

con semántica ligeramente diferente. La más popular que se emplea en las técnicas de

OO se basa en la tabla de estados de David Harel (Vol. 8). OMT fue quien la usó por

primera vez para los métodos de OO y fue adoptada por Grady Booch en su segunda

edición (1994).

10. MAQUINA DE PILA

Page 27: Proyecto fernando compiladores 1

COMPILADORES

27

Una máquina de pila es un modelo computacional en el cual la memoria de la

computadora toma la forma de una o más pilas. El término también se refiere a un

computador real implementando o simulando una máquina de pila idealizada.

Adicionalmente, una máquina de pila también puede

referirse a una máquina verdadera o simulada con un conjunto de instrucciones de "0

operandos”. En tal máquina, la mayoría de las instrucciones implícitamente operan en

valores en el tope de la pila y reemplazan esos valores por el resultado. Típicamente

tales máquinas también tienen una instrucción "load" y una instrucción "store" que leen

y escriben a posiciones arbitrarias de la RAM. (Como el resto de las instrucciones, las

instrucciones "load" y "store" no necesitan ningún operando en una máquina de pila

típica - ellas siempre toman la dirección de la RAM que se quiere leer o escribir desde

el tope de la pila).

La ventaja de las máquinas de pila ("conjunto de

instrucciones de 0 operandos") sobre las máquinas de acumulador ("conjunto de

instrucciones de 1 operando") y las máquinas de registro ("conjunto de instrucciones de

2 operandos" o un "conjunto de instrucciones de 3 operandos") es que los programas

Page 28: Proyecto fernando compiladores 1

COMPILADORES

28

escritos para un conjunto de instrucciones de "0 operandos" generalmente tienen una

densidad de código más alta que los programas equivalentes escritos para otros

conjuntos de instrucciones.

10.1 Desempeño: Las máquinas de pila compiten contra las máquinas de registro

convencionales por la cuota de mercado. Ambas arquitecturas tienen fuerzas. La

discusión siguiente es para dar una idea de las ventajas relativas de las dos

arquitecturas.

Las referencias convencionales dicen8 que las máquinas de

pila son lentas porque las pilas están en memoria, y por lo tanto son más lentos de

acceder que los registros. Sin embargo, esto es algo compensado por el más pequeño

tamaño del código de una máquina de pila, que es más rápida al leer (fetch) y ejecutar.

Esto es confirmado por experimentos con optimización agresiva tanto de la arquitectura

de la máquina como la de los compiladores9 que demuestran que el código de la

máquina de registro tiene 47% menos instrucciones virtuales, y sin embargo, es 25%

más grande que el código de la máquina de pila. Cuando las pilas están en memoria,

una máquina de registro corre cerca de 26.5% más rápida que una máquina de pila, en

gran parte debido a la reutilización de las constantes en los registros.

Page 29: Proyecto fernando compiladores 1

COMPILADORES

29

El más pequeño tamaño del código de una máquina de pila

puede reducir el tamaño de la memoria y el costo de una computadora. Pocos accesos

de memoria pueden incrementar la velocidad de una máquina de registro, comparada a

una máquina de pila (que tenga las pilas en memoria). Reduciendo el tiempo de

guardado y restauración de registros, una máquina de pila puede tener menos

sobrecarga para responder a las interrupciones.

11. PRESENTACION Y DEFINICION DE IMÁGENES

11.1 Imagen 1: Muestra el proceso y el funcionamiento de las fases de un compilador

mostrando correctamente cada una de ellas según su orden.

Page 30: Proyecto fernando compiladores 1

COMPILADORES

30

11.2 Imagen 2: Esta imagen muestra que el autómata finito está definido sobre el

alfabeto Σ= {0,1}, posee dos estados s1 y s2, y sus transiciones son δ (s1, 0)=s2, δ (s1,

1)=s1, δ (s2, 0)=s1 y δ (s2, 1)=s2. Su estado inicial es s1, que es también su único

estado final.

11.3 Imagen 3: Esta imagen nos muestra la primera fases del autómata finito AFD que

reconoce el lenguaje regular conformado exclusivamente por las cadenas con un

número par de ceros y par de unos.

11.4 Imagen 4: Esta representa la segunda fase AFND con transiciones δ (q0, b)=q0

y δ (q0, b)=q1, que acepta el lenguaje regular sobre el alfabeto {a, b} conformado por

todas las palabras que terminan en b; es decir, que equivale a la expresión regular (a|

b)*b+. Es decir nos muestra el proceso de ejecución de esta autómata.

11.5 Imagen 5: Esta nos representa y muestra gráficamente el proceso del autómata

de pila y nos enseña que al igual que el autómata finito cuenta con un proceso de

entrada y un flujo de control y uno de estos estados se designa como el inicial y x lo

menos uno es de aceptación

Page 31: Proyecto fernando compiladores 1

COMPILADORES

31

12. CONCLUSION

Page 32: Proyecto fernando compiladores 1

COMPILADORES

32

Con la presentación de este proyecto se ha dejado en claro varias cosas de las cuales

nos dejan especificado cada uno de los componentes y fases de un compilador y

también ha permitido elevar la vista y mirar más allá de lo que se ve en el momento.

Podemos darnos cuenta que es posible desarrollar un compilador de un lenguaje de

programación totalmente adaptado a nuestras necesidades basándonos en la teoría de

compiladores.

13. BIBLIOGRAFIA

Page 33: Proyecto fernando compiladores 1

COMPILADORES

33

WIKIPEDIA. (25 de ABRIL de 2014). WIKIPEDIA. Obtenido de WIKIPEDIA:

https://www.wikipedia.org/

Compiladores, Principios, técnicas y herramientas, Alfred V. Aho, Ravi Sethi,

Jeffrey

Compiladores: Conceptos Fundamentales. B. Teufel, S. Schmidt, T. Teufel. Addison

Wesley Iberoamericana