Un recopilador es un programa de computadora (o sistema de programas) que traduce el texto escrito en un lenguaje de programación (la lengua orígen del ) en otro lenguaje de programación (la lengua objetivo del ). La secuencia original generalmente se llama el código fuente y la salida llamada el código de objeto . La salida tiene comúnmente una forma conveniente para procesar por otros programas (e., una máquina para hacer chorizos ), pero puede ser un archivo de texto legible .

La razón más común del querer traducir código fuente es crear un programa ejecutable . El " conocido; compiler" se utiliza sobre todo para los programas que traducen código fuente de un lenguaje el de programación de alto nivel a una lengua de nivel inferior (e., de lenguaje de ensamblaje o en lenguaje de máquina). Un programa que traduce de una lenguaje de bajo nivel de alto nivel es un Decompiler del . Un programa que traduce entre los idiomas de alto nivel generalmente se llama un traductor de la lengua del, fuente del al traductor de la fuente, o el convertidor de la lengua del . Un rewriter de la lengua del es generalmente un programa que traduce la forma de expresiones sin un cambio de la lengua.

Un recopilador es probable realizar muchos o todas las operaciones de siguiente: Análisis léxico, proceso previo, que analiza, análisis semántico, generación del código, y optimización del código.

Historia

El software para las computadoras tempranas fue escrito exclusivamente en de lenguaje de ensamblaje durante muchos años. Los lenguajes de programación de alto nivel no fueron inventados hasta que las ventajas de poder reutilizar software en diversas clases de las CPU comenzaran a llegar a ser perceptiblemente mayores que el coste de escribir un recopilador. La capacidad muy limitada de la memoria de computadoras tempranas también creó muchos problemas técnicos al ejecutar un recopilador.

Hacia el final de los años 50, los lenguajes de programación independientes de la máquina primero fueron propuestos. Posteriormente, varios recopiladores experimentales fueron desarrollados. El primer recopilador fue escrito por la tolva de la tolerancia, en 1952, para el lenguaje de programación A-0. ¡El FORTRAN acreditan el equipo llevado por el Juan Backus en el IBM generalmente como siendo introducido el primer recopilador completo, en 1957. COBOL era una lengua temprana que se compilará en arquitecturas múltiples, en 1960.

En muchos dominios del uso la idea de usar una lengua de alto nivel alcanzó gran popularidad rápidamente. Debido a la funcionalidad de extensión apoyada por los lenguajes de programación de un más nuevo y la complejidad cada vez mayor de las arquitecturas de computadora, los recopiladores tienen cada vez más convertido complejo.

Los recopiladores tempranos fueron escritos en de lenguaje de ensamblaje. El &mdash de Uno mismo-recibimiento del recopilador del primer del ; capaz de compilar su propio código fuente en un &mdash del idioma de alto nivel; fue creado para el balbucean de Hart y Levin en MIT en 1962. Desde los años 70 tiene práctica común convertida de ejecutar un recopilador en la lengua que compila, aunque el Pascal y el C hayan sido opciones populares para la lengua de puesta en práctica. La construcción de un recopilador de uno mismo-recibimiento es un que ata problema de con correa -- el primer tal recopilador para una lengua se debe compilar por un recopilador escrito en una diversa lengua, o (como en ciervo y Levin balbucea el recopilador) compilado funcionando con el recopilador en un intérprete .

Recopiladores en la educación

La optimización de la construcción del recopilador y de recopilador se enseña en las universidades como parte del plan de estudios de informática . Tales cursos se complementan generalmente con la puesta en práctica de un recopilador para un lenguaje de programación educativo . Un ejemplo bien documentado es recopilador PL/0 de s de Wirth Niklaus ', que Wirth usado para enseñar a la construcción del recopilador en los años 70. A pesar de su simplicidad, el recopilador PL/0 introdujo varios conceptos influyentes al campo: Desarrollo de programa del

por el

  • del refinamiento de manera gradual (también el título de un papel 1971 de Wirth) El uso de un
  • recurrente del programa de análisis de la pendiente El uso EBNF de especificar el sintaxis de un
  • de la lengua Un generador de código produciendo el
  • portable del P-código El uso de los T-diagramas en la descripción formal que ata el problema de con correa

    Salida del recopilador

    Un método usado para clasificar recopiladores está al lado de la plataforma en la cual el código generado que producen ejecuta. Esto se conoce como la plataforma de la blanco. Un nativo o el recopilador recibido de es uno cuya salida se piensa para funcionar directo en el mismo tipo de computadora y de sistema operativo que el recopilador sí mismo funciona con encendido. La salida de un compilador cruzado se diseña para funcionar en una diversa plataforma. Los compiladores cruzados son de uso frecuente cuando el software que se convertía para el encajó los sistemas que no se piensan para apoyar un entorno de desarrollo del software.

    La salida de un recopilador que produce el código por máquina virtual un (VM) los mayo o mayo para no ser ejecutado en la misma plataforma que el recopilador que la produjo. Por esta razón tales recopiladores no se clasifican generalmente como natural o compiladores cruzados.

    Compilado contra idiomas interpretadas

    Los lenguajes de programación de alto nivel se dividen generalmente para la conveniencia en las idiomas compiladas y las idiomas interpretadas sin embargo, allí son raramente cualquier cosa sobre una lengua que el requiere él ser compilado exclusivamente, o interpretado exclusivamente. La clasificación refleja generalmente las puestas en práctica más populares o más extensas de un &mdash de la lengua; por ejemplo, el BASIC se piensa en como lengua interpretada, y C compilada, a pesar de la existencia de los recopiladores del BASIC y de los intérpretes de C.

    En cierto modo, el todas las idiomas de se interpreta, con el " execution" el ser simplemente un caso especial de la interpretación se realizó por la conmutación de los transistores en una CPU . Las tendencias modernas hacia la compilación justo a tiempo y la interpretación del bytecode también empañan las clasificaciones tradicionales. Algunas especificaciones de la lengua explican que el de las puestas en práctica debe incluir una facilidad de la compilación; por ejemplo, el campo común balbucea . Otras idiomas tienen características que sean muy fáciles de ejecutar en un intérprete, pero hacen la escritura de un recopilador mucho más difícilmente; por ejemplo, el APL, el SNOBOL4, y muchas idiomas scripting permiten que los programas construyan código fuente arbitrario en el tiempo de pasada con operaciones regulares de la secuencia, y después ejecutan ese código pasándolo a una función de evaluación especial. Para ejecutar estas características en una lengua compilada, los programas se deben enviar generalmente con una biblioteca Runtime que incluya una versión del recopilador sí mismo.

    Compilación del hardware

    La salida de algunos recopiladores puede apuntar el hardware en un muy bajo. Por ejemplo un arsenal de puerta programable del campo (FPGA) o circuito integrado específico a la aplicación estructurado (ASIC). Tales recopiladores reputan los recopiladores del hardware 'o las herramientas de la síntesis porque los programas ellos compilan con eficacia control la configuración final del hardware y cómo funciona; no hay instrucciones que se ejecutan en orden - solamente una interconexión de transistores o de tablas de operaciones de búsqueda. Por ejemplo, XST es la herramienta de la síntesis de Xilinx usada para configurar FPGAs. Las herramientas similares están disponibles de Altera, de Synplicity, de Synopsys y de otros proveedores.

    Diseño del recopilador

    El acercamiento llevado el recopilador que el diseño es afectado por la complejidad del proceso ese necesita ser hecho, la experiencia de las personas que la diseñan, y los recursos (eg., gente y las herramientas) disponibles.

    Un recopilador para una lengua relativamente simple escrita por una persona pudo ser un pedazo de software solo, monolítico. Cuando la lengua orígen es grande y la salida compleja, y de la alta calidad se requiere el diseño se puede partir en un número de fases relativamente independientes, o pasos. Tener desarrollo separado de los medios de las fases se puede empaquetar para arriba en pequeñas piezas y dar a diversa gente. También llega a ser mucho más fácil substituir una monofásico por mejorada, o insertar nuevas fases más adelante (eg., optimizaciones adicionales).

    La división de los procesos de la compilación en fases (o pasos) fue defendida por el proyecto (PQCC) del Recopilador-Recopilador de la calidad de la producción en la universidad del Carnegie Mellon . Este proyecto introdujo las partes frontales del de los términos, el extremo medio del (oído raramente hoy), y el extremo trasero del .

    Todos pero el más pequeños de recopiladores tienen más de dos fases. Sin embargo, estas fases se miran generalmente como siendo parte de las partes frontales o del extremo trasero. El punto en donde estos dos está siempre abierta la reunión de los finales del al discusión. Las partes frontales se consideran generalmente ser donde ocurre el proceso sintáctico y semántico, junto con la traducción a un nivel inferior de la representación (que código fuente).

    El extremo medio se diseña generalmente para realizar optimizaciones en una forma con excepción del código fuente o del código automático. Esta independencia del código fuente/del código automático se piensa para permitir a optimizaciones genéricas ser compartido entre las versiones del recopilador que apoya diversas idiomas y de los procesadores de la blanco.

    El extremo trasero toma la salida del centro. Puede realizar más análisis, transformaciones y optimizaciones que estén para una computadora particular. Entonces, genera el código para un procesador y un OS particulares.

    Este acercamiento anticipado/del centro/de la parte permite combinar las partes frontales para diversas idiomas con los extremos traseros para diversas CPU que los ejemplos prácticos de este acercamiento son la colección del recopilador del GNU, LLVM, y el kit del recopilador de Amsterdam, que tienen delantero-fines múltiples, análisis compartido y el múltiplo se centraliza.

    De un paso contra recopiladores de pasos múltiples

    Clasificar recopiladores por el número de pasos tiene su fondo en las limitaciones del recurso de hardware de computadoras. La compilación implica el realizar de porciones de trabajo y las computadoras tempranas no tenían bastante memoria para contener un programa que hizo todo este trabajo. Los recopiladores fueron divididos tan en programas más pequeños que cada uno hizo un paso sobre la fuente (o una cierta representación de ella) que realizaba algunas del análisis y de las traducciones required.

    La capacidad de compilar en un solo paso se considera a menudo como ventaja porque simplifica el trabajo de escribir un recopilador y los recopiladores de un paso son generalmente más rápidos que los recopiladores de pasos múltiples muchas idiomas fueron diseñados de modo que pudieran ser compilados en un solo paso (e.

    El diseño de una característica de lengua puede requerir en algunos casos a un recopilador realizar más de un paso sobre la fuente. Por ejemplo, considerar una declaración que aparece en la línea 20 de la fuente que afecta a la traducción de una declaración que aparece en la línea 10. en este caso, las primeras necesidades del paso de recopilar la información sobre las declaraciones que aparecen después de declaraciones que ella afecta, con la traducción real sucediendo durante un paso subsecuente.

    La desventaja de la compilación en un solo paso es que no es posible realizar muchas de las optimizaciones sofisticadas necesarias para generar código de la alta calidad. Puede ser difícil contar exactamente cuántos pasos un recopilador de optimización hace. Por ejemplo, diversas fases de optimización pueden analizar una expresión muchas veces pero analizar solamente otra expresión una vez.

    Partir un recopilador para arriba en pequeños programas es una técnica usada por los investigadores interesados en producir recopiladores demostrable correctos. Probar la corrección de un sistema de pequeños programas requiere a menudo menos esfuerzo que probando la corrección de un programa más grande, solo, equivalente.

    Mientras que el recopilador de pasos múltiples típico hace salir el código automático de su paso final, hay varios otros tipos:
    " del

    A; " del recopilador de la Fuente-a-fuente; es un tipo de recopilador que tome un idioma de alto nivel como su entrada y salidas un idioma de alto nivel. Por ejemplo, un recopilador que hace parelelismo automático admitirá un programa del idioma de alto nivel pues una entrada y entonces transforma el código y lo anota con frecuencia con las anotaciones paralelas del código (e. OpenMP ) o las construcciones de lengua (e. declaraciones de DOALL del FORTRAN).
    Recopilador de la etapa que compila a de lenguaje de ensamblaje de una máquina teórica, como algunas puestas en práctica del prólogo

  • Esta máquina del prólogo también se conoce como la máquina abstracta (o WAM) de Warren. Los recopiladores de Bytecode para Java, el pitón, y mucho más son también un subtipo de esto.
    Recopilador justo a tiempo, usado por los sistemas de Smalltalk y de Java, y también por Microsoft. Lengua intermedia común (CIL) de la red Los usos se entregan en el Bytecode, que se compila al código automático nativo apenas antes de la ejecución.

    Partes frontales

    Las partes frontales analizan el código fuente para construir una representación interna del programa, llamada el la representación intermedia o el IR . También manejan la tabla de símbolo, una estructura de datos que traza cada símbolo en el código fuente a la información asociada tal como localización, el tipo y el alcance. El se hace durante varias fases, que incluye algo del siguiente: línea reconstrucción del

    . Las idiomas que el suavizador sus palabras claves o permiten espacios arbitrarios dentro de identificadores requieren una fase antes de analizar, que convierte la secuencia del carácter de la entrada a una forma canónica lista para el programa de análisis. El de arriba hacia abajo, recurrente-pendiente, los programas de análisis table-driven usados en los años 60 leyó típicamente el carácter de la fuente una a la vez y no requirió una fase tokenizing separada. El código automático del atlas, y el Imp (y algunas puestas en práctica de ALGOL y Coral66 ) son ejemplos de las idiomas stropped cuyos recopiladores tendrían una línea fase del de la reconstrucción .

  • El análisis léxico rompe el texto del código fuente en los pequeños pedazos llamados los símbolos del . Cada símbolo es una sola unidad atómica de la lengua, por ejemplo una palabra clave, identificador o nombre del símbolo. El sintaxis simbólico es típicamente una lengua regular, así que un autómata finito del estado construido de una expresión regular se puede utilizar para reconocerla. Esta fase también se llama el lexing o exploración, y el software que hace análisis léxico se llama un analizador léxico o explorador.
  • Proceso previo ., C, requieren una fase del proceso previo que apoye la substitución macra y la compilación condicional. La fase del proceso previo ocurre típicamente antes de análisis sintáctico o semántico; e. en el caso de C, el preprocesador manipula símbolos léxicos algo que formas sintácticas. Sin embargo, algunas idiomas tales como esquema apoyan las substituciones macras basadas en formas sintácticas.
  • El análisis de sintaxis implica el que analiza la secuencia simbólica para identificar la estructura sintáctica del programa. Esta fase construye típicamente un analiza el árbol, que substituye la secuencia linear de símbolos por una estructura arborescente construida según las reglas de una gramática formal que definen el sintaxis de la lengua. El árbol de análisis se analiza, se aumenta, y se transforma a menudo por fases posteriores en el recopilador.
  • El análisis semántico es la fase en la cual el recopilador agrega la información semántica al analiza el árbol y construye la tabla de símbolo. Esta fase realiza cheques semánticos tales como tipo comprobación (que comprueba para saber si hay tipo errores), o el objeto que ata (asociando referencias de la variable y de función a sus definiciones), o la asignación definida (requiriendo todas las variables locales ser inicializado antes de usar), rechazando programas incorrectos o publicando advertencias. El análisis semántico requiere generalmente un completo analiza el árbol, significando que esta fase sigue lógicamente el que analiza fase de, y precede lógicamente la fase de la generación del código, aunque es a menudo posible doblar fases múltiples en un paso sobre el código en una puesta en práctica del recopilador.

    Extremo trasero

    El extremo trasero término se confunde a veces con el generador de código debido a la funcionalidad traslapada de generar código de la asamblea. Un poco de literatura utiliza el extremo medio del para distinguir las fases genéricas del análisis y de la optimización en el extremo trasero de los generadores de código máquina-dependientes.

    Las fases principales del extremo trasero incluyen el siguiente: análisis : Ésta es la reunión de la información del programa de la representación intermedia derivada de la entrada. Los análisis típicos son el análisis de flujo de datos para construir el Utilizar-definen el análisis de la dependencia de las cadenas, el análisis alias, el análisis del indicador, el análisis exacto del análisis etc. del escape son la base para cualquier optimización de recopilador. El gráfico de la llamada y el gráfico de flujo de control generalmente también se construyen durante la fase de análisis.

  • Optimización : la representación de lengua intermedia se transforma en formas funcionalmente equivalentes pero más rápidas (o más pequeñas). Las optimizaciones populares son la extensión en línea, la eliminación muerta del código, la propagación constante, la transformación del lazo, la asignación del registro o aún la paralelización automática .
  • Generación del código: la lengua intermedia transformada se traduce a la lengua de la salida, generalmente el nativo en lenguaje de máquina del sistema. Esto implica decisiones del recurso y del almacenaje, tales como decidir a qué variables a caber en los registros y memoria y la selección y la previsión de las instrucciones de máquina apropiadas junto con sus modos de dirección asociados (véase también el algoritmo de Sethi-Ullman).

    El análisis del recopilador es el requisito previo para cualquier optimización de recopilador, y trabajan firmemente juntos. Por ejemplo, el análisis de la dependencia es crucial para la transformación del lazo.

    Además, el alcance del análisis del recopilador y las optimizaciones varían grandemente, de tan pequeño como un bloque básico al nivel del procedimiento/de la función, o aún sobre el programa entero (optimización de Interprocedural). Obviamente, un recopilador puede potencialmente hacer un mejor trabajo usar una visión de conjunto. Pero esa visión de conjunto no está libre: el análisis y las optimizaciones grandes del alcance son muy costosos en términos de memoria del tiempo y de compilación; esto es especialmente verdad para el análisis y las optimizaciones interprocedural.

    La existencia del análisis y de las optimizaciones interprocedural es común en recopiladores comerciales modernos de HP, IBM, SGI, Intel, Microsoft, y Sun Microsystems . El GCC de la fuente abierta fue criticado durante mucho tiempo para carecer optimizaciones interprocedural de gran alcance, pero está cambiando a este respecto. Otro buen recopilador de la fuente abierta con análisis e infraestructura completos de la optimización es el Open64, que es utilizado por muchas organizaciones para la investigación y los propósitos comerciales.

    Debido al tiempo extra y al espacio necesitó para el análisis del recopilador y las optimizaciones, algunos recopiladores los saltan por abandono. Los usuarios tienen que utilizar opciones de la compilación explícitamente para decir al recopilador qué optimizaciones deben ser permitidas.

    Técnicas relacionadas

    El de lenguaje de ensamblaje no es un idioma de alto nivel y un programa que lo compila se conoce más comunmente como ensamblador del, con el programa inverso conocido como desensamblador .

    Un programa que traduce de una lenguaje de bajo nivel de alto nivel es un Decompiler del .

    Un programa que traduce entre los idiomas de alto nivel generalmente se llama un traductor de la lengua del, fuente del al traductor de la fuente, el convertidor de la lengua del, o el rewriter de la lengua del . El último período se aplica generalmente a las traducciones que no implican un cambio de la lengua.

    Ver también


    lista los recopiladores
    Interpretación abstracta
    Análisis ascendente
    Gramática de cualidad
    Codificación de la semántica
    Avalancha del error
    Metacompilation
    Compilación justo a tiempo
    Lista de publicaciones importantes en los #Compilers de informática
  • .

  • Zenithic
  • Colchester Zoo
    Random links:Marie, Arkansas | Plainville, Massachusetts | Lista de mnemónicas | Jack Daniels (político)

  • © 2007-2008 enciclopediaespana.com; article text available under the terms of GFDL, from en.wikipedia.org
    ="http://pagead2.googlesyndication.com/pagead/show_ads.js">