You are on page 1of 17

Compiladores

UNIDAD I
DEFINICIONES BSICAS

1.1 Lenguajes de programacin


Las relaciones humanas se dan a travs del lenguaje, mejor conocido como lengua, el cual
permite expresar ideas y razonamientos y hace posible la comunicacin.
El lenguaje a travs del cual se comunican los ordenadores, computadoras o sistemas de
cmputo es un Lenguaje de Bajo nivel, basado en una secuencia de 0 y 1s; estas instrucciones
son especficas para cada sistema. El lenguaje que entiende directamente el ordenador es el
Lenguaje mquina.
La programacin de los sistemas se hace a travs de los lenguajes de programacin, que
posibilitan la comunicacin de rdenes al ordenador o sistema.

Lenguaje de programacin
Es una notacin formal para describir algoritmos o funciones que sern ejecutadas por un
ordenador. Es el lenguaje para comunicar instrucciones al ordenador.

Clasificacin de los lenguajes de programacin


Las tres clasificaciones ms importantes para los lenguajes de programacin son las siguientes:
Segn su grado de independencia de la mquina
a) Lenguaje mquina
- Forma ms baja de un lenguaje de programacin.
- Lenguaje de bajo nivel.
- Secuencias de 0 y 1s, cada instruccin se representa por un cdigo numrico y las
direcciones igual.
- Es la notacin que entiende directamente la PC.
- Las instrucciones y la estructura estn ligadas directamente a la arquitectura de la PC.
b) Lenguaje ensamblador
- Es la versin simblica del lenguaje mquina (nemnicos).
- Cada cdigo de operacin se indica por un cdigo simblico (ADD MUL DIV MOD).
- Las asignaciones de memoria se dan con nombres simblicos (PAGO; NOMBRE).
Compiladores
c) Lenguaje de medio nivel
- Tiene algunas caractersticas de los lenguajes de bajo nivel: posibilidad de acceso
directo a posiciones de memoria e indicaciones para que ciertas variables se almacenen
en los registros del procesador.
- Presentan la posibilidad del manejo de estructuras de control y estructuras de datos de
los lenguajes de alto nivel.
- Ejemplos de estos lenguajes: C y FORTH.
d) Lenguaje de alto nivel
- Presentan caractersticas superiores a los lenguajes de medio nivel, aunque no tienen
algunas posibilidades de acceso directo al sistema.
- Facilitan la estructura de programas con estructuras de datos complejas, utilizacin de
bloques y procedimientos o subrutinas.
- Los lenguajes orientados a objetos pertenecen a esta clasificacin y permiten definir
tipos de datos abstractos que agrupan datos y metadatos.
- Ejemplos de estos lenguajes: FORTRAN, COBOL, PASCAL, C, C++
e) Lenguaje orientados a problemas concretos
- Se utilizan para la resolucin de problemas en un campo especfico.
- Comnmente se conocen como aplicaciones.
- Ejemplos de estos lenguajes:
Lenguajes de descripcin de pgina PostScript, True Page, PCL
Formatos grficos GIF, PCX, BMP, JPEG, DBF, WGM
Formatos de BDs DBF, DBT, MDX, SQL, XBASE
Clculos estadsticos SPSS, BMDP, MiniTAB
Formatos de texto RTF, ASCII, Word, Word Perfect
Formatos de archivos de sonido WAV, MDI, MP3
Formatos de archivos de video AVI, MOV
Formatos de ayuda HLP de Windows
Lenguajes de gestin electrnica de Formato pdf de Acrobat, XML
documentos o hipertexto
Lenguajes multimedia o de autor Multimedia ToolBook, Macromind Director, Hyper Studio, Q/Media
Lenguajes de generacin de imgenes POV
Lenguajes de animacin de imgenes ANIMA Object, MiraCine
Compiladores
Segn la forma de sus instrucciones (paradigmas de programacin)
a) Lenguajes imperativos o procedimentales
- Usan la instruccin o sentencia de asignacin como construccin bsica en la
estructura de los programas.
- Tambin se conocen como lenguajes orientados a instrucciones.
- Uso intensivo de variables para referenciar posiciones de memoria.
- La estructura de los programas est basada en instrucciones.
- La resolucin de los algoritmos es por medio de estructuras de control (secuenciales,
alternativas y repetitivas).
- Manejo de bloques.
- Gestin de memoria en tiempo de ejecucin.
- Ejemplos de estos lenguajes: Pascal, C, C++, Ada, Fortran, Cobol.
b) Lenguajes declarativos
Son lenguajes de muy alto nivel cuya notacin es muy prxima al problema del algoritmo
que resuelven.
Ejemplos de estos lenguajes: LISP, APL, PROLOG.
c) Lenguajes concurrentes
Permiten la ejecucin simultnea (paralela) de dos o varias tareas.
Ejemplos de estos lenguajes: Ada, Concurrent C, Aarhus, Concurrent Prolog.
Ejemplos de estos lenguajes: LISP, APL, PROLOG.
d) Lenguajes orientados a objetos
Soportan directamente tipos abstractos de datos y clases. Lenguajes basados en
objetos, aaden mecanismos para soportar la herencia.
Compiladores
Por generaciones
1 Generacin
- Dcada de los 40 y 50s.
- Lenguaje mquina y ensamblador.
2 Generacin
- 1958 a mediados de los 60s.
- Primer compilador para FORTRAN.
- Normalizacin de los lenguajes de programacin por ANSI (American National
Standard Institute).
- Los lenguajes manejan la asignacin esttica de memoria.
- No manejaban estructuras dinmicas de datos.
3 Generacin
- Mediados de los 60 y 70s.
- Programacin estructurada.
- Uso de mdulos o subprogramas, variables locales, estructuras dinmicas.
- ALGOL 60, PL/I, ALGOL 68, PASCAL, MODULA, C.
4 Generacin
- Mediados de los 70 a finales de los 80s.
- Lenguajes de muy alto nivel dedicados a tareas especficas.
- Gestin de bases de datos.
- Generacin de aplicaciones con herramientas CASE.
- SQL, DB2, DBASE, INGRESS, NATURAL.
5 Generacin
- Principios de los 80 y principios de los 90s.
- Lenguajes ligados a la Inteligencia Artificial.
- Versiones actualizadas de lenguajes LISP (1959) y PROLOG.
COMMON LISP, PROLOG, APRLOG, MIRANDA.
Compiladores
Generacin Orientada a Objetos
- Mediados de los 80s.
- Se desarrollar el 1er lenguaje orientado a objetos: SIMULA 67.
- Desarrollo de Smalltalk y lenguaje Ada.
- Proliferan interfases grficas de usuario (GIU).
Generacin visual
- Principios de los 90s.
- Ligado a la exigencia de los usuarios de disponer de interfases amigables.
- Orientada al diseo de interfaz del usuario.

Generacin internet
- Mediados de los 90s.
- Necesidad de manejar aplicaciones en distintas plataformas dentro de toda la red.

Ventajas de los lenguajes de alto nivel sobre los lenguajes de bajo nivel
a) Facilitan la estructura de los programas.
b) Son ms fciles de aprender, requieren pocos conocimientos de hardware, y estn
cerrados a ciertas zonas de la mquina.
c) Los programadores se liberan de ocupaciones rutinarias con referencia a instrucciones
simblicas o numricas, asignaciones de memoria, etc.
d) El programador no necesita conocer la forma en que se colocan los datos en memoria.
e) Ofrecen gran variedad de estructuras de control.
f) Los programas se depuran ms fcilmente que los escritos en lenguaje mquina o
ensamblador.
g) Mayor capacidad de creacin de estructuras de datos.
h) Diseo modular de programas.
i) Soporte para la programacin orientada a objetos.
j) Relativamente independientes de la mquina, obteniendo programas que se pueden
ejecutar en diferentes ordenadores.
k) Permiten trabajar en modo grfico.
Compiladores

Inconvenientes de los lenguajes de alto nivel


- Mayores tamaos de ficheros ejecutables.
- Mayores tiempos de compilacin y ejecucin.
- No tienen capacidad para acceder a funciones reservadas del sistema.

1.2 Procesadores de lenguajes


Para que un ordenador comprenda un lenguaje, necesita procesarse, por medio de un
procesador de lenguaje como traductores, compiladores, desensambladores, que realizan
ciertas operaciones con los lenguajes.

Procesadores de lenguaje
Es el nombre genrico que reciben todas las aplicaciones informticas en las cuales uno de los
datos fundamentales de entrada es un lenguaje.

- Traductores - Intrpretes - Compresores


- Compiladores - Desensambladores - Preprocesadores
- Ensambladores - Decompiladores - Formateadores
- Montadores de enlaces o - Depuradores - Editores
enlazadores - Analizadores de - Optimizadores de cdigo
- Cargadores rendimiento

Traductores (traductor)
Programa que procesa un texto fuente y genera un texto objeto. Est escrito en un lenguaje de
implementacin. Se representa por la Notacin T

LF LO

LI
Compiladores
L. F. = Lenguaje origen que transforma el traductor.
L. O. = Lenguaje a que se traduce el lenguaje fuente.
L. I. = Lenguaje en que est escrito el traductor.

Ensamblador (assembler)
Si el lenguaje fuente es el lenguaje ensamblador y el lenguaje objeto es el lenguaje mquina,
entonces el traductor se llama Emsamblador. Los ensambladores son traductores sencillos.
EMSAMBLADOR
Lenguaje ensamblador Lenguaje mquina

Compilador (compiler)
Traductor que transforma textos fuente de lenguaje de alto nivel a lenguaje de bajo nivel.
COMPILADOR
Lenguaje de alto nivel Lenguaje mquina

Tiempo de Compilacin. Tiempo que se necesita para traducir un lenguaje de alto nivel a
lenguaje de bajo nivel.
Tiempo de ejecucin. Tiempo que tarda en ejecutarse un programa objeto.

Montadores de enlace o enlazador (linker)


Se produce cuando el lenguaje fuente permite una fragmentacin de los programas en trozos,
denominados de distintas formas segn el lenguaje de programacin empleado (mdulos, units,
libreras, procedimientos, funciones, subrutinas, etc.). Dichas partes pueden compilarse por
separado, producindose los cdigos objeto de cada una de estas partes.
El montador de enlace realiza el montaje de los distintos cdigos objeto, produciendo el mdulo
de carga, que es el programa objeto completo, siendo el cargador (loader) quien lo transfiere a
memoria.
La compilacin genera un cdigo objeto llamado Reubicable cuyo significado es que las
posiciones de memoria que utiliza son relativas. El montador de enlaces se encarga de colocar
detrs del programa principal del usuario todos los mdulos reubicables.
Compiladores

Cargadores (loader)
El cargador se encarga de colocar el fichero ejecutable en memoria; asignando el espacio
necesario al programa en memoria y pasando el control a la primera de las instrucciones a
ejecutar, comenzando a continuacin la fase de ejecucin. El cargador es un programa incluido
con el sistema operativo.

Intrpretes
Los intrpretes son programas que simplemente ejecutan las instrucciones que encuentran en
el texto fuente. En muchos casos coexisten en memoria el programa fuente y el programa
intrprete. Se da en tiempo de ejecucin. Basic, LOGO, Prolog, son lenguajes interpretados.
La ejecucin de un programa compilado ser ms rpida que la del mismo programa
interpretado, ya que el intrprete es un programa que analiza y ejecuta simultneamente un
programa escrito en un lenguaje fuente.
Programa COMPILADOR Lenguaje Resultados
fuente mquina

INTRPRETE
Lenguaje fuente Resultados
Compiladores
Decompiladores
Los decompiladores realizan la tarea inversa a los compiladores, es decir, son un caso
particular de los traductores en los cuales el programa fuente es un lenguaje de bajo nivel y el
lenguaje objeto es un lenguaje de nivel superior.
DECOMPILADOR
Lenguaje de bajo nivel Lenguaje de alto nivel

Desensambladores
Un caso particular de los decompiladores son los desensambladores que traducen de cdigo
mquina a ensamblador. Son ms fciles, por la correspondencia directa entre las
instrucciones de ensamblador y cdigo mquina.
DESENSAMBLADOR
Lenguaje mquina Lenguaje ensamblador

Depuradores (debuggers)
Los depuradores son herramientas que permiten encontrar y corregir los errores de los
programas (bugs). Suelen ir ligados a los compiladores de forma que el programador pueda
comprobar y visualizar la correcta ejecucin de un programa.
Ejemplos de debuggers: Turbo Debugger de Borland y Code View de Microsoft.

Analizadores de rendimiento (profilers)


Los analizadores de rendimiento son herramientas que permiten examinar el comportamiento
de los programas en tiempo de ejecucin, permitiendo comprobar qu zonas de cdigo trabajan
eficientemente y cules deberan ser revisadas por su bajo rendimiento.
Ejemplos de analizadores de rendimiento: Turbo Profiler de Borland, Source Profiler de Borland.

Optimizadores de cdigo
Los optimizadores de cdigo pueden ser herramientas independientes o estar incluidas en los
compiladores e invocarse por medio de opciones de compilacin, siendo sta ltima forma
como se suelen encontrar en la mayor parte de los compiladores comerciales.
Algunas opciones habituales de compilacin:
Velocidad de ejecucin
Generar cdigo para un microprocesador especfico dentro de una familia de
microprocesadores
Compiladores
Eliminar la comprobacin de rangos o desbordamientos de pila
Tamao del cdigo ejecutable
Eliminacin de cdigo muerto o no utilizado
Eliminacin de funciones no utilizadas

Compresores
Los compresores de archivos son una herramienta habitual de uso en el campo de la
informtica. Un caso particular son los compresores de ficheros ejecutables, que reducen el
tamao de los ejecutables. Por ejemplo, WINZIP de Windows.

Preprocesadores
Los preprocesadores son un caso particular de traductor en el cual se traduce un lenguaje de
alto nivel a otro, cuando el primero no puede pasar a lenguaje mquina directamente. El
preprocesador realiza las sustituciones, pero no hace ningn tipo de anlisis del contexto donde
las realiza, esta es la principal diferencia entre un preprocesador y otros tipos de procesador de
lenguaje. En otras palabras, los preprocesadores procesan un texto fuente modificndolo en
cierta forma previamente a la compilacin. Por ejemplo, el compilador del lenguaje C tiene
incorporado un preprocesador.
PREPROCESADOR COMPILADOR
Lenguaje fuente Otro lenguaje Lenguaje mquina

Formateadores
Pueden ser de muchos tipos y con diferentes fines, desde los dedicados a formatear
textos, ecuaciones o programas. Los formateadores de programas resaltan su sintaxis o su
estructura, para lo cual es necesario conocer la sintaxis del lenguaje a formatear. Tambin
pueden entrar dentro de este grupo los conversores de formato. El funcionamiento de este
procesador de lenguaje lo podemos ver en la opcin Formato de la Barra de Men.

Editores
Los editores de lenguajes de programacin con sintaxis resaltada por medio de colores o
tipos de letra permiten llamar la atencin del programador en el momento mismo que est
escribiendo el programa, sin necesidad de compilar, dado que llevan incorporada la sintaxis del
lenguaje.
Compiladores
1.3 Fases de un compilador y sus fundamentos tericos.
Compilador
Un compilador es un traductor que trasforma textos fuentes de lenguaje de alto nivel a
lenguajes de bajo nivel.

Otros conceptos de compilador:


Programa que traduce las instrucciones en un lenguaje de alto nivel a instrucciones que
la computadora puede interpretar y ejecutar.
Aplicacin capaz de traducir los archivos fuente de un lenguaje de programacin de alto
nivel a archivos objeto de un lenguaje de bajo nivel capaces de ser entendidos por el
ordenador.
Programa que se encarga de traducir el cdigo fuente a cdigo ejecutable para que el
programa pueda correr en otros ordenadores.

Caractersticas principales de un compilador


- Para cada lenguaje de programacin se requiere un compilador separado.
- El compilador traduce todo el programa antes de ejecutarlo.
- Los programas compilados se ejecutan ms rpido que los interpretados, debido a que han
sido completamente traducidos a lenguaje mquina.
- Informa al usuario de la presencia de errores en el programa fuente.
- Poseen un editor integrado con un sistema de coloreado para los comandos, funciones,
variables y dems partes de un programa.
Ejemplos de compiladores
- Borland C++ Compiler 5.5
- Microsoft QuickBasic 7.1
- Borland Turbo Assembler
- Borland Turbo C++ 3.0
- Borland Turbo C++
Compiladores
- Borland Turbo Debugger 5.5
- Borland Turbo Pascal 7
- Apteryx Lisp 1.0
- Object Ada 7.1 Special Edition
- Macromedia Director MX 9.0
- Pacific C MS-DOS Compiler
- CA Clipper 5.3
- XBASE++ Compilador Windows para CA-Clipper

Clasificacin de los compiladores


a) Compilador cruzado. Genera un cdigo ejecutable en un ordenador distinto de aquel en
que se realiza la compilacin.
b) Compilador de montaje y ejecucin. Se fragmenta el programa fuente en mdulos que
se compilan por separado, y una vez compilados se unen mediante un enlazador para
formar un mdulo ejecutable.
c) Compilador en una pasada. Examina el cdigo fuente una sola vez, generando el cdigo
objeto.
d) Compilador de pasadas mltiples Requiere varias lecturas del programa fuente para
producir y optimizar el cdigo objeto.
e) Compilador de optimizacin. Lee el cdigo fuente, lo analiza, optimiza y descubre
errores potenciales sin ejecutar el programa.
f) Compilador incremental. Compila el programa fuente, en caso de detectar errores al
volver a compilar el programa corregido, solo compila las modificaciones que se han
hecho respecto al primero.
g) Ensamblador. El lenguaje fuente es el lenguaje ensamblador.
h) Autocompilador. Es el compilador que est escrito en el mismo lenguaje a compilar,
bsicamente nos sirve para hacer ampliaciones al lenguaje, mejorar el cdigo generado,
etc.
i) Metacompilador. Compilador de compiladores. Obtiene como entrada la definicin de
un lenguaje y como salida el compilador para dicho lenguaje.
Compiladores

Proceso de compilacin
Conceptualmente, un compilador opera en fases, cada una de las cuales transforma el
programa fuente de una representacin en otra, hasta llegar al programa objeto.

FASES DEL PROCESO DE COMPILACIN

1. Anlisis lineal
Tambin llamado anlisis lxico o exploracin. En esta etapa la cadena de caracteres que
constituye el programa fuente se lee de izquierda a derecha (de arriba hacia abajo) y se agrupa
en componentes lxicos que son secuencias de caracteres que tienen un significado colectivo.
NOTA: Los espacios en blanco y comentarios se eliminan durante el anlisis lxico.

2. Anlisis jerrquico
Tambin llamado anlisis sintctico. En esta etapa los caracteres o componentes lxicos se
agrupan jerrquicamente en colecciones anidadas con un significado colectivo.
La representacin grfica del programa fuente se hace mediante un rbol de anlisis sintctico
(jerarquas).
Compiladores

3. Anlisis semntico
En esta etapa se revisa el programa fuente para tratar de encontrar errores semnticos y se
rene la informacin de los tipos para la fase posterior de generacin de cdigo.
Utiliza la estructura jerrquica determinada en la fase de anlisis sintctico para identificar los
operadores y operandos, expresiones y proposiciones.
Verificador de tipos.- El compilador verifica si cada operador tiene operandos permitidos por la
especificacin del lenguaje fuente.

4. Generacin de cdigo intermedio.


Algunos compiladores generan una representacin intermedia explcita del programa fuente. A
esta representacin intermedia se le considera un programa para una mquina abstracta.
El cdigo intermedio debe cumplir con dos propiedades importantes: ser fcil de producir y fcil
de traducir al programa objeto.
Se considera un lenguaje preensamblado o precompilado.
Debe servir para: calcular expresiones, manejar construcciones de flujo de control, llamadas a
procedimientos, etc.

5. Optimizacin de cdigo
Trata de mejorar el cdigo intermedio de modo que resulte un cdigo mquina ms fcil de
ejecutar.
Hay mucha variacin en la cantidad de optimizacin de cdigo que ejecutan los compiladores.
Un compilador de optimizacin realiza mucha optimizacin, ocupando gran parte del tiempo de
compilacin en esta tarea. Sin embargo, hay optimizaciones sencillas que mejoran
sensiblemente el tiempo de ejecucin del programa objeto sin retardar demasiado la compilacin.
Compiladores
6. Generacin de cdigo
Fase final de un compilador. Por lo general, consiste en cdigo mquina o ensamblador.
Las posiciones de memoria se seleccionan para cada una de las variables usadas por el
programa. Despus, cada una de las instrucciones intermedias se traducen a una secuencia de
instrucciones de mquina que ejecutan la misma tarea.

Existen otras dos actividades que interactan con las fases del compilador:
- El administrador de la tabla de smbolos, y
- El manejador de errores

Administrador de la Tabla de Smbolos


Una funcin esencial del compilador es registrar los identificadores utilizados en el programa
fuente y reunir la informacin sobre los atributos de cada identificador.
Informacin que proporcionan los atributos: memoria asignada, tipo, mbito (locales, globales).
Para procedimientos o funciones: nmero y tipo de argumentos, mtodo para pasar argumentos,
tipo de dato que devuelve.
Tabla de smbolos. Estructura de datos que contiene un registro por cada identificador, con los
campos para los atributos del identificador. La estructura de datos permite encontrar rpidamente
el registro de cada identificador y almacenar o consultar rpidamente los datos de ese registro.

Manejador de Errores
Cada fase del compilador puede encontrar errores. Despus de detectar un error, cada fase
debe tratar de alguna forma ese error para poder continuar la compilacin, permitiendo la
deteccin de ms errores en el programa fuente.
El anlisis sintctico y semntico manejan la mayora de errores detectables por el compilador.
El anlisis lxico detecta errores donde los caracteres restantes de la entrada no forman ningn
componente lxico del lenguaje.
El anlisis sintctico detecta los errores donde la cadena de componentes lxicos violan las
reglas de la estructura.
El anlisis semntico el compilador intenta detectar construcciones que tengan estructura
sintctica correcta pero que no tengan significado para la operacin implicada. Por ejemplo,
Compiladores
cuando se intenta sumar dos identificadores, donde uno corresponde al nombre de un arreglo y
otro al nombre de una funcin.

Agrupamiento de las fases de compilacin


La fases del proceso de compilacin se agrupan en una etapa inicial y una etapa final.
Etapa inicial
Comprende aquellas fases que dependen principalmente del lenguaje fuente y son en gran parte
independiente de la mquina objeto.
- Anlisis lxico
- Anlisis sintctico
- Anlisis semntico
- Generacin de cdigo intermedio
Etapa final
Comprende aquellas fases del compilador que dependen de la mquina objeto. No dependen del
lenguaje fuente, solo del lenguaje intermedio.
- Optimizacin de cdigo
- Generacin de cdigo
El Manejador de Errores y Administrador de la Tabla de Smbolos se utilizan durante todo el
proceso de compilacin.

1.4 Formas de Backus Naur (BNF)


John Backus particip en la creacin del primer lenguaje de alto nivel (FORTRAN), particip en
el desarrollo del lenguaje ALGOL que utiliz por primera vez la forma BNF.
La notacin BNF o gramtica independiente de contexto permite describir la sintaxis de las
construcciones de los lenguajes de programacin, utilizando los siguientes smbolos:
<> Encierra conceptos definidos o por definir (se utiliza para los no terminales en una
gramtica).
::= Para definir o indicar equivalencia
| Separa las distintas alternativas
Indica que el smbolo entre comillas es un carcter que forma parte de la sintaxis del
lenguaje.
( ) Para agrupaciones
Compiladores
Por ejemplo, para definir un identificador (nombre que se utiliza para identificar una variable) en
BNF:
<identificador> ::= <letra> | <letra> <letra> | <letra> <digito>
<letra> ::= a | b | c | d | e | . . . | z
<digito> ::= 0 | 1 | 2 | 3 | 4 | . . . | 9
en este caso, a,b,c,d,e,...,z y 0,1,2,3,...,9 son terminales y el resto no terminales.

1.5 Jerarquas de Chomsky


Noam Chomsky (1928):
- Lingista y profesor universitario.
- Intelectual y crtico activista poltico.
- Libros sobre lingstica, filosofa y poltica.
- Fundador de la gramtica generativa transformacional.
- Sus anlisis del lenguaje parten de las oraciones bsicas que se desarrollan y terminan en una
variedad de combinaciones sintcticas al aplicar una serie de reglas.
- En los aos 50s realiz grandes avances en la concepcin de un modelo matemtico de las
gramticas.