2. COMPILADORES
1
TABLA DE CONTENIDO
INTRODUCCION…………………………………………………………………….1
JUSTIFICACION……………………………………………………………………..4
OBJETIVO GENERAL……………………………………………………………….5
OBJETIVO ESPECIFICO……………………………………………………………6
CONCLUSION………………………………………………………………………...7
BIBLIOGRAFIA………………………………………………………………………..8
VOCABULARIO……………………………………………………………………….9
COMPILADOR Y SUS FASES………………………………………………………11
FASES DE UN COMPILADOR………………………………………………………16
MANEJO DE ERRORES SINTATICOS…………………………………………….17
ANALIZADOR LEXICO……………………………………………………………….19
FUNCION DEL ANALIZADOR LEXICO…………………………………………….20
AUTOMATA FINITO……………………………………………………………………21
AUTOMATA DE PILA………………………………………………………………….23
3. COMPILADORES
2
INTRODUCCION
"¿Cómo funciona un compilador? ", es la pregunta de todo aquel que se hace llamar
programador, a grandes rasgos un compilador toma un programa escrito en un
lenguaje de programación con una gramática, sintaxis y semántica definida, revisa que
este dentro de las pautas de definición del lenguaje, y lo traduce en programa de salida
escrito en lenguaje binario, el cual es entendido por el ordenador y por lo tanto puede
ser ejecutado por el mismo (recordar que un intérprete a diferencia de un compilador no
traduce todo el programa sino que va realizando la traducción e interpretación de la
misma paso a paso, sin crear ningún programa de salida ejecutable). Las partes del
proceso de compilación se dividen en dos: una llamada fase de Análisis y otra llamada
fase de Sintaxis, las cuales interactúan entre sí para la creación de la tabla de símbolos
y el control del manejador de errores, dentro del análisis hay tres etapas llamadas
análisis léxico, análisis sintáctico, análisis semántico. Dentro de la fase de Síntesis
existen las etapas de generación de código intermedio, optimización de código
intermedio, y generación de código.
Al tener que describir cómo funciona un compilador tenemos
que tener en claro en no confundir los términos compilador y compilación, se debe
entender que al decir compilador nos referimos al programa, y al decir compilación al
proceso en sí. En esencia ambos términos cumplen con la definición más simple de un
compilador, es decir, sea el programa compilador o el proceso de compilación, ambos
ES AQUEL QUE SE ENCARGA DE HACER EJECUTABLE NUESTRO PROGRAMA.
5. COMPILADORES
4
JUSTIFICASION
La teoría de Compiladores es un área de conocimientos fundamental para la formación
del estudiante de Ciencias de la Computación.
Posee una relevancia práctica y teórica en la formación del futuro profesional tanto en
el aspecto de la programación de computadoras
Como en la construcción de la base teórica de conocimientos del mismo.
. Es importante que un profesional de la informática tenga
una sólida formación en este tema, ya que aunque durante su vida profesional no se
dedique al diseño de compiladores, sus aplicaciones podrán ser mucho más eficientes
si aplica los conocimientos adquiridos.
6. COMPILADORES
5
OBJETIVO GENERAL
Comprender el problema al que se enfrenta un compilador. Comprender los
Algoritmos que se utilizan para resolver cada una de las fases del compilador.
Dominar completamente el proceso para convertir un lenguaje de alto nivel a un
Lenguaje de bajo nivel.
7. COMPILADORES
6
OBJETIVO ESPECIFICO
1.1 Aplicar el concepto de compiladores como alternativa de solución de problemas.
1.2 Que nosotros los estudiantes realicemos una aplicación interactiva que trabaje
conjuntamente con el analizador.
1.3Que el estudiante sea capaz de crear gramáticas y de recuperarse de errores
léxicos, sintácticos.
1.4Iniciar el proceso de aprendizaje de herramientas generadoras de Analizadores
Léxicos y Sintácticos.
8. COMPILADORES
7
CONCLUSION
Comprendí que un compilador, requiere de una sintaxis y lenguajes específicos, ya
que, al igual que el lenguaje humano, si no lo escribimos correctamente el compilador
no hará lo que deseamos. Y que en la compilación hay dos partes: Análisis y Síntesis.
La parte del análisis divide al programa fuente en sus elementos componentes y crea
una representación intermedia.
Aprendí que las herramientas que muestran tipos de análisis
de programas fuente, son muy útiles al momento de crear un programa al codificar un
algoritmo, ya que estas herramientas nos ayudan formateando el texto, corrigiendo
errores, dando tips; para que nosotros como programadores seamos más eficientes al
momento de crear alguna aplicación.
10. COMPILADORES
9
VOCABULARIO
1. bytecode: Es un código intermedio más abstracto que el código máquina.
2. lexicográfico: persona que recopila o selecciona los vocablos que han entrar en un
léxico.
3. tokens: un token o también llamado componente léxico es una cadena de caracteres
que tiene un significado coherente en cierto lenguaje de programación.
4. while: El bucle while o bucle mientras es una estructura de la mayoría de los
lenguajes de programación estructurados cuyo propósito es repetir un bloque de
código mientras una condición se mantenga verdadera.
5. subrutina: E n computación una subrutina o subprograma (también llamado
procedimientos, función o rutina), como idea general se presenta como un su algoritmo
que forma parte del algoritmo principal.
6. corrutina: Una corrutina es un componente que poseen los programas que son
capaces de crear subrutinas.
12. COMPILADORES
11
UN COMPILADOR Y SUS FASES
Compilador
Es un programa que permite traducir el código fuente de un programa en lenguaje de
alto nivel, a otro lenguaje de nivel inferior (típicamente lenguaje de máquina).
De esta manera un programador puede diseñar un programa
en un lenguaje mucho más cercano a cómo piensa un ser humano, para luego
compilarlo a un programa más manejable por un computador.
Imagen1.esta imagen nos muestra como traduce los textos del compilador.
Un compilador es un programa informático que traduce un
programa escrito en un lenguaje de programación a otro lenguaje de programación,
generando un programa equivalente que la máquina será capaz de interpretar.
Usualmente el segundo lenguaje es lenguaje de máquina, pero también puede ser un
código intermedio (bytecode), o simplemente texto. Este proceso de traducción se
conoce como compilación.
13. COMPILADORES
12
El compilador es el que permite traducir el código fuente de
un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (típicamente
lenguaje de máquina). De esta manera un programador puede diseñar un programa en
un lenguaje mucho más cercano a cómo piensa un ser humano, para luego compilarlo
a un programa más manejable por una computadora.
Imagen2. Diagrama a bloques de la operación de un buen compilador.
14. COMPILADORES
13
Básicamente, El programa compilador traduce las
instrucciones en un lenguaje de alto nivel a instrucciones que la computadora puede
interpretar y ejecutar. Para cada lenguaje de programación se requiere un compilador
separado dos grandes formas de ejecutar programas: programas compilados
(previamente pasados por un compilador) y programas interpretados (necesitan pasar
por un intérprete para ejecutarse en tiempo real).
Un compilador es un programa informático, que se encarga
de traducir el código fuente de una aplicación que este en desarrollo, es decir convierte
un programa hecho en lenguaje de programación de alto nivel a un lenguaje de
máquina, el cual es conocido como de bajo nivel, de tal forma que sea más entendible
y mucho más fácil de procesar en el equipo en el que se está ejecutando.
15. COMPILADORES
14
Imagen3. Estructura de proceso de compilación.
De igual manera un traductor es el que toma como entrada
un texto escrito y da como salida otro texto en un lenguaje llamado objeto.
Un compilador es un programa que crea una lista de
instrucciones de código máquina basándose en un código fuente resultando en un
programa listo y rápido para usarse. Por otro lado el intérprete es más lento puesto
que, no produce ningún código sino que lo reconoce. Ambos son lenguajes de
programación.
Conceptualmente un compilador opera en fases. Cada una
de las cuales transforma el programa fuente de una representación en otra. En la
imagen 4 se muestra una descomposición típica de un compilador. En la práctica se
pueden agrupar fases y las representaciones intermedias entres las fases agrupadas
no necesitan ser construidas explícitamente.
Programa fuente.
16. COMPILADORES
15
Imagen4. Nos muestra una descomposición típica de un compilador.
El programa compilador traduce las instrucciones en un
lenguaje de alto nivel a instrucciones que la computadora puede interpretar y ejecutar.
17. COMPILADORES
16
Fases De Un Compilador
1. El análisis es la fase en la cual se trata de la escritura correcta del código fuente.
Esta a su vez comprende varias fases:
Análisis léxico: esta fase es la encargada de leer el código
fuente y separarlo en lotes para poder ser leído por el análisis sintáctico. Esta fase se
encarga de verificar si todas las cadenas pertenecen o no al lenguaje. Es decir realiza
un análisis símbolo por símbolo indicando el toquen por cada uno de los elementos
reconocidos o el error en caso de no reconocer.
Este análisis no logra detectar muchos errores por su
característica.
1.1 Análisis sintáctico: esta fase evalúa los lotes de código con el fin de que este
cumpla con los requerimientos definidos por el compilador. En esta fase se analiza la
estructura de las expresiones en base a gramáticas. Aquí ya se puede determinar si
una estructura por ejemplo una expresión matemática mal formada. El análisis que se
realiza es jerárquico es decir en base a árboles de derivación que se obtienen de las
mismas gramáticas.
En teoría, se supone que la salida del analizador sintáctico
es alguna representación del árbol sintáctico que reconoce la secuencia de tokens
suministrada por el analizador léxico.
18. COMPILADORES
17
Manejo De Errores Sintácticos
Si un compilador tuviera que procesar sólo programas correctos, su diseño e
implantación se simplificarían mucho. Pero los programadores a menudo escriben
programa incorrectos, y un buen compilador debería ayudar al programador a
identificar y localizar errores. Es más, considerar desde el principio el manejo de
errores puede simplificar la estructura de un compilador y mejorar su respuesta a los
errores.
Los errores en la programación pueden ser de los siguientes
tipos:
• Léxicos, producidos al escribir mal un identificador, una palabra clave o un operador.
• Sintácticos, por una expresión aritmética o paréntesis no equilibrados.
• Semánticos, como un operador aplicado a un operando incompatible.
• Lógicos, puede ser una llamada infinitamente recursiva.
El manejo de errores de sintaxis es el más complicado desde
el punto de vista de la Creación de compiladores. Nos interesa que cuando el
compilador encuentre un error, se recupere y siga buscando errores.
1.2 Análisis semántico: en esta fase se busca establecer que el código fuente cumpla
con la semántica solicitada por el compilador, es decir que el código este
correctamente escrito para poder ser interpretado. Este análisis es más difícil de
19. COMPILADORES
18
formalizar, determina el tipo de los resultados intermedios, comprobar que los
argumentos que tienen un operador pertenecen al conjunto de operadores posible, y si
son compatibles entre sí.
Ejemplo: Suponiendo que tenemos esta línea de código en
C: res=valor1+valor2; El análisis semántico se va a encargar que tanto el valor1 como
el valor2 tengan datos que son compatibles en común y que además se les pueda
aplicar dicho operador. En C el símbolo (+) implica una suma de valores o una unión de
las cadenas.
El análisis semántico utiliza como entrada el árbol sintáctico detectado por el análisis
sintáctico para comprobar restricciones de tipo y otras limitaciones semánticas y
preparar la generación de código.
En compiladores de un solo paso, las llamadas a las rutinas semánticas se realizan
directamente desde el analizador sintáctico y son dichas rutinas las que llaman al
generador de código. El instrumento más utilizado para conseguirlo es la gramática de
atributos.
En compiladores de dos o más pasos, el análisis semántico se realiza
independientemente de la generación de código, pasándose información a través de un
archivo intermedio, que normalmente contiene información sobre el árbol sintáctico en
forma lineal izada (para facilitar su manejo y hacer posible su almacenamiento en
memoria auxiliar).
20. COMPILADORES
19
ANALIZADOR LEXICO
El analizador léxico, también conocido como scanner, lee los caracteres uno a uno
desde la entrada y va formando grupos de caracteres con alguna relación entre sí
(tokens), que constituirán la entrada para la siguiente etapa del compilador. Cada
tokens representa una secuencia de caracteres que son tratados como una única
entidad. Por ejemplo, en Pascal un tokens es la palabra reservada BEGIN, en C:
WHILE, etc. Las tiras específicas sólo tienen tipo (lo que representan), mientras que las
tiras no específicas tienen tipo y valor. Por ejemplo, si “Contador” es un identificador, el
tipo de tokens será identificador y su valor será la cadena “Contador”. El Analizador
Léxico es la etapa del compilador que va a permitir saber si es un lenguaje de formato
libre o no. Frecuentemente va unido al analizador sintáctico en la misma pasada,
funcionando entonces como una subrutina de este último. Ya que es el que va leyendo
los caracteres del programa, ignorará aquellos elementos innecesarios para la
siguiente fase, como los tabuladores, comentarios, espacios en blanco, etc.
Se encarga de buscar los componentes léxicos (tokens En inglés) o palabras que
componen el programa fuente, según unas reglas o patrones. La entrada del analizador
léxico podemos definirla como una secuencia de caracteres.
21. COMPILADORES
20
Imagen5.analizador léxico.
El analizador léxico tiene que dividir la secuencia de
caracteres en palabras con significado propio y después convertirlo a una secuencia de
terminales desde el punto de vista del analizador sintáctico, que es la entrada del
analizador sintáctico.
El analizador léxico reconoce las palabras en función de una gramática regular de
manera que sus NO TERMINALES se convierten en los elementos de entrada de fases
posteriores. En LEX, por ejemplo, esta gramática se expresa mediante expresiones
regulares.
Función Del Analizador Léxico.
El analizador léxico es la primera fase de un compilador. Su principal función consiste
en leer los caracteres de entrada y elaborar como salida una secuencia de
componentes léxicos que utiliza el analizador sintáctico para hacer el análisis. Esta
interacción, suele aplicarse convirtiendo al analizador léxico en una subrutina o
corrutina del analizador sintáctico.
Imagen6.interaccion de un analizador léxico con el analizador sintáctico.
22. COMPILADORES
21
AUTOMATA FINITO
Un autómata finito es un modelo matemático de una
máquina que acepta cadenas de un lenguaje definido sobre un alfabeto A. Consiste en
un conjunto finito de estados y un conjunto de transiciones entre esos estados, que
dependen de los símbolos de la cadena de entrada. El autómata finito acepta una
cadena x si la secuencia de transiciones correspondientes a los símbolos de x conduce
desde el estado inicial a un estado final.
Si para todo estado del autómata existe como máximo una
transición definida para cada símbolo del alfabeto, se dice que el autómata es
determinístico (AFD). Si a partir de algún estado y para el mismo símbolo de entrada,
se definen dos o más transiciones se dice que el autómata es no determinístico
(AFND).
Formalmente un autómata finito se define como una 5-upla M =
<E, A, δ, e0, F> donde E: conjunto finito de estados A: alfabeto o conjunto finito de
símbolos de entrada δ: función de transición de estados, que se define como - δ: E x A
→ E si el autómata es determinístico - δ: E x A → P(E) si el autómata es no
determinístico (P(E) es el conjunto potencia de E, es decir el conjunto de todos los
subconjuntos de E) e0: estado inicial; e0 ∈ E F: conjunto de estados finales o estados
de aceptación; F ⊆ E.
Generalmente se asocia con cada autómata un grafo dirigido, llamado diagrama de
transición de estados. Cada nodo del grafo corresponde a un estado. El estado inicial
23. COMPILADORES
22
se indica mediante una flecha que no tiene nodo origen. Los estados finales se
representan con un círculo doble.
Imagen7.automata y lenguajes formales.
Un autómata finito 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.
24. COMPILADORES
23
AUTOMATA DE PILA
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 lats-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.