Compiladores e Intérpretes Tarea Final.docx

download Compiladores e Intérpretes Tarea Final.docx

of 13

Transcript of Compiladores e Intérpretes Tarea Final.docx

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 intrpretefacilita 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 compiladorsuele 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 intrpretese ve obligado generalmente a analizar cada instruccin tantas veces como se ejecute (incluso miles o millones de veces).Un intrpretepermite 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 compiladorslo traduce;el intrpretedecodifica y ejecuta.

Compiladores, intrpretes y mquinas virtualesCuando 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 secompilaose 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 llamadasmquinas virtuales.nota: El trminomquina virtualse utiliza en distintos contextos, por ejemplo, productos comoVmWareoVirtualBoxson software que permiten emular un ordenador, con su sistema operativo y sus aplicaciones dentro de otro. A este tipo de aplicaciones se le suele llamarmquinas virtuales de sistema. En ste artculo nos referimos a lasmquinas 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 llamamosfuente. (del inglssource. A menudo se utilizan expresiones comocdigo 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 inglsmachine 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 menudoplataforma.

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 cruzadaEs 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 cruzadaDiferencias 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 deMquina VirtualHemos 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 demquina virtual.Los principales lenguajes abanderados de esta tecnologa son, por un lado, el lenguajeJavade 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 denominacdigo intermedio, o a veces tambinlenguaje intermedio,p-code, obyte-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 lamquina 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 interpretesVeamos 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.CompilarInterpretarMquina 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 traduccin se realiza una sola vez-El proceso de traduccin se realiza en cada ejecucin

-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 se detectan durante la compilacin. Si el fuente contiene errores sintcticos, el compilador no producir un ejecutable.-Los errores sintcticos se detectan durante la ejecucin, ya que 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)-Los errores sintcticos se detectan durante la compilacin.

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