Sei sulla pagina 1di 15

UNIDAD 1

LOS COMPILADORES
OBJETIVO GENERAL: Dar a los participantes los conceptos y herramientas
para que se puedan desenvolver apropiadamente en el manejo de
compiladores.
OBJETIVOS ESPECFICOS:
Conocer los conceptos bsicos de la Teora General de Sistemas
aplicada a los compiladores.
Estudiar los conceptos bsicos de introduccin a los compiladores
Aplicar las tcnicas de compilacin ms utilizadas en las ltimas
generaciones de desarrollo de software.
Antes de entrar en materia debemos aclarar los siguientes trminos:
LENGUAJE: todos sabemos que es un lenguaje de programacin, pero el
concepto de lenguaje de programacin abarca mucho ms all de lo que ahora
imaginamos. Un lenguaje de programacin, adems de Mdulo, C++ o Java,
puede ser por ejemplo el binario (ya sabe... eso que es ms o menos as
010001110110..) es muy fcil hacer un traductor de programas escritos en
binario a cdigo maquina (cogemos ocho caracteres del programa fuente que
queremos traducir, si los ocho son caracteres 0 o 1 escribimos el byte
equivalente a esa combinacin binaria en el fichero destino, repitiendo este
proceso hasta que se terminara el programa fuente, y si viniera un carcter
diferente emitimos un error de compilacin **Carcter no vlido**), muy fcil si,
pero a ver quin es el valiente que se programa un simulador de vuelo en ese
lenguaje. Como otro ejemplo, podramos inventarnos un lenguaje para
programar una caldera de calefaccin, este podra ser una lista de
instrucciones de dos tipos, una GO x indicara que queremos que la caldera
suba o baje hasta la temperatura indicada en x y otra WAlT x indicara que
se mantuviera en el estado actual durante x horas, el programa para un da
podra ser:

GO 18 WAIT2 GO 20 WAIT6 GO 16 WAIT2 GOOWAIT 14


Y si adems permitiramos que hubiera un salto de lnea entre instruccin e
instruccin, entonces hasta parecera un programa de verdad
Nivel de un lenguaje.
Se habla siempre de lenguajes de alto o bajo nivel, esto se refiere simplemente
a si estn ms cerca del nivel de comprensin humana (alto nivel) o del nivel
de comprensin de la mquina (bajo nivel). No se refiere nunca ni a la calidad
ni a la complejidad de los lenguajes, as por ejemplo, aunque los dos lenguajes
que utilizamos en el punto anterior son muy sencillos, el lenguaje binario para
programar un simulador de vuelo sera de muy (MUY) bajo nivel, mientras que
el lenguaje de la caldera sera de alto nivel, ya que est muy cerca de como
pensamos nosotros (primero tantas horas a tal temperatura, despus baja un
poco ...), aunque un lenguaje para programar la caldera con un nivel mucho
ms alto sera:
BEGIN
Por favor, si no te importa, encindete a las 10 de la maana y pon una
temperatura agradable, calienta pero sin pasarte, despus si calienta
mucho el sol me bajas un poco, vale?.
END
Como puede observar, ni siquiera la longitud de la solucin a un problema
depende de que el lenguaje que se emple para resolverlo fuera de un nivel
ms bajo o ms alto.

SMBOLO, cada lenguaje tiene sus elementos bien definidos; un lenguaje


como el castellano tiene palabras. En los lenguajes formales a estos elementos
no se les denomina palabras, sino smbolos, son smbolos del lenguaje O, por

ejemplo, tanto la palabra main() como los smbolos {, o o una constante


numrica.
Son todos elementos con identidad propia, y con un significado y una utilidad
determinadas, no son smbolos de C, por ejemplo, ni los espacios en blanco ni
los saltos de lnea, pues no intervienen en absoluto en la estructura del
programa.
Un programa siempre se considera como una secuencia de smbolos del
lenguaje. Por ejemplo, si tenemos el siguiente programa escrito en C:
#include<sodio.h>
#include<conio.h>
main()
{/*l Comentario */
int numero=28;
}
Lo primero que hara un traductor es leer la secuencia de caracteres que
conforma el programa fuente ( ,m,a,i,n,, ...) e identificar los smbolos del
lenguaje, despus de hacerlo el programa anterior sera para un traductor algo
como esto: smbolo (main), smbolo (abrir parntesis), smbolo (cerrar
parntesis), smbolo (inicio bloque), smbolo (int), smbolo (identificador de una
variable), smbolo (asignacin), smbolo (constante numrica), smbolo
(separador de sentencia), smbolo (fin de bloque). Y para poder trocear de esta
manera el programa fuente, el traductor debe aplicar las reglas lxicas.

Reglas lxicas: son un conjunto de normas que definen la forma que tienen
estos elementos bsicos del lenguaje, por ejemplo, se puede especificar que
un smbolo de tipo identificador es una secuencia de caracteres que comienza
con un carcter alfabtico (entre A y Z maysculas o minsculas), y contina
mientras sigan en secuencia caracteres alfanumricos (letras o nmeros). Si
los definimos as un traductor analizara Mivar2 como un smbolo identificador,

pero Mi_var2 seran dos smbolos identificadores con otro smbolo extrao
entre ellos.
Tambin podemos especificar que un smbolo de asignacin es la secuencia de
caracteres := (dos puntos y un igual). Con estas dos sencillas reglas ya
hemos definido dos smbolos del lenguaje, los identificadores y los de
asignacin.
En un lenguaje de programacin inventado que tuviera solo esos dos smbolos
no sera correcto lxicamente cualquier smbolo que no estuviera englobado en
una de esas dos definiciones (como +, 8a, == o _), y cuando un programa
traductor los recibiera como entrada emitira un error lexicogrfico, para
advertirnos que hemos violado las reglas lxicas del lenguaje que implementa.

Reglas sintcticas. Una vez definidos cuales son los smbolos de un lenguaje,
con !as reglas sintcticas (o de sintaxis) se definen que secuencias de
smbolos son vlidas dentro del lenguaje. Por ejemplo, en el lenguaje binario al
que antes nos referimos, solo hay dos smbolos posibles, el cero y el uno, y sus
reglas sintcticas son bien sencillas: Un programa es cualquier secuencia de
smbolos. Pero el lenguaje binario es un caso especial (dada su extrema
simplicidad), pues lo ms normal en todos los lenguajes de programacin es
que solo sean vlidas algunas de las posibles secuencias de smbolos; en
Pascal por ejemplo, es vlida la siguiente secuencia:
Ancho := Alto + 1;
No siendo vlida (no perteneciendo al lenguaje) esta otra secuencia:
Ancho =; + Alto 1
El traductor detectara que la secuencia no es vlida porque en alguna de sus
reglas sintcticas se especifica que: Despus de un smbolo de asignacin (:=)
no puede venir un smbolo separador de sentencias (;). Es posible que una
regla como la anterior no est especificada explcitamente, pero sea deducible
del resto de reglas especificadas en el lenguaje.

De una secuencia de smbolos correctamente construida se dice que es una


secuencia correcta sintcticamente, y cuando un programa no cumple estas
normas (como en el caso del ltimo ejemplo), el programa traductor emite un
error sintctico (Syntax error) informndonos de que no respetamos sus reglas
sintcticas.

Reglas semnticas. Estas son las ltimas normas que se imponen para que
un programa se pueda dar por correcto. Son las ms genricas y variables de
un lenguaje a otro. Una vez tenemos un programa que cumple las reglas
lexicogrficas (que tiene los smbolos bien formados) y las sintcticas (bien
concatenados), hemos de verificar que esta bien construido. Veamos el
siguiente programa en O:
main ()
{
n=33;
printf(El valor de n es %u,n);
}
Este programa es correcto lxicamente (no hay smbolos mal construidos) y
sintcticamente (tampoco hay problemas con la secuencia de smbolos), pero
no es correcto por que no hemos declarado la variable n, y debera haber
aparecido antes una declaracin del tipo: mt n;. Esta situacin se denomina
error semntico.
Las reglas semnticas definen cosas como todo lo referente a la coherencia de
las expresiones, dicen si es posible operar con variables de tipos diferentes,
que el nmero de parmetros en una llamada a una funcin debe coincidir con
el nmero de parmetros que extra recibe (y coincidir los tipos), que se deben
declarar todos los recursos (como constantes, procedimientos, variables,
tablas, ...) que se utilicen en el programa, que una variable no se puede

declarar varias veces, etc... Son el tipo de normas que definen si un programa
es correcto.
El corazn de un compilador es un traductor, que es un programa que recibe
como entrada un algoritmo expresado en un lenguaje y emite como salida el
mismo algoritmo expresado en un lenguaje diferente. Un compilador es un
paquete que incluye muchas ms cosas aparte del traductor, todas ellas
necesarias para programar, como son: libreras de funciones, un entorno de
desarrollo, (o trazador) de cdigo, ayuda en forma de documentacin, un
optimizador de cdigo, informacin sobre los errores,
Esta serie de artculos, que se debera llamar TRADUCTORES, se centra en
el interior de tos compiladores, con un primer objetivo que es, mejorar el uso
que hacemos de nuestra herramienta de trabajo, aumentando de forma
considerable nuestra cultura informtica, y un segundo objetivo que es
ensear lo justo y necesario para aquellos de nosotros que sintamos la
necesidad de inventar un nuevo lenguaje de programacin que revolucione el
mundo.
Desmitificar los compiladores ser la primera meta, nadie va a hundir a
Microsoft o Borland inventando el D++ o el C orientado a seres vivos, pero
inventar un lenguaje y programar un traductor para l es algo que cualquiera de
POR QUE ESTUDIAR DISEO Y CONSTRUCCION DE COMPILADORES?
Ayuda a los profesionales de rea de sistemas a profundizar el conocimiento
acerca del diseo de programas y su implementacin.
Toda traduccin es siempre problemtica, pues es difcil en muchas ocasiones
expresar la misma solucin a un problema en lenguajes de naturalezas tan
diferentes como C o ensamblador. Esa es la misin de nuestra primera, por
excelencia, herramienta de trabajo. Es tan vital conocer bien el compilador que
utilizamos, como conocer bien el lenguaje que implementa. El problema es:
Que sabe usted de l?.

El corazn de un compilador es un traductor, que es un programa que recibe


como entrada un algoritmo expresado en un lenguaje y emite como salida el
mismo algoritmo expresado en un lenguaje diferente. Un compilador es un
paquete que incluye muchas ms cosas aparte del traductor, todas ellas
necesarias para programar, como son: libreras de funciones, un entorno de
desarrollo, (o trazador) de cdigo, ayuda en forma de documentacin, un
optimizador de cdigo, informacin sobre los errores,.
Esta asignatura, que se debera llamar TRADUCTORES, se centra en el
interior de los compiladores, con un primer objetivo que es, mejorar el uso que
hacemos de nuestra herramienta de trabajo, aumentando de forma
considerable nuestra cultura informtica, y un segundo objetivo que es
ensear lo justo y necesario para aquellos de nosotros que sintamos la
necesidad de inventar un nuevo lenguaje de programacin que revolucione el
mundo.
Desmitificar los compiladores ser la primera meta, nadie va a hundir a
Microsoft o Borland inventando el D++ o el C orientado a seres vivos, pero
inventar un lenguaje y programar un traductor para l es algo que cualquiera de
nosotros puede hacer.
Por que inventar un nuevo lenguaje y para que?, todos los tipos de problemas
tienen un lenguaje ideal para plantear su solucin. Un lenguaje para manejar
bases de datos, otro para problemas de fsica o matemticas, otro para
programar multimedia, otro para programar equipos electrnicos y otro para
programar videojuegos.
En el proceso de construccin de un compilador se integran muchos de los de
diferentes tpicos de los conocimientos adquiridos por los ingenieros de
sistemas (que han sido estudiados en materias anteriores).

Lenguajes de Programacin
Algoritmos

sintaxis, semntica, etc.


algoritmos de grafos, bsqueda, etc.

Estructuras de la Informacin
Ingeniera de Software

rboles, hashing, etc.


programacin modular (programming in

Teora de Lenguajes
Arquitectura del Procesador

the large)
CFGs, expresiones regulares, autmatas
Lenguaje Assembler, uso del conjunto de
instrucciones, arquitecturas, etc.

TECNICAS DE COMPILACIN
SON UTILES EN EL DESEMPEO PROFESIONAL O CIENTIFICO DE UN
PROFESIONAL DE SISTEMAS.

Las

tcnicas

matching

de

string tambin son usadas para:

usadas

para

escribir scanners

editores de texto,

sistemas de recuperacin de
informacin

Las gramticas CF y las

comandos UNIX

tambin son usadas para:

traducciones dirigidas por la

disear lenguajes tipo LA TEX,

sintaxis

Sistemas de dibujo de figura

Tcnicas de Optimizacin de
Cdigo

Verificadores de programas.

COMPUTADORAS QUE LENGUAJE ENTIENDEN? COMO PUEDEN


EJECUTAR

PROGRAMAS

ESCRITOS

EN

LENGUAJES

DE

PROGRAMACION O DE ALTO NIVEL?

Para solucionar esto interrogantes se debe iniciar por definir los traductores,
intrpretes y compiladores.

LOS TRADUCTORES
Un traductor es un programa que traduce un programa escrito en un lenguaje a
un nuevo programa escrito en otro lenguaje
Como se mencion antes se trata de un programa que recibe y devuelve el
mismo algoritmo, pero expresado en dos lenguajes diferentes. Al lenguaje que
recibe se le denomina lenguaje fuente, y al que devuelve lenguaje destino. Los
traductores ms genricos que podamos estar usando nosotros son aquellos
que traducen programas escritos en un lenguaje de alto nivel (C, C++,
Pascal, ...) a cdigo mquina para los procesadores Intel, pero tambin
podemos hacer un traductor de C++ a Java, que tome un programa en el
primer lenguaje y produzca una salida vlida para ser compilada con un
compilador comercial de Java. Un traductor tambin puede traducir de
ensamblador a, o recibir un programa en ensamblador y producir como salida
un programa equivalente en Visual basic (aunque con sus limitaciones,
obviamente).

Fases de un traductor. Un programa traductor divide su trabajo en dos partes,


el anlisis y la sntesis.
La fase de anlisis es la que recibe un fichero como entrada el programa fuente
y analizndolo secuencialmente comprueba la estructura del programa, viendo
si se cumplen todas las reglas del lenguaje (lxicas, sintcticas y semnticas).

Dependiendo de si las cumple o no, el traductor decide si ha entendido el


programa o no lo ha entendido. Si lo ha entendido entonces puede pasar a la
sntesis, en caso contrario se produce un error de compilacin y posiblemente
no se pueda pasar a la siguiente fase (a no ser que el compilador pueda
remendar el error de alguna manera y seguir compilando).
La fase de sntesis es la que explica en el lenguaje destino lo que deca el
programa en el lenguaje fuente. Y como lo explica?, pues sencillamente
generando l otro programa en el lenguaje destino, que hace lo que entendi
que quera hacer el programa fuente.

ESQUEMATICAMENTE:

PROGRAMA EN
LENGUAJE
FUENTE

ENSAMBLADORES
TRADUCTORES

COMPILADORES

PROGRAMA EN
LENGUAJE
OBJETO

INTERPRESTES

El compilador es un traductor de las siguientes caractersticas

PROGRAMA EN
LENGUAJE
SUPERIOR

PROGRAMA EN
LENGUAJE
ASS, O MAQ

ERROR Y
DIAGNOSTICO

Las pasadas sobre la fuente. Un programa traductor puede necesitar leer


varias veces el programa fuente para entender lo que en este se especifica. La
forma de funcionar un traductor en general, es ir leyendo y analizando todas las
lneas del programa por orden, primero la lnea uno, luego la dos, etc... y hay
algunos problemas que para resolverlos, el traductor necesita hacer un
segundo (tercer, o cuarto) anlisis de las lneas del programa. Un ejemplo:
vamos a suponer que tenemos que traducir un programa escrito en un

supuesto lenguaje que tiene etiquetas y saltos incondicionales a esas etiquetas


(GOTO o JMP) Que hace el traductor cuando se encuentra un salto a una
etiqueta que no conoce y no sabe donde est?
Emitir un error no es una solucin, pues no permitira saltar a etiquetas situadas
al final del programa desde su inicio, ya que cuando llega la instruccin de salto
no ha sido encontrada todava la etiqueta correspondiente. Una primera
solucin para poder tratar correctamente los saltos, sera leer dos veces la
fuente, la primera nos quedamos con la posicin de las etiquetas y en la
segunda pasada (o lectura de la fuente) trataramos correctamente las
instrucciones de salto (generando un salto a la direccin en la que estuviera
definida la etiqueta). Y una segunda solucin seria leer solo una vez la fuente
(una sola pasada) anotando en variables del traductor todas aquellas etiquetas
que han sido utilizadas y an no han sido declaradas.
Como hemos visto, segn sea diseado un traductor puede ser de una o
mltiples pasadas. En general es ms complicado hacerlo todo en una misma
pasada, pero es mucho ms rpido que hacerlo en varias. Hay lenguajes que
por su diseo se dice que son de una o de varias pasadas, esto se refiere a si
al implementar su traductor es suficiente hacer una sola pasada o es necesario
hacer varias. Hay muchos ms motivos que la complejidad del lenguaje para
hacer ms o menos pasadas, los compiladores suelen hacer pasadas extra
cuando se pretende optimizar el cdigo, por ejemplo.

LOS INTRPRETES
Leen un programa escrito en un lenguaje de programacin y produce el
resultado de ejecutar tal programa.
Los intrpretes son programas que, por decirlo de alguna manera, juegan a ser
microprocesadores, leen un programa y van haciendo secuencialmente lo que
el programa dice, simulan su ejecucin, pero en realidad lo que siempre se est
ejecutando es el cdigo del intrprete, su desventaja es que este proceso es

ms lento que generar cdigo mquina y dejar que el procesador de nuestro


ordenador lo interprete. Su principal ventaja es que son muy sencillos y
flexibles, permitiendo un control total sobre la ejecucin. Es ms fcil interpretar
un programa en Visual Basic que generar cdigo mquina equivalente (con un
programa traductor).

SALIDA
INTERPRETE

DATOS
LENGUAJE DE
PROGRAMACION
SUPERIOR

VENTAJAS
COMPILADORES vs INTERPRETES
MAS EFICIENTES
PUEDEN PRODUCIR CODIGO
OPTIMIZADO
LOS PROGRAMAS TRADUCIDOS
NO REQUIEREN MS
TRADUCCIN

FACILES DE CONSTRUIR
FACILES DE DEBUG

Todas las tcnicas de construccin de compiladores son relevantes


tambin para la construccin de intrpretes.

ACTIVIDADES DE REFUERZO DE LA UNIDAD 1ro.1.


1. De acuerdo a los conocimientos aprendidos, realice la comparacin entre un
lenguaje interpretado y un lenguaje compilado.
Envelo a su tutor y disctanlo.
2. Realice un programa que lea un nmero entero positivo y como resultado
diga si ese nmero es primo o no.
Ponga a correr el programa en un lenguaje compilado y en otro interpretado,
anote los puntos ms importantes que vea al momento de ponerlo a ejecutar.
Analice los resultados y envelos a su tutor.