TIPOS DE COMPILADORES

INDICE

Pag. 1. Introducción 2. Tipos de compiladores 3. Características principales Compiladores cruzados Compiladores JIT Compiladores optimizadores Compiladores de una sola pasada Compiladores de varias pasadas Compiladores Incrementales Autocompilador Metacompilador Descompilador HotSpot 4. Referencias 2 2 3 3 4 5 5 6 8 8 8 9 9 10

etc. dejando únicamente al programador del compilador la tarea de programar las acciones semánticas asociadas. por lo que puede haber compiladores que se adscriban a varias categorías: y Compiladores cruzados: generan código para un sistema distinto del que están funcionando. Actualmente existen herramientas que facilitan la tarea de escribir compiladores ó intérpretes informáticos. Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente. especificada normalmente mediante una gramática formal y barata. Una vez que se dispone de un compilador. Compiladores incrementales: generan un código objeto instrucción por instrucción (en vez de hacerlo para todo el programa) cuando el usuario teclea cada orden individual. Compilador con montador: compilador que compila distintos módulos de forma independiente y después es capaz de enlazarlos. se pueden escribir nuevas versiones del compilador (u otros compiladores distintos) en el lenguaje que compila ese compilador. Autocompilador: compilador que está escrito en el mismo lenguaje que va a compilar. Sirve para hacer ampliaciones al lenguaje. 2. Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia. Introducción Los primeros compiladores se realizaron programándolos directamente en lenguaje máquina o en ensamblador. Evidentemente. Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes del código según se necesitan.Ingeniería de Sistemas Compiladores 1. mejorar el código generado. El otro tipo de compiladores requiere que todos los enunciados o instrucciones se compilen conjuntamente. y y y y y y y 2 . Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina. Tipos de compiladores Esta clasificación de los tipos de compiladores no es excluyente. no se puede ejecutar la primera vez. Estas herramientas permiten generar el esqueleto del analizador sintáctico a partir de una definición formal del lenguaje de partida. pero manteniendo la funcionalidad del programa original.

es decir pasa de lenguaje objeto a fuente. En estas situaciones. Esta herramienta es útil cuando quiere compilarse código para una plataforma a la que no se tiene acceso. Normalmente será más cómodo realizar el desarrollo en un PC y luego volcar el código objeto en el dispositivo de destino. Descompilador: Realiza el proceso inverso a la compilación. El sistema operativo Nachos se ejecuta sobre una máquina virtual basada en el procesador MIPS. el compilador que usaremos en el PC es un caso de compilador cruzado.1. Compiladores cruzados. Por ejemplo. Otro ejemplo de un compilador con estas posibilidades es el NASM. El Netwide Assembler o NASM.Ingeniería de Sistemas y Compiladores Metacompilador: es sinónimo de compilador de compiladores y se refiere a un programa que recibe como entrada las especificaciones del lenguaje para el que se desea obtener un compilador y genera como salida el compilador para ese lenguaje. necesitas instalar este compilador. una PDA o una consola de videojuegos. Características principales 3. es un ensamblador libre para la plataforma Intel x86. entre otro formatos. ELF (para sistemas UNIX) y COM (para DOS). y y 3. que puede ensamblar. Funciona sobre prácticamente cualquier versión de Linux. Puede ser usado para escribir programas tanto de 16 bits como de 32 bits (IA32). En el NASM. Los programas de usuario deben estar escritos en código máquina del MIPS. o cuando es incómodo o imposible compilar en dicha plataforma (como en el caso de los sistemas empotrados). no necesitas escribir los programas de usuario en código máquina o en ensamblador. HotSpot: herramienta que incluye un compilador dinámico y una máquina virtual para interpretar los ByteCodes. si se usan las bibliotecas correctas. El compilador cruzado que se distribuye con el Nachos es una versión del popular compilador GCC. Si quieres trabajar en tu propio ordenador. El compilador cruzado que viene con la instalación de Nachos es capaz de traducir de C a código del MIPS. los programas de 32 bits se pueden escribir de una manera tal para que sean portables entre cualquier sistema 3 . Un compilador cruzado (cross compiler) es aquel que genera código ejecutable para una plataforma diferente a aquella en la que se ejecuta. sino que lo puedes hacer en lenguaje C. Afortunadamente. supongamos que queremos desarrollar aplicaciones para un teléfono móvil.

la JVM inicializa el JNI (Java Native Interface) para llamar a las funciones JIT disponibles en la librería en lugar de su función equivalente del intérprete. según se van cargando. ya que hay código que ellos no ven. los compiladores JIT no pueden realizar demasiadas optimizaciones. hay otras partes que deben ser optimizadas. un compilador JIT va trasladando los ByteCodes al código máquina de la plataforma según los va leyendo. Los programas Java invocados con un JIT generalmente se ejecutan más rápido que cuando se ejecutan en bytecodes por el intérprete.2. 3.lang.1 Proceso de compilación en Java ¿Cómo Funcionan los Compiladores JIT? Los compiladores JIT se suministran como librerías nativas dependientes de la plataforma. No obstante. El resultado es que cuando el programa se ejecute. y el compilador JIT no perderá el tiempo en optimizar código que nunca se va a ejecutar. así que aunque siempre son capaces de optimizar la parte de código de inicialización de un programa. Si existe la librería del compilador JIT.Ingeniería de Sistemas Compiladores operativo x86 de 32 bits. con lo cual. hay una cierta cantidad de tiempo que inevitablemente ha de perderse. 4 . habrá partes que no se ejecuten y que no serán compiladas. el NDISASM.Compiler para cargar la librería nativa y empezar la inicialización dentro del compilador JIT. realizando un cierto grado de optimización. Fig. El paquete también incluye un desensamblador. que compilan el código convirtiéndolo a código máquina antes de ejecutarlo. Un JIT es un generador de código que convierte los bytecodes Java en código nativo de la máquina. Se usa la clase java. Un paso adelante en el rendimiento del código Java lo han representado los compiladores Just-In-Time. Compiladores JIT (Just In Time). Es decir.

sintáctico. Reducir el uso de memoria local reutilizando el espacio de una variable muerta.4. Sacar de los lazos las expresiones cuyo valor no cambia en el lazo. realiza modificaciones sobre el código intermedio para mejorar la eficiencia en velocidad y tamaño. Fundir en uno solo el cálculo repetido de la misma expresión. Compiladores de una sola pasada Generan el código máquina a partir de una única lectura del código fuente. Fig. usa un método llamante como especificado en el bloque método del objeto class cargado. es decir. semántico y la generación de código se realizan en una pasada. Una aproximación al manejo de las TS se presenta en la Figura 3. se explora el texto fuente sentencia a sentencia (o bloques de sentencias) realizándose los tres análisis y la generación de código. pero manteniendo la funcionalidad del programa original. 5 . es decir examina el código fuente una vez. donde el análisis léxico. Las versión de Sun chequea el bit de acceso al método por un valor ACC_MACHINE_COMPILED para notificarle al intérprete que el código de este método ya está compilado y almacenado en las clases cargadas.Ingeniería de Sistemas Compiladores Cuando la JVM llama a un método Java. Este tipo de compiladores mejora la eficiencia del programa objeto en ocupación de memoria o en tiempo de ejecución. Compiladores optimizadores Realizan cambios en el código para mejorar su eficiencia.2 Compilación y Ejecución de un programa en Java 3. generando el código o programa objeto. 3. El compilador JIT usa su propio llamante. Entre las funciones que realiza se puede citar: Eliminación de saltos consecutivos Eliminar el cálculo de expresiones cuyo valor no se usa.3.

la tabla de símbolos (TS) se crea durante el análisis léxico y sintáctico (pasada 1). En los compiladores modernos la TS se crea durante el primer recorrido del árbol AST. Compiladores de varias pasadas En un compilador de varias pasadas. una vez creado éste mediante el analizador sintáctico (pasada 2). Cuando un compilador comienza a 6 .5. 3 Compilador de una sola pasada Ventajas del compilador de una pasada Fue fácil de implementar Generaba poca actividad de entrada/salida El código de un procedimiento se compila en memoria y se escribe como una unidad a la memoria secundaria Desventajas Limitaciones en la calidad del código generado Mucha necesidad de memoria 3.Ingeniería de Sistemas Compiladores Fig. tal como el de la Figura 4.

la TS está vacía o contiene unas pocas entradas para las funciones incorporadas (las palabras reservadas habitualmente son almacenadas en una tabla aparte y usadas exclusivamente por el analizador léxico). Según avanza la compilación.4 Compilador de varias pasadas 7 . El analizador léxico separa el programa fuente en tokens que compara con las palabras reservadas. sólo se añade una entrada para cada identificador nuevo. Fig. pero se explora la Tabla una vez por cada nueva aparición de un identificador. el analizador sintáctico introduce dicho símbolo en la TS. Si el token comparado se encuentra en la TS. Si el token comparado no es una palabra reservada se asume que es un identificador y durante el sintáctico (fase sintáctica) se añade a ella.Ingeniería de Sistemas Compiladores traducir un programa fuente. en caso contrario. el analizador sintáctico accede directamente al índice que identifica a dicho identificador reconocido anteriormente.

¶ faltaba en un procedimiento o bloque solo se compila ese bloque. Evidentemente. etc. se compilan solo las modificaciones. por ejemplo.Ingeniería de Sistemas 3. Lo ideal es que solo se recompilen aquellas partes que contenían los errores. en vez de corregir el programa fuente y compilarlo por completo. En general puede hacer a muchos niveles. Sin embargo esto es muy difícil.¶ A nivel de sentencia: Si el µ. y éste se desea mejorar. Autocompilador Compilador que está escrito en el mismo lenguaje que va a compilar. si se nos olvida un µ. de manera que pueda ser compilado por todas esas máquinas diferentes. compilo ese fichero y luego se enlazan todos juntos.7. un compilador incremental puede funcionar a varios niveles: A nivel de carácter : Se recompila el µ. y dé como resultado un compilador más potente de ese mismo lenguaje. El otro tipo de compiladores requiere que todos los enunciados o instrucciones se compilen conjuntamente. y que el código generado se reinserte con cuidado en el OBJ generado cuando se encontraron los errores. el nuevo compilador se escribe con el antiguo. Lo ideal es que se hiciese a nivel de instrucción. pero lo normal es encontrarlo a nivel de fichero. 3.¶ faltaba en la línea 100 sólo se compila la línea 100.8.¶ se genera un OBJ transitorio.6. 3. Es aquel que compila un programa en el que si después se descubren errores. Si se pone el µ. 8 . A nivel de Fichero: Si tenemos 15 ficheros y solo se modifica 1(al que le faltaba el µ. Metacompilador Es un compilador de compiladores y se refiere a un programa que recibe como entrada las especificaciones del lenguaje para el que se desea obtener un compilador y genera como salida el compilador para ese lenguaje. mejorar el código generado. A nivel de bloque: Si el µ. Sirve para hacer ampliaciones al lenguaje. Cuando se extiende entre muchas máquinas diferentes el uso de un compilador.¶ que falta y se recompila. Compiladores incrementales Compiladores Generan un código objeto instrucción por instrucción (en vez de hacerlo para todo el programa) cuando el usuario teclea cada orden individual.¶). no se puede ejecutar la primera vez.

HotSpot La última tendencia en lo que a compilación e intérpretes se refiere.Ingeniería de Sistemas Compiladores Un metacompilador o generador de parsers es una herramienta que. aunque Sun no ha proporcionado muchos detalles sobre este extremo. a partir de la especificación de un lenguaje. una herramienta que incluye un compilador dinámico y una máquina virtual para interpretar los ByteCodes. el profiler mantiene información sobre el rendimiento y selecciona el método sobre el que se va a realizar la compilación. Es una operación casi imposible. ya que existe una bisección entre cada instrucción máquina y cada instrucción ensamblador. en caso de que exista. Cada descompilador trabaja con un lenguaje de alto nivel concreto. porque al código máquina casi siempre se le aplica una optimización. éstos son interpretados en la máquina virtual. sino pseudocódigo (para ejecutarlo a través de un pseudointérprete). etc). Cuando se cargan los ByteCodes producidos por el compilador por primera vez. Descompilador Pasa de un código máquina (o programa de salida) al lenguaje que lo generó (programa fuente). los ByteCodes son reinterpretados. y son los que permiten la construcción del parser. 3. la especificación del lenguaje abarca tanto el aspecto léxico como el sintáctico. 3. en caso contrario. En general. Cuando un método es invocado. para que lo ensamble una vez obtenido el parser. El desarrollo de los metacompiladores se encuentra con la dificultad de unir la generación de código con la parte de análisis. Cuando ya están en ejecución. situada a la izquierda de la página. los conocidos:LEX: generador de analizadores léxicos YACC: generador de analizadores sintácticos. desarrollados para UNIX. y contiene información adicional de ayuda a la depuración de errores (puntos de ruptura. Lo que sí se han desarrollado son generadores de analizadores léxicos y sintácticos. Lo último en que trabaja Sun es HotSpot. También se emplea cuando el compilador original no generó código máquina puro.10. construye un programa o analizador que es capaz de reconocer secuencias o elementos de dicho lenguaje. Los métodos ya compilados se almacenan en un caché en código máquina nativo. esta versión en código máquina nativo es la que se utiliza. Por eso lo que hay suelen ser desensambladores. opciones de visualización de variables. Por ejemplo. mientras que el aspecto semántico del lenguaje se deja en manos del usuario. La función control que muestra el diagrama es como un salto indirecto a través de la memoria que apunta tanto al código máquina como al interpretado. Se utilizan especialmente cuando el código máquina ha sido generado con opciones de depuración. 9 . Los inconvenientes que tienen son que los analizadores que generan no son muy eficientes. tal como se muestra en la figura siguiente.9.

traductores e intérpretes.edu.html 10 .php/Compilador_cruzado http://www. Ravi Sethi y Jeffrey D.es/wiki/index. 5 Estructura del HotSpot Referencias Compiladores. Autores: Ana Mª Corrales Barrios.dis. Jesús Pérez García http://sopa. Compiladores.mx/paginas/JavaTut/froufe/parte2/cap2-5. principios.itapizaco. Autores: Alfred V. técnicas y herramientas. Ullman. Aho.Ingeniería de Sistemas Compiladores Fig.ulpgc.

Sign up to vote on this title
UsefulNot useful