You are on page 1of 13

Compiladores e Intrpretes

Compilador, que analiza el programa fuente y "lo traduce" a otro


equivalente escrito en otro lenguaje (por ejemplo, en el lenguaje de la
mquina). Su accin equivale a la de un traductor humano, que toma un
libro y produce otro equivalente escrito en otra lengua.

Intrprete, que analiza el programa fuente y "lo ejecuta


directamente", sin generar ningn cdigo equivalente. Su accin equivale
a la de un intrprete humano, que traduce las frases que oye sobre la
marcha, sin producir ningn escrito permanente. Intrpretes y
compiladores tienen diversas ventajas e inconvenientes que los hacen
complementarios:

Un intrprete facilita la bsqueda de errores, pues la


ejecucin de un programa puede interrumpirse en cualquier momento
para estudiar el entorno (valores de las variables, etc.). Adems, el
programa puede modificarse sobre la marcha, sin necesidad de volver a
comenzar la ejecucin.

Un compilador suele generar programas ms rpidos y


eficientes, ya que el anlisis del lenguaje fuente se hace una sola vez,
durante la generacin del programa equivalente. En cambio, un
intrprete se ve obligado generalmente a analizar cada instruccin
tantas veces como se ejecute (incluso miles o millones de veces).
Un intrprete permite utilizar funciones y operadores ms potentes,
como por ejemplo ejecutar cdigo contenido en una variable en forma de
cadenas de caracteres. Usualmente, este tipo de instrucciones es
imposible de tratar por medio de compiladores. Los lenguajes que
incluyen este tipo de operadores y que, por tanto, exigen un intrprete, se
llaman interpretativos. Los lenguajes compilativos, que permiten el uso
de un compilador, prescinden de este tipo de operadores. En pocas
palabras "el compilador slo traduce; el intrprete decodifica y ejecuta.

Compiladores, intrpretes y mquinas virtuales


Cuando aprendemos a programar, normalmente escogemos o nos imponen un
determinado lenguaje de programacin. Una de las primeras distinciones que
es interesante conocer acerca de nuestro lenguaje es si el lenguaje
se compila o se interpreta.
En este artculo intentaremos explicar las diferencias entre ambas formas de
trabajar. Adems, desde la aparicin del lenguaje Java hace ya algunos aos,
ha tomado fuerza otro planteamiento muy interesante: el de las
llamadas mquinas virtuales.
nota: El trmino mquina virtual se utiliza en distintos contextos, por ejemplo,
productos como VmWare o VirtualBox son software que permiten emular un
ordenador, con su sistema operativo y sus aplicaciones dentro de otro. A este
tipo de aplicaciones se le suele llamar mquinas virtuales de sistema. En
ste artculo nos referimos a las mquinas virtuales de proceso, en las que
se simula una mquina imaginaria para ejecutar un nico proceso

En este sistema de mquinas virtuales (de proceso) se realiza una compilacin


y posteriormente una interpretacin. No es un concepto nuevo, pero sin duda,
no ha tenido una aplicacin prctica masiva hasta la llegada de la plataforma
Java de Sun Microsystems a principios de los 90 (hoy en da de Oracle), y algo
despus con la plataforma .NET de Microsoft y su equivalente Mono para
entornos unix/Linux. Tambin el sistema operativo Android utiliza este enfoque
para la ejecucin de sus aplicaciones en terminales con hardware muy distinto.
Antes de comentar cada tcnica, hagamos hincapi de una manera muy bsica
en una serie de conceptos.

La confeccin de un programa se realiza escribiendo una serie de rdenes o


instrucciones que siguen las normas de un lenguaje de programacin. Estas
rdenes las escribimos en ficheros de texto plano, utilizando algn editor de
textos ms o menos sencillo, o bien alguno de los editores especializados para
programacin. Incluso, algunos entornos de programacin proporcionan sus
propias herramientas especficas para escribir programas, con muchas
ventajas para el programador... pero por muy compleja que sea la herramienta
para confeccionar programas, por lo general, el programa siempre se reduce a
una serie de instrucciones en un fichero de texto.
A estos ficheros de texto les llamamos fuente. (del ingls source. A menudo se
utilizan expresiones como cdigo fuente, ficheros fuente, etc.).
Sin embargo, sabemos que la CPU slo entiende su propio lenguaje, que
normalmente es extraordinariamente sencillo comparado el lenguaje de
programacin que estamos aprendiendo. El lenguaje de la CPU es el
cdigomquina (del ingls machine code). El cdigo mquina son secuencias
binarias que la CPU ejecuta como instrucciones sencillas. Por supuesto, cada
modelo de CPU tiene su propio cdigo mquina, aunque a veces, varios
modelos de CPU tienen lenguajes mquina compatibles.
Los humanos expresamos la dinmica de un programa mediante un lenguaje
de los llamados de "alto nivel". Estos son lenguajes como C#, Java, Visual
Basic, Delphi, etc... casi cualquiera de los nombres que conoces. Decimos que
un lenguaje tiene un nivel ms bajo cuanto ms parecido es en su expresin al
cdigo mquina y al funcionamiento de la CPU, y de un nivel ms alto cuanto
ms ajeno es al funcionamiento de la CPU y ms se acerca a la forma de
razonar humana.
Pues bien... si realizamos un programa escribiendo su fuente en un lenguaje de
alto nivel y la CPU slo es capaz de ejecutar rdenes en el lenguaje de ms
bajo nivel que existe (el cdigo mquina), es obvio que es necesario realizar un

proceso de traduccin desde el lenguaje de alto nivel al cdigo mquina.

Es necesario tener en cuenta que cada orden de un lenguaje de alto nivel (por
ejemplo, una orden para imprimir "hola mundo" por la pantalla) se traduce en
largas secuencias de instrucciones en cdigo mquina (incluso varios miles).
Lo que para nosotros es una sola orden, para la CPU supone muchos
pequeos pasos extremadamente simples.

Tampoco podemos olvidarnos del sistema operativo. Los programas de


aplicacin se apoyan no slo en la CPU, sino que necesitan de la participacin
del sistema operativo para realizar muchas de sus labores. As pues, muchas
veces los programas se hacen pensando que su destino va a ser una
determinada CPU ms un determinado sistema operativo. A menudo, incluso
hay que incluir en esta lista otros programas como servidores de aplicaciones,
sistemas gestores de bases de datos, libreras de cdigo, etc. A este conjunto
de requisitos necesarios para la ejecucin de un programa se le suele llamar a
menudo plataforma.
El encargado de realizar esta traduccin es un tipo de programa llamado
compilador. En su funcionamiento ms bsico, un compilador acepta uno o
ms ficheros fuente y si no contienen errores sintcticos produce un fichero
binario ejecutable, que un sistema operativo ser capaz de cargar en memoria
principal y pedir a la CPU que lo ejecute.
A menudo se compara a un compilador con un traductor de idiomas. Imagina
un libro escrito en ingls. Para publicar su versin en espaol, una persona que
conoce las reglas de los dos idiomas y dispone de la tcnica para expresarse
en ambos va leyendo el libro en ingls frase a frase y va escribiendo su
equivalente en espaol.

Compilacin nativa y compilacin cruzada


Es habitual que un desarrollador utilice para programar una determinada
plataforma... por ejemplo, el lenguaje C++ sobre una mquina con Windows.
Normalmente, el compilador generar cdigo compilado que la CPU puede
entender, y que se puede ejecutar en la misma mquina con la participacin de
un sistema operativo Windows.
No obstante, a veces, se desarrolla en una plataforma y se compila para que
los programas sean ejecutados en otra. A esto se le llama "compilacin cruzada
Diferencias entre compilar e interpretar
La opcin de compilar o interpretar no est siempre disponible. Algunos
lenguajes tpicamente se compilan y otros tpicamente se interpretan. En muy
pocas ocasiones podemos optar por una u otra indistintamente.
Por ejemplo, programas escritos en lenguajes como C o Pascal prcticamente
siempre se compilan, y otros como PHP o Python prcticamente siempre se

interpretan.

El enfoque de Mquina Virtual


Hemos visto que los programas interpretados o compilados tienen distintas
ventajas e inconvenientes. En un intento de combinar lo mejor de ambos
mundos, durante la dcada de los 90 surge con fuerza el enfoque de mquina
virtual. Los principales lenguajes abanderados de esta tecnologa son, por un
lado, el lenguaje Java de Oracle, y por otro, los lenguajes de la plataforma
.NET de Microsoft: Visual Basic.NET y C# principalmente.
La filosofa de la mquina virtual es la siguiente: el cdigo fuente se compila,
detectando los errores sintcticos, y se genera una especie de ejecutable, con
un cdigo mquina dirigido a una mquina imaginaria, con una CPU imaginaria.
A esta especie de cdigo mquina se le denomina cdigo intermedio, o a
veces tambinlenguaje intermedio, p-code, o byte-code (segn quin nos lo
cuente).
Como esa mquina imaginaria no existe, para poder ejecutar ese ejecutable, se
construye un intrprete. Este intrprete es capaz de leer cada una de las

instrucciones de cdigo mquina imaginario y ejecutarlas en la plataforma real.


A este intrprete se le denomina el intrprete de la mquina virtual.

Y para qu todo este montaje?


Pues esta pregunta puede responderse desde varios puntos de vista, pero se
puede afirmar que este esquema aporta muchas de las ventajas de la
compilacin y la interpretacin, deshacindose de algunos inconvenientes.
Principalmente se pueden recalcar:

Portabilidad y rapidez: El cdigo intermedio ya est libre de errores


sintcticos, y es un cdigo muy sencillo (al estilo del cdigo mquina). Si
existe un intrprete para este cdigo en distintas plataformas, el mismo
cdigo se puede ejecutar en cada una de ellas. Adems, la construccin
de este intrprete ser relativamente sencilla y su ejecucin ms rpida,
ya que no ha de comprobar la sintaxis.

Estabilidad: El cdigo intermedio no es ejecutado por una CPU real


directamente, sino por una CPU virtual: realmente, por el intrprete de la

mquina virtual, que es un programa y no un chip real. Esto permite un


mayor control sobre este cdigo, facilitando la labor de impedir que un
cdigo descontrolado afecte a la estabilidad de la plataforma real.
Para entender algo mejor este concepto, podemos fijarnos, por ejemplo, en el
lenguaje JAVA. Imaginemos que disponemos de dos ordenadores: uno con un
sistema operativo Windows y un procesador intel de 64 bits y el otro con un
sistema operativo Linux y un procesador AMD de 32 bits.

En el primer ordenador instalamos un compilador de Java y una


mquina virtual de Java especficos para Windows 64 bits.

En el segundo hacemos lo mismo, pero con un compilador y mquina


virtual especficos para Linux 32 bits.

Confeccionamos un programa sencillo (por ejemplo, que escriba "Hola


Mundo" por la pantalla) escrito en Java en el primer ordenador y lo
compilamos, generando un ejecutable intermedio. Si utilizamos la
mquina virtual del primer ordenador para ejecutar ese cdigo
intermedio, comprobaremos que el programa escribe, en efecto "Hola
Mundo" por la pantalla.

Si cogemos ese ejecutable intermedio lo llevamos tal cual a la segunda


mquina, podremos utilizar la mquina virtual instalada all para
ejecutarlo, y comprobaremos que el resultado es exactamente el mismo:
"Hola Mundo".

Ventajas y desventajas de los compiladores e interpretes


Veamos las ventajas que tiene este enfoque de mquina virtual de proceso
comparado con la compilacin o la interpretacin.
Vamos a retomar la tabla anterior, pero aadiendo la mquina virtual.
Compilar

Interpretar

Mquina virtual

-Genera un ejecutable

-No genera un ejecutable -Genera una especie de


ejecutable, pero portable entre
plataformas, dirigido a una CPU
imaginaria.

-El proceso de

-El proceso de traduccin se realiza en cada ejecucin

traduccin se realiza una


sola vez
-La ejecucin es muy
rpida debido a que el
programa ya ha sido
traducido a cdigo
mquina

-La ejecucin es ms
lenta, ya que para cada
lnea del programa es
necesario realizar la
traduccin

-Se realiza una


sola traduccin
a cdigo
intermedio, y
una
interpretacin
muy rpida del
cdigo
intermedio en
cada ejecucin.

-La ejecucin
no es tan rpida
como en la
compilacin
tradicional ni
tan lenta como
en la
intepretacin.

-El ejecutable va dirigido


a una plataforma
concreta (una CPU, un
sistema operativo, y
quiz alguna otra
consideracin), siendo
prcticamente imposible
portarlo a otra. En
ocasiones, si existe un
compilador para otra
plataforma, se puede
recompilar el programa,
aunque normalmente
esto plantea serias
dificultades. Los
programas que se van a
compilar suelen estar
muy ligados a la
plataforma de destino.

-No hay ejecutable, as


que si existe un intrprete
para una plataforma
concreta, el programa se
podr ejecutar en ambas.
Tpicamente, los
programas interpretados
son mucho ms portables
que los compilados, ya
que suelen existir
intrpretes del mismo
lenguaje en distintas
plataformas. Los
programas que se van a
interpretar no suelen ser
muy dependientes de su
plataforma de destino,
siendo ms portables.

-El ejecutable va dirigido a una


CPU imaginaria. Se puede
transportar a una plataforma para
la cual exista una "mquina
virtual" (el intrprete de cdigo
intermedio)

-Los lenguajes
compilados suelen
proporcionar al
programador
mecanismos ms
potentes y flexibles, a
costa de una mayor
ligazn a la plataforma.

-Los lenguajes
interpretados no suelen
ser muy dependientes de
la plataforma de destino,
pero en contrapartida
suelen ser menos
flexibles y potentes que
los compilados.

-La plataforma de destino es


virtual. As pues, los programas
son dependientes de esta
plataforma virtual, que es
emulada luego sobre plataformas
reales por la "maquina virtual".

-Una vez compilado el


programa, el cdigo
fuente no es necesario
para ejecutarlo, as que
puede permanecer en
secreto si se desea.

-El cdigo fuente es


necesario en cada
ejecucin, as que no
puede permanecer en
secreto

-El cdigo fuente no es necesario


para la ejecucin, slo el cdigo
intermedio.

-Los errores sintcticos -Los errores sintcticos se -Los errores sintcticos se


se detectan durante la
detectan durante la
detectan durante la compilacin.
compilacin. Si el fuente ejecucin, ya que

contiene errores
sintcticos, el
compilador no producir
un ejecutable.

traduccin y ejecucin se
van haciendo
simultneamente. Algn
error sintctico podra
quedar enmascarado, si
para una ejecucin
concreta no es necesario
traducir la lnea que lo
contiene. (Algunos
intrpretes son capaces de
evitar esto)

-Un programa compilado


puede, por error, afectar
seriamente a la
estabilidad de la
plataforma,
comprometiendo la
ejecucin de los otros
procesos, por ejemplo,
acaparando la CPU, la
memoria o algn otro
recurso, siendo a veces
complicado para el
sistema operativo
interrumpir su ejecucin.

-Un programa
interpretado con un
comportamiento torpe
normalmente puede ser
interrumpido sin
dificultad, ya que su
ejecucin est bajo el
control del intrprete, y
no slo del sistema
operativo.

-Un programa con un


comportamiento torpe es
ejecutado sobre la mquina
virtual, que tiene un control
absoluto sobre l, con lo que no
se suele comprometer la
estabilidad de la plataforma real.

Linker (montador o enlazador): Es el programa


encargado de insertar al programa objeto el cdigo mquina de las
funciones de las libreras (archivos de biblioteca) usadas en el programa y
realizar el proceso de montaje, que producir un programa ejecutable .exe.
Las librerias son una coleccin de cdigo (funciones) ya programado y
traducido a cdigo mquina, listo para utilizar en un programa y que facilita
la labor del programador.

Gramticas de atributos
Una gramtica de atributos es una gramtica libre de
contexto cuyos smbolos pueden tener asociados atributos
y las producciones pueden tener asociadas reglas de
evaluacin de los atributos.

En la creacin de compiladores se utilizan ecuaciones de


atributos o reglas semnticas como mtodo para expresar
la relacin entre el clculo de los atributos y las reglas del
lenguaje.
Cada produccin (regla sintctica) tiene asociada una
accin semntica que se aplica cuando se realiza una
reduccin en el anlisis sintctico ascendente.
Dos notaciones para asociar reglas semnticas con producciones:
Definiciones dirigidas por la sintaxis (DDS) :
Son especificaciones de alto nivel
El usuario no necesita especificar el orden de la traduccin Esquemas de
traduccin (EDT) : Indican el orden en que deben evaluarse las reglas
semnticas
Incluyen detalles de implementacin
Con ambas notaciones se analizan los componentes lxicos, se construye
el rbol sintctico y finalmente se recorre el rbol para evaluar las reglas
semnticas de sus nodos.

Atributo: propiedad de una construccin de un lenguaje.


Pueden variar mucho en cuanto a informacin que contienen o tiempo
que tardan en determinarse durante la traduccin/ejecucin.
Cada smbolo (terminal o no terminal) puede tener asociado un nmero
finito de atributos.
Ejemplos de atributos:
Tipo de una variable
Valor de una expresin

Ubicacin en memoria de una variable


Cdigo objeto de un procedimiento
Nmero de dgitos significativos en un nmero

Fijacin de un atributo: proceso de calcular el valor de un atributo y


asociarlo con una construccin del lenguaje.
Tipos de Atributo por su fijacin:
Esttico: puede fijarse antes de la ejecucin del programa
Ej.: nmero de dgitos significativos (puede tener un valor mnimo)
Dinmico: slo puede fijarse durante la ejecucin del programa
Ej.: valor de una expresin no constante
Los valores de los atributos deben estar asociados con un dominio de
valores.

You might also like