lunes, 16 de febrero de 2015

1.7 Fases de un compilador

Fases de un 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.
• 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.

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

• Analizador 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 ingles).

• 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.

• 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.

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.

• 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.

• 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.

• 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.

• Tabla de Símbolos: es una estructura tipo diccionario con operaciones de inserción, borrado y búsqueda, que almacena información sobre los símbolos que van apareciendo a lo largo del programa como son: – los identificadores (variables y funciones) – Etiquetas – tipos definidos por el usuario (arreglos, registros, etc.)

  Además almacena el tipo de dato, método de paso de parámetros, tipo de retorno y de argumentos de una función, el ámbito de referencia de identificadores y la dirección de memoria. Interacciona tanto con el analizador léxico, sintáctico y semántico que introducen información conforme se procesa la entrada. La fase de generación de código y optimización también la usan.

• Gestor de errores: detecta e informa de errores que se produzcan durante la fase de análisis. Debe generar mensajes significativos y reanudar la traducción.

Encuentra errores: – En tiempo de compilación: errores léxicos (ortográficos), sintácticos (construcciones incorrectas) y semánticos (p.ej. errores de tipo) – En tiempo de ejecución: direccionamiento de vectores fuera de rango, divisiones por cero, etc. – De especificación/diseño: compilan correctamente pero no realizan lo que el programador desea.
 Se trataran sólo errores estáticos (en tiempo de compilación). Respecto a los errores en tiempo de ejecución, es necesario que el traductor genere código para la comprobación de errores específicos, su adecuado tratamiento y los mecanismos de tratamiento de excepciones para que el programa se continúe ejecutando.

La mayoría de los compiladores son dirigidos por la sintaxis, es decir, el proceso de traducción es dirigido por el analizador sintáctico. El análisis sintáctico genera la estructura del programa fuente a través de tokens. El análisis semántico proporciona el significado del programa basándose de la estructura del árbol de análisis sintáctico.

• Las fases de análisis léxico y análisis sintáctico se pueden automatizar de manera relativamente fácil, las verdaderas dificultades en la construcción de compiladores son el análisis semántico, la generación y la optimización de código.

 • El número de pasadas, es decir, el número de veces que hay que analizar el código fuente, está en función del grado de optimización. Típicamente se realiza una pasada para realizar el análisis léxico y sintáctico, otra pasada para el análisis semántico y optimización del lenguaje intermedio y una tercera pasada para generación de código y optimizaciones dependientes de la máquina. Estructuras de datos Empla.

Bibliografia:
Billhardt, H. (2015). Teoria de automatas y lenguajes formales .
Mata, S. G. (s.f.). Compiladores.
Serna, E. (s.f.). Fases de un compilador. Obtenido de http://www.paginasprodigy.com/edserna/cursos/compilador/notas/Notas1.pdf


Para mas informacion:
_________________________________________________________________________________
Equipo: Anahi Jaramillo Hernandez, Erick Rios Garcia. Luis Antonio Martinez Sanchez.Alejandro Gomez Perez.

1.6 Estructura de un traductor

Un traductor es un programa que tiene como entrada un texto escrito en un lenguaje (lenguaje fuente) y como salida produce un texto escrito en un lenguaje (lenguaje objeto) que preserva el significado de origen. Ejemplos de traductores son los ensambladores y los compiladores.


En el proceso de traducción se identifican dos fases principales:





  • Fase de análisis

  • Fase de Síntesis

_________________________________________________________________________________

Equipo: Anahi Jaramillo Hernandez, Erick Rios Garcia. Luis Antonio Martinez Sanchez.Alejandro Gomez Perez.

1.5 Herramientas computacionales ligadas con lenguajes

¿Qué es un compilador cruzado?
Un compilador cruzado es un compilador capaz de crear código ejecutable para otra plataforma, distinta a aquélla en el que el compilador se ejecuta.

¿Qué es un analizador léxico?
Un analizador léxico: es la primera fase de un compilador consistente en un programa que recibe como entrada el código fuente de otro programa y produce una salida compuesta de tokens (componentes léxicos) o símbolos.

Función de analizador léxico:
La principal función consiste en leer la secuencia de caracteres del programa fuente, carácter a carácter y elaborar como salida la secuencia de componentes léxicos.

Los componentes léxicos representan:
- Palabras reservadas: IF, WHILE
-Identificadores: VARIABLES, FUNCIONES
- Símbolos especiales: ;, (), {}
- Operadores: =, >,<, +
- Constantes numéricas: ENTEROS, FLOTANTES
- Constantes de carácter

_________________________________________________________________________________
Equipo: Anahi Jaramillo Hernandez, Erick Rios Garcia. Luis Antonio Martinez Sanchez.Alejandro Gomez Perez.

1.4 Tipos de lenguajes

Tipos de Lenguajes
Podemos encontrar varios tipos de Lenguajes:

  • Lenguaje Declarativos.- Son los más parecidos al castellano o ingles en su potencia expresiva y funcionalidad y están ene le nivel más alto respecto a los otros. Son fundamentalmente lenguaje de órdenes, denominados por sentencias que expresan “Lo que hay que hacer” en vez de “Como hacerlo”
  • Lenguaje de Alto Nivel.- Son los mas utilizados como lenguaje de programación, Aunque no son fundamentalmente declarativos, estos lenguajes permiten que los algoritmos se expresen en un nivel y estilo de escritura fácilmente legible y comprensible por otros programadores. Además, los lenguajes de alto nivel suelen tener la característica de “Transportabilidad”.
  • Lenguajes Ensamblador. Y Lenguaje Maquina.- Cada tipo de maquina tiene su propio lenguajes de maquina distinto y su lenguaje ensamblador asociado. El lenguaje ensamblador es simplemente una representación simbólica del lenguaje maquina asociado, lo cual permite una programación menos tediosa que con el anterior.


Tipos de lenguajes.
Lenguaje natural (castellano)
Nosotros estamos relacionados con el concepto tradicional de gramática que, de esta forma intuitiva, podemos considerar un conjunto de reglas el cual nos indican que es correcto y que no lo es del, lenguaje natural. Con este fin podemos acércanos a la definición mas clara y formal de la lengua castellana.
Lenguaje artificial.
En este lenguaje aplicamos el mismo método en el  cual definimos un fragmento del lenguaje de programación. Donde pretendemos describir las instrucciones el cual nos permite asignar un valor a una expresión ó a una variable en un lenguaje C.
Lenguaje regular.
Llamamos así  a los lenguajes porque sus palabras contienen "regularidades" o repeticiones de los mismos componentes, por ejemplo en este lenguaje L1 = { ab, abab, ababab, abababab,...} Este ejemplo podemos apreciar las palabras de L1 son solo repeticiones de "ab" donde se repiten varias veces. Su regularidad consiste en las palabras que contienen "ab" varias veces.
_________________________________________________________________________________
Equipo: Anahi Jaramillo Hernandez, Erick Rios Garcia. Luis Antonio Martinez Sanchez.Alejandro Gomez Perez.

1.3 Lenguajes

1.3 Lenguajes
Un lenguaje sobre el alfabeto A es un subconjunto del conjunto de las cadenas sobre A: L ⊆ A ∗ . Los lenguajes los notaremos con las letras intermedias del alfabeto latino en mayúsculas.

Ejemplo:  Los siguientes son lenguajes sobre un alfabeto A, cuyo contenido asumimos conocer claramente: L1 = {a,b, ε}, símbolos a, b y la cadena vacía L2 = {a ib i | i = 0,1,2,...}, palabras formadas de una sucesión de símbolos a, seguida de la misma cantidad de símbolos b.
L3 = {uu−1 | u ∈ A ∗}, palabras formadas con símbolos del alfabeto A y que consisten de una palabra, seguida de la misma palabra escrita en orden inverso.

L4 = {a n 2 | n = 1,2,3,...}, palabras que tienen un número de símbolos a que sea cuadrado perfecto, pero nunca nulo. Aparte de las operaciones de unión e intersección de lenguajes, dada su condición de conjuntos existe la operación de concatenación.

If L1,L2 son dos lenguajes sobre el alfabeto A, la concatenación de estos dos lenguajes es el que se obtiene de acuerdo con la siguiente expresión, L1L2 = {u1u2 | u1 ∈ L1,u2 ∈ L2}

Propiedades: L0/ = 0/L = 0/ (0/ es el Lenguaje que contiene 0 palabras) Elemento Neutro.- {ε}L = L{ε} = L Asociativa.- L1(L2L3) = (L1L2)L3 La iteración de lenguajes se define como en las palabras, de forma recursiva: Definición 10 Si L es un lenguaje sobre el alfabeto A, entonces la iteración de este lenguaje se define de acuerdo con las siguientes expresiones recursivas, L 0 = {ε} L i+1 = L iL Definición 11 Si L es un lenguaje sobre el alfabeto A, la clausura de Kleene de L es el lenguaje obtenido de acuerdo con la siguiente expresión: L ∗ = [ i≥0 L i Definición 12 Si L es un lenguaje sobre el alfabeto A, entoces L + es el lenguaje dado por: L + = [ i≥1 L i Propiedades: L + = L ∗ si ε ∈ L.
_________________________________________________________________________________
Equipo: Anahi Jaramillo Hernandez, Erick Rios Garcia. Luis Antonio Martinez Sanchez.Alejandro Gomez Perez.

1.2 Cadenas

Cadenas.
Una cadena o palabra sobre un alfabeto Σ. admitimos la existencia de una única cadena que no tiene símbolos, la cual se denomina cadena vacía y se denota con λ. la cadena vacía desempeña, en la teoría de lenguajes formales, un papel similar al que desempeña el conjunto vacío Ø en la teoría de conjuntos.

Longitud de cadena.
La longitud de cadena es el numero de símbolos que contiene. La notación empleada es la que es la que se indica en el ejemplo:

Utilizamos las cadenas de los ejemplos:

I abcb I = 4,

I a + 2*b I = 5

I 000111 I = 6

I if a > b then a = b; I = 9

Cadena Vacía.

Una cadena vacía es la única cadena de caracteres de tamaño cero. Y la podemos denotar usualmente con letras λ o Є (Griegas).

Concatenación de cadenas.

La concatenación de dos cadenas u y v, escrita uv, es "pegar" las dos cadenas para formar una nueva.

Ejemplo:

Sea u = ab

v = ca

w = bb.

Entonces

uv = abca

uw = cabb

(uv) w = abcabb

u(vw) = abcabb



El resultado de la concatenación de u, v y w es independiente del orden en que las operaciones son ejecutadas. Matemáticamente esta propiedad es conocida como asociatividad.

Universo del discurso.

Es un conjunto de todas las cadenas donde podemos formar con símbolos del alfabeto V le denominamos universo del discurso de V y la representamos de la siguiente manera W (V). Es evidente que W(V) es un conjunto infinito y que la cadena vacía pertenece a W(V).

Ejemplo:


Un afabeto con una sola letra V = { a }, podemos decir que el universo del discurso es: W(V) = { λ, a, aa, aaa, aaaa,....} y asi contiene una cadenas infinitas.
_________________________________________________________________________________

Equipo: Anahi Jaramillo Hernandez, Erick Rios Garcia. Luis Antonio Martinez Sanchez.Alejandro Gomez Perez.

1.1 Alfabeto

Definición (Alfabeto):

Conjunto finito, no vacío, de elementos.
Generalmente usaremos Σ para especificar alfabetos y los elementos los denominaremos “letras” o “símbolos”.

Ejemplos:

los alfabetos español, inglés, o alemán

Σ1={0,...,9}, 0∈Σ1

Σ2={x | x es un símbolo del código ASCII}

Σ3={(, )}

Σ4={1, A, 2, B}

Σ5={a, b, c, d}

Σ6={}

Σ7=ℵ

Definición (Palabra):

Sea un alfabeto Σ. Una palabra sobre Σ es una secuencia finita de las letras de ese alfabeto.
La secuencia vacía representa la palabra vacía y la anotamos con λ.

Ejemplos: sobre Σ5 ={a,b,c,d}: λ, a, b, c, d, abc, aab, dcba, ... sobre Σ1 ={0,...,9}: λ, 0, 0000, 010, 9980, ... sobre Σ3 ={(,)} λ, (, ), (), (()()), )())), ...

Definición (Longitud de una palabra):

Se llama longitud de una palabra x, y se representa por |x|, al número de símbolos que la componen.

Ejemplos: sobre Σ5 ={a,b,c,d}: |λ|=0, |a|=1, |abc|=3

Definición (Concatenación):

Sean dos palabras x e y definidas sobre el alfabeto Σ. La concatenación de x e y, denominada “xy”, es una palabra que contiene todos los símbolos (de derecha a izquierda) de x seguidos de los símbolos de y (de derecha a izquierda).
Sean x=A1A2...An e y=B1B2...Bm con Ai, Bi ∈ Σ: ⇒ xy= A1A2...AnB1B2...Bm

Ejemplos: x =abc, y =da, definidos sobre Σ={a,b,c,d} xy=abcda ; |xy|=|x|+|y|=5

Definición (Potencia):

Sea i un número natural, y x una palabra. La potencia i-ésima de x, denominada xi, es la operación que consiste en concatenarla consigo misma i veces.

Ejemplos: x =abc ⇒ x1=abc x2=abcabc x3=abcabcabc

Definición (Palabra inversa):

Sea x=A1A2...An con Ai∈Σ una palabra sobre el alfabeto Σ. Se llama palabra refleja o inversa de x, y se representa por x-1, a la palabra AnAn-1...A1. Si x=λ entonces x-1=λ.

Ejemplos: x =abc ⇒ x-1=cba

Definición (Lenguaje universal):
Sea Σ un alfabeto. El lenguaje universal de Σ es el conjunto formado por todas las palabras que se pueden formar con las letras de Σ. Representamos dicho lenguaje con W(Σ).
Ejemplos: 
Σ1 ={a} ⇒ W(Σ1)={λ, a, aa, aaa, ...}

Definición (Lenguaje):
Sea un alfabeto Σ. Un lenguaje L sobre Σ es cualquier subconjunto del lenguaje universal W(Σ).
Ejemplos: Σ1 ={a} ⇒ W(Σ1)={λ, a, aa, aaa, ...} L1 ={a} ⊆ W(Σ1) L2 ={} ⊆ W(Σ1) (L2 = ∅) L3 =Σ1 ⊆ W(Σ1) L4 =W(Σ1) ⊆ W(Σ1) L5 ={λ} ⊆ W(Σ1) (Nota: L5≠L2) L6 ={λ, a, aaa, aaaaa} ⊆ W(Σ1) L7 ={λ, a, aaa, aaaaa, ...} ⊆ W(Σ1)
Hay lenguajes finitos, infinitos y vacíos.
_________________________________________________________________________________
Equipo: Anahi Jaramillo Hernandez, Erick Rios Garcia. Luis Antonio Martinez Sanchez.Alejandro Gomez Perez.