proyecto fernando compiladores 1
TRANSCRIPT
COMPILADORES
1
COMPILADORES Y ANALIZADOR LEXICOS
FERNANDO JACOME MONTES
CORPORACION UNIVERSITARIA REMINGTON
FACULTAD DE INGENIERIA DE SISTEMAS
SEMESTRE VI
2014
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
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
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.
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.
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.
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.
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.
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
COMPILADORES
10
Imagen 1 Faces Del Compilador
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.
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.
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.
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.
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.
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).
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.
COMPILADORES
18
Imagen 2 Autómata Finito
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.
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.
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.
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
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
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.
COMPILADORES
25
Imagen 5 Representación De Autómata De Pila
9. DIAGRAMA DE ESTADO
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
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
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.
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.
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
COMPILADORES
31
12. CONCLUSION
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
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