Anda di halaman 1dari 14

COMPILADORES

Se denomina programa fuente, al cdigo simblico escrito por el programador, cuyas sentencias
responden o respetan las reglas gramaticales de un determinado lenguaje. Cada lenguaje define
su alfabeto y la estructura de sus frases o sentencias.
Sin embargo, estos lenguajes son facilidades creadas para el programador. Las computadoras
no los pueden ejecutar directamente. Para ello, se disearon programas especficos que leen
dichos programas, determinan si cada una de sus sentencias responde a las reglas del lenguaje
que representan y las traducen.
Se llama programa objeto, al resultado de dicha traduccin y que podr ser ejecutado en una
computadora.

Un programa que cumpla las funciones antes mencionadas se denomina compilador.

Bsicamente, existen dos grandes formas de traducir programas fuentes para su posterior
ejecucin: programas compilados (previamente pasados por un compilador) y programas
interpretados no necesitan pasar por un compilador para ejecutarse. Su ejecucin se implementa
mediante la intervencin de un intrprete.
Se trata de traductores-ejecutores ya que con cada instruccin realizan un proceso triple de
lectura-traduccin-ejecucin.
Comparando su actuacin con la de un ser humano, un compilador equivale a un traductor
profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua,
mientras que un intrprete corresponde al intrprete humano, que traduce de viva voz las
palabras que oye, sin dejar constancia por escrito.

Perspectiva histrica:
En los 50 los compiladores eran considerados programas muy difciles de construir
Ejemplo: Fortran evolucion durante 18 aos de trabajo en grupo.
Hoy en da se han desarrollado tcnicas sistemticas, entornos de programacin y
herramientas de software que facilitan la tarea de desarrollo de compiladores,
intrpretes y traductores.

Caractersticas de un compilador

Desde el punto de vista de la plataforma donde actuar, un compilador se divide en dos partes:

* Front End: analiza el cdigo fuente, comprueba su validez, genera el rbol de derivacin y
rellena los valores de la tabla de smbolos. Parte que suele ser independiente de la plataforma o
sistema operativo para el que funcionar.

* Back End: parte en donde se genera el cdigo mquina exclusivo para una plataforma a partir
de lo analizado en el front end.

Por lo general el resultado del back end no puede ser ejecutado directamente, se necesita pasar
por un proceso de enlazado (linker).

Intrpretes versus compiladores

Cualquier lenguaje puede ser ejecutado tanto va intrprete o va compilador, pero algunos
lenguajes suelen asociarse ms a una va que a la otra, y por esto son llamados "lenguajes
interpretados" o "lenguajes compilados" respectivamente.

Cuando el intrprete ejecuta un programa, se nutre de la versin fuente, previa carga en


memoria.
Toma cada instruccin, la convierte a su equivalente en cdigo fuente den tiempo real y recin
la ejecuta.
Por lo tanto, sigue la tcnica de paso por paso. Tambin el acceso a variables es ms lento en un
intrprete, porque debe mapear los identificadores para almacenar las localizaciones en tiempo
real tantas veces como aparezca la misma variable en el programa.

La principal ventaja del proceso de compilacin frente al de interpretacin es que los programas
se ejecutan mucho ms rpidamente una vez compilados; por el contrario, es ms cmodo
desarrollar un programa mediante un intrprete que mediante un compilador puesto que en el
intrprete las fases de edicin y ejecucin estn ms integradas. La depuracin de los
programas suele ser ms fcil en los intrpretes que en los compiladores puesto que el cdigo
fuente est presente durante la ejecucin. Estas ventajas pueden incorporarse al compilador
mediante la utilizacin de entornos de desarrollo y depuradores simblicos en tiempo de
ejecucin.

Reemplazar nombres de archivos y variables


Rendimiento de entrada/salida
Localiza archivos ejecutables e inicia el programa.
Utiliza cdigo fuente.
Convierte a instrucciones de sistema operativo.
No producen cdigo objeto.
Paran cuando hay un error.
Ejecuta programas sin una traduccin explcita
No hay una frase de traduccin y otra de ejecucin.
No se genera cdigo mquina.

Comparando su actuacin con la de un ser humano, un compilador equivale a un traductor


profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua,
mientras que un intrprete corresponde al intrprete humano, que traduce de viva voz las
palabras que oye y a medida que las escucha, sin dejar constancia por escrito

Compilador Interprete
Detalle errores Mayor Menor
Tiempos de ejecucin para Menor Mayor
el mismo fuente
Compilacin/Traduccin Una traduccin Una traduccin
Muchas ejecuciones Una ejecucin
Construccin Generalmente son de
construccin mas facil
Memoria Necesitan menos memoria Necesitan mas memoria.
Debe ejecutarse y al mismo
tiempo interpretar

Definicin de Decompilador
Programa que intenta recrear el cdigo fuente en un lenguaje de alto nivel, a partir de un
programa ya compilado. Es un mtodo empleado en la ingeniera inversa de software.
Tipos de compiladores
Esta taxonoma de los tipos de compiladores no es excluyente, por lo que puede haber
compiladores que se adscriban a varias categoras:
Compiladores cruzados: generan cdigo para un sistema distinto del que estn funcionando.
Compiladores optimizadores: realizan cambios en el cdigo para mejorar su eficiencia, pero
manteniendo la funcionalidad del programa original.
Compiladores de una sola pasada: generan el cdigo mquina a partir de una nica lectura del
cdigo fuente.
Compiladores de varias pasadas: necesitan leer el cdigo fuente varias veces antes de poder
producir el cdigo mquina.

Un Ensamblador es un tipo de traductor que convierte programas escritos en lenguaje


ensamblador a programas escritos en cdigo mquina.
Particularmente un macroensamblador es un ensamblador parametrizable de a tramos.
Al pasarle determinados parmetros, parte de su cdigo se expande en funcin a ellos.

FASES
Analizador Lxico (scanner)
Realiza un anlisis lineal del archivo. La cadena de entrada se lee de izquierda a derecha y se va
agrupando en componentes lxicos (TOKENS), que son secuencias de caracteres con un significado
colectivo. Son las unidades bsicas del compilador
Por ejemplo: nmeros, identificadores (variables, constantes, tipos, nombres de funciones...), palabras
reservadas, signos de final de instruccin. Cada componente es asociada a la categora que pertenece.
Desecha comentarios /*

Scanner Detecta Palabras Reservadas, separadores, Operadores,


etiquetas, constantes, Identificadores
Ej: E_IRONMENT DIVISION

Anlisis Detectan errores en tiras de token = fuera de orden


Sintctico Genera un rbol sintctico. Comprueba que sea vlido y genera
Parser un rbol sintctico
Prelacin de operadores
Formato de instrucciones
Doble definicin de identificadores}
Tira warnings y sigue
Verifica que A:= 32 y no A=: 32

Anlisis Verifica que el rbol sintctico sea correcto


Semntico Correspondencia entre tipos de resultados intermedios con tipos
de operandos, rene informacin sobre los tipos; identifica operadores y
operandos en base al rbol sintctico producido en el anlisis anterior.
Ejemplos de error: operacin entre tipos de datos incompatibles, rangos
permitidos, existencia de variables. En cualquiera de estos tres anlisis pueden
producirse errores.
Reglas del lenguaje correctamente utilizadas

Generador Cdigo Intermedio


Anlisis Lexicogrfico
Identifica palabras

sentence
verb-phrase
Anlisis sintctico
Chequea si las palabras
pertenecen a la gramtica

noun-phrase noun-phrase

Articulo adjetivo sustantivo verbo artculo sustantivo

El hambriento ratn comi el queso Accin Semntica


Comprensin/interpretacin
de la sentencia
Como podr observarse en este grfico sern necesarios tantos rboles sintcticos como
sentencias fuentes
Ejemplo de Anlisis Lexicogrfico, sintctico y semntico

HASTA QUI DEPENDE DEL COMPILADOR, NO DE LA MAQUINA.


A PARTIR DE AHORA DEPENDE DE LA MAQUINA
Optimizador
De Cdigo transformacin de un rbol semntico en una representacin
cercana al cdigo objeto
De WHILE (A<B) AND (A<2*B-5) DO
A:=A + B

Lo pasa a L1: IF A<B GOTO L2


GOTO L3
L2: T1:= 2 * B
T2:= T1 5
IF A< T2 GOTO L4
GOTO L3
L4: A:= A + B
GOTO L1
L3:
El optimizador de cdigo realiza operaciones sobre el cdigo intermedio para mejorar la
eficiencia en velocidad y tamao. Elimina saltos consecutivos y
optimiza a:.
L1: A>=B GOTO L2
T1:= 2 * B
T2:= T1 5
IF A>=T2 GOTO L2
A:= A + B
GOTO L1
L2:
Factorizacin de expresiones comunes:
De A:=B+C+D a T1:= B+C
E:=B+C+F a A:=T1+D
E:= T1 + F
Extraccin de invariantes
De a
REPEAT B:=1
B:=1 REPEAT
A:= A B A:= A B
UNTIL A=0 UNTIL A=0

Generador de cdigo intermedio:


Traduce a un codigpo intermedio tal que, si no hay errores es portable para ejecutar en
diferentes computadoras. Es un grado de generalizacin
interesante. Es posible compilar en una maquina y ejecutar en
otra.
Toma el cdigo intermedio optimizado y lo transforma en cdigo objeto de bajo nivel.

De A:=B + C a cdigo intermedio y a LD AX,B


LD BX,C
ADD, AX,BX
ST AX,A

Generador de cdigo final


Genera un programa en cdigo objeto equivalente al fuente pero ejecutable en la
maquina para la cual fue generado
Tabla de smbolos
Tambin llamado diccionario. Almacena estructura de datos en la primer pasada del
compilador. Guarda en el la siguiente serie de elementos registrando tipo y longitud.
Estas elementos (futuras direcciones de memoria) son incluidas en el cdigo fuente en
la segunda pasada de los compiladores, estableciendo el desplazamiento de cada
variable con respecto al principio del programa o al de la pagina o segmento, segn el
sistema utilizado.
Variables
Constantes
Etiquetas
Tipos de variables
Dimensiones de tablas internas
Valores
Operaciones insertar, consultar, borrar smbolo

Mdulo de tratamiento de errores


Cuando un compilador detecta errores, busca posibles causas y se las informa al
programador por medio de un mensaje de diagnstico.
SI HAY ERRORES, SIGUE ANALIZANDO PERO === NO GENERA
CODIGO

Errores Lexicografitos (se pasan al sintctico): tokens no reconocidos


ENVOR_MENT
Mas de un punto decimales valor real
Sintcticos no cumple reglas de sintaxis. No reconoce como vlida a una tira
de tokens A+B/

Semnticos variables no declaradas (son warning) solo se detectan en


ejecucin
Ejecucin desbordamientos, operaciones matemticamente insolubles
Divisin por 0, raiz cuadrada de un negativo
Leer un archivo aun no abierto.

Material Interesante (de repaso e histrico)

http://www.willydev.net/descargas/prev/Compila.pdf
Ejemplo de implementacin de un rbol sintctico, que acepta o rechaza
estructuras o frases expresadas en determinado lenguaje.

Autmatas de pila

Un autmata de pila es una mquina ideal que trabaja sobre una serie de
caracteres de entrada determinando si dicha serie pertenece o no al lenguaje
propio de dicho autmata. Los autmatas vienen a ser mecanismos formales
que ``realizan'' derivaciones en gramticas formales. La manera en que las
realizan es mediante la nocin de reconocimiento. Una palabra ser generada
en una gramtica si y slo si la palabra hace transitar al autmata
correspondiente a sus condiciones terminales. Por esto es que los autmatas
son analizadores lxicos (llamados en ingls parsers'') de las gramticas a que
corresponden.

Partiendo de las definiciones de alfabeto y reglas gramaticales de un lenguaje,


cualquier cadena de smbolos que pertenezcan a este lenguaje puede ser
objeto de reconocimiento por lo que se denomina autmata reconocedor de
este lenguaje. Este reconocimiento de lenguaje puede ser utilizado para
generar acciones o traducir estas acciones a otro lenguaje, siendo en este
caso, para cada tarea y para cada lenguaje, un tipo de autmata peculiar.

La formacin de sentencias de un lenguaje puede formalizarse desde el punto


de vista algebraico. La operacin es la concatenacin, y el conjunto de cadenas
con concatenacin tiene estructura algebraica de semi-grupo, al que si se
aade un elemento neutro se convierte en monoide. En funcin del tipo de
autmata reconocedor (si tiene un conjunto de estados finito), se puede
establecer un numero finito de clases de equivalencia en el lenguaje de
entrada, lo que permite definir un semigrupo (o monoide cociente, llamado
semigrupo (o monoide) de la mquina de cuyas propiedades puede
formalizarse cuestiones de inters sobre autmatas.

En cada momento puede estar en uno de diferentes estados.


De estos estados hay uno que es el estado inicial, que es aqul en el que se
encuentra el autmata al comenzar a operar.
Puede haber uno o ms estados finales, a los cuales llega el autmata luego
de terminar de analizar la hilera de caracteres de entrada y si es que la acepta,
es decir que indica que dicha hilera pertenece al lenguaje analizado.

Un autmata de pila se utiliza para reconocer (aceptar o rechazar) hileras de un


lenguaje que en la nomenclatura de Chomsky se denomina Independiente del
contexto o de tipo 2 (Ver Nota).
El autmata va recorriendo la hilera de a un carcter por vez hasta llegar al
ltimo sin volver atrs.

La mayora de los lenguajes convencionales de programacin (C, Pascal,


Visual Basic, Cobol) tienen una gran proporcin de sus producciones de tipo 3,
pero las producciones que implican operaciones con parntesis son de tipo 2,
por lo que los lenguajes mencionados, segn Chomsky, son de tipo 2.
Tomaremos un pequeo ejemplo del tratamiento ms ntimo de un compilador,
tratando los parntesis dentro de una expresin matemtica.
Un autmata de pila utiliza una pila para acordarse de los parntesis que se
abrieron, para pedir que haya otros tantos parntesis que cierren. De no ser
as el autmata rechaza la hilera, como no perteneciente al lenguaje que
analiza: no puede construir su rbol sintctico.

Vamos a ver en el siguiente ejemplo cmo un autmata de pila acepta una


hilera con la cantidad correcta de parntesis y cmo ese autmata rechaza otra
hilera con los parntesis desbalanceados.

La transicin de un estado a otro se da por la combinacin del carcter que se


encuentra en el tope de la pila y del carcter que se obtiene en la hilera.
Adems el autmata puede reemplazar el carcter del tope de la pila.

La transicin se expresa con tres operandos:


1.- Qu carcter encuentra en la pila
2.- Qu carcter encuentra en la hilera de entrada
3.- Con qu carcter reemplaza el tope de la pila.
En el autmata de pila siguiente el estado 0 es el estado inicial y el 2 es el
estado final. El estado 1 es un estado intermedio, de trabajo.

Vamos a utilizar este autmata para reconocer las hileras con parntesis

Nomenclatura
Con F indicamos un carcter que aparece como nico contenido de la pila al
comenzar la operacin (en ese momento es el tope de la pila)
Con X indicamos un carcter cualquiera en el tope de la pila (inclusive F)
Con indicamos que se elimina el tope de la pila
Con n indicamos que se terminaron de leer todos los caracteres de la hilera

1.- Veamos cmo el autmata acta frente a la hilera (1 + a * (b + 3) ) / 10

Al comenzar, el autmata est en el estado 0 y tiene el carcter F en el tope de


la pila.
Cuando encuentra el primer parntesis en la hilera encuentra un carcter
genrico (X) en la pila y el carcter ( en la hilera. Entonces pasa al estado 1 y
reemplaza el tope de la pila por un ( seguido de lo que estaba. Con esto
fuerza un carcter ( como nuevo tope de la pila.
Cuando encuentra los caracteres siguientes (1, +, a, *) el autmata permanece
en el estado 1 y no modifica el tope de la pila.
Al encontrar el segundo parntesis el autmata permanece en el estado 1 pero
agrega un nuevo parntesis a la pila.
Con los caracteres b, +, 3 el autmata sigue en el estado 1 y no modifica la
pila.
Cuando encuentra el parntesis que cierra a continuacin de 3 (hay un
parntesis en la pila y un parntesis en la hilera) elimina un parntesis del tope
de pila y va a estado 0.
En ese estado encuentra el segundo parntesis que cierra y elimina otro
parntesis de la pila. Con eso queda nuevamente F como tope de pila.
Con /, 1, 0 el autmata permanece en el estado 0. Como luego de leer el 0 la
pila se acaba, se produce la condicin n en la hilera. Como ya tenemos F en
la pila el autmata pasa al estado 2 que es el estado final. Como ha llegado
al estado final el autmata acepta la hilera.

2.- Veamos cmo el autmata acta frente a la hilera (1 + a * (b + 3) / 10

Obsrvese que en esta expresin hay dos parntesis que abren y slo uno que
cierra.

El autmata apila los dos parntesis que abren como en el caso anterior, y
elimina uno de estos parntesis al encontrar el parntesis que cierra. Pero
cuando se termina la hilera (condicin n en la hilera), no hay una condicin F
en la pila, sino ( en la pila). Por lo tanto no puede pasar al estado final y en
consecuencia rechaza la hilera.

3.- Veamos cmo el autmata acta frente a la hilera (1 + a * b + 3) )/ 10


En esta expresin sobran parntesis que cierran.
Como antes, el autmata apila el parntesis que abre y pasa al estado 1. La
situacin de la pila no se modifica con los caracteres que siguen hasta que
encuentra el primero de los parntesis que cierran. Elimina el parntesis que
abre de la pila (y el nuevo tope de pila es F). Cuando llega el segundo
parntesis que cierra se encuentra F en la pila y ) en la hilera. Como esa
transicin no est definida, el autmata no puede llegar al estado final y
rechaza la hilera. No pudo construir el rbol sintctico.

De esta forma vemos que el autmata de pila slo acepta hileras en las que los
parntesis vienen balanceados, que es nuestro propsito al utilizarlo.
Obsrvese que sin contar con la pila es imposible que el autmata se acuerde
de cuntos parntesis se abrieron para ir controlando que se cierren en la
misma cantidad.

Elaboracin de la informacin para el caso de una estructura correcta


(primer ejemplo)

Carcter ledo Estado Contenido pila


0 F
( 1 C
F
1 1 =
+ 1 =
a 1 =
* 1 =
( 1 C
C
F
b 1 =
+ 1 =
3 1 =
) 0 C
F
) 0 F
/ 0 F
1 0 F
0 0 F
N en la hilera 2 F
Nota

En lingstica e informtica, una gramtica libre de contexto es una gramtica formal


en la que cada regla de produccin es de la forma:

Vw

Donde V es un smbolo no terminal y w es una cadena de terminales y/o no terminales.


El trmino libre de contexto se refiere al hecho de que el no terminal V puede siempre
ser sustituido por w sin tener en cuenta el contexto en el que ocurra. Un lenguaje formal
es libre de contexto si hay una gramtica libre de contexto que lo genera.

Las gramticas libres de contexto permiten describir la mayora de los lenguajes de


programacin, de hecho, la sintaxis de la mayora de lenguajes de programacin est
definida mediante gramticas libres de contexto. Por otro lado, estas gramticas son
suficientemente simples como para permitir el diseo de eficientes algoritmos de
anlisis sintctico que, para una cadena de caracteres dada determinen como puede ser
generada desde la gramtica.

La notacin ms frecuentemente utilizada para expresar gramticas libres de contexto es


la forma Backus-Naur.

Definicin formal

As como cualquier gramtica formal, una gramtica libre de contexto puede ser
definida mediante la 4-tupla:

G = (Vt,Vn,P,S) donde

Vt es un conjunto finito de terminales


Vn es un conjunto finito de no terminales
P es un conjunto finito de producciones
el denominado Smbolo Inicial
los elementos de P son de la forma

Ejemplo 1

Una simple gramtica libre de contexto es

S aSb |

donde | es un o lgico y es usado para separar mltiples opciones para el mismo no


terminal, indica una cadena vaca. Esta gramtica genera el lenguaje no regular
.
Ejemplo 2

Aqu hay una gramtica libre de contexto para expresiones enteras algebraicas
sintcticamente correctas sobre las variables x, y y z:

S x | y | z | S + S | S - S | S *S | S/S | (S)

Generara, por ejemplo, la cadena (x + y) *x - z *y / (x + x)

Ejemplo 3

Una gramtica libre de contexto para un lenguaje consistente en todas las cadenas que
se pueden formar con las letras a y b, habiendo un nmero diferente de una que de otra,
sera:

SU|V
U TaU | TaT
V TbV | TbT
T aTbT | bTaT |

T genera todas las cadenas con la misma cantidad de letras a que b, U genera todas las
cadenas con ms letras a, y V todas las cadenas con ms letras b.

Ejemplo 4

Otro ejemplo para un lenguaje es . No es un lenguaje


regular, pero puede ser generado por la siguiente gramtica libre de contexto.

S aSc | B
B bBc |
DEFINICION PALABRAS CLAVES
Anlisis lexicografito (scanner)
Anlisis semntica
Anlisis sintctico (parser)
rbol sintctico
Compilador
Interprete
Lenguaje
Macroensamblador
Optimizacin de cdigo
Tabla de smbolos
Tcnica del bottom-up para compiladores
Tcnica del top-down para compiladores
Token
Multiple Choice:
Puede haber ninguna o varias respuestas correctas.
1. Programa Fuente
a. Programa ejecutable por un computador
b. Conjunto de instrucciones u rdenes a habilidades elementales del
computador
c. Conjunto de rdenes o instrucciones escritas en un lenguaje determinado
d. Programa escrito por un programador
e. Ninguna de las anteriores
2. Compilador
a. Programa escrito en lenguaje de maquina
b. Programa que permite traducir sentencias del mismo programa
c. Hardware que incrementa la velocidad de procesamiento de las
instrucciones de maquina
d. Traductor de un programa en lenguaje de maquina a su equivalente
programa fuente
e. Programa que traduce un conjunto de programas escritos en diferentes
lenguajes para obtener un nico programa objeto
3. Intrprete
a. Cantor que interviene en una determinada pelcula
b. Programa que tiene la misma funcionalidad que un compilador
c. Ejecuta un programa de usuario ms velozmente que un compilador para
el mismo programa
d. Ninguna de las anteriores
4. Lenguaje
a. Conjuntos de palabras vinculadas lgicamente
b. Conjunto de reglas gramaticales definidas sobre un determinado alfabeto
c. Conjunto de frases que se hablan en un determinado pas o regin
d. Conjunto de instrucciones fuentes
e. Todas las anteriores
5. Decompilador
a. Aplicacin de ingeniera reversa al proceso de compilacin
b. Programa que toma sentencias objeto y obtiene sus equivalentes
sentencias fuente
c. Proceso que toma los errores generados en una compilacin indicando las
sentencias fuentes que lo generaron
6. Lenguaje con el que se codifica un compilador
a. Solo se puede codificar con instrucciones en lenguaje de maquina
b. Solo se puede codificar en lenguajes especficos que generan
compiladores.
c. Puede utilizarse el mismo lenguaje que genera el compilador construido
d. Puede construirse en cualquier lenguaje de programacin.
7. rbol sintctico
a. Es generado por el analizador lexicogrfico
b. Es generado por el analizador sintctico
c. Hay un rbol para el programa total y otro para los errores
d. Hay un rbol por cada sentencia objeto
e. Hay un rbol por cada sentencia fuente
f. Ninguna de las anteriores

Anda mungkin juga menyukai