|
|
Este artículo no cita suficientemente sus fuentes (enero 2009). Si conocéis el tema tratado, gracias por indicar los pasajes a sourcer con {{Referencia deseada}} o, mejor, incluez las referencias útiles ligándolas en las notas de bajos de página. (Modificar el artículo)
|
| Error durante la creación de la miniatura : |
Un compilateur es un programa informático que traduce un lenguaje, el lenguaje fuente, en otro, llamado el lenguaje blanco (o lenguaje objeto), que preserva el significado del texto fuente. Esta esquema general descrito un gran número de programas diferentes ; y lo que se siente por « significado del texto fuente » depende » del rol del compilateur. Cuando se habla de compilateur, se supone también general que el lenguaje fuente es, para la aplicación considerada, además elevado nivel que el lenguaje blanco, es decir que presenta un nivel de abstracción superior.
práctico, un compilateur sirve el más a menudo a traducir un código fuente escrita en un lenguaje de programación en otro lenguaje, habitualmente un lenguaje de ensamblaje o un lenguaje máquina. El programa en lenguaje maquina producido por un compilateur es llamado código objeto.
El premier compilateur, TIENE-0 System, ha sido escrito 1951 por Grace Hopper.
Sumario |
La tarea principal de un compilateur es de producir del código objeto correcto. La mayoría de las compilateurs permiten optimiser el código (el código objeto optimisé se ejecutará más rápidamente, o tendrá una ocupación memoria menor).
Un compilateur funciona por análisis-síntesis, es decir que en lugar de reemplazar cada construcción del lenguaje fuente por una continuación equivalente de construcciones del lenguaje blanco, comienza por analizar el texto fuente para construir una representación intermediaria que traduce a su vez en lenguaje blanco.
Es pues natural de separar — al menos conceptuellement, pero también practique — el compilateur en una parte antes (o frontal), a veces llamada « zoco », que lee el texto fuente y produce la representación intermediaria, y una parte posterior (o final), que recorre esta representación para producir el texto blanco. En un compilateur ideal, la parte antes es independiente del lenguaje blanco, mientras la parte posterior es independiente del lenguaje fuente. Ciertos compilateurs efectúan además sobre la forma intermediaria de los tratamientos substantiels, que se puede reagrupar en una parte central, independiente a la vez del lenguaje fuente y de la máquina blanco. Se puede así escribir de los compilateurs para toda una gama de lenguajes y de arquitecturas que comparten la parte central, a la cual se ata una parte antes por lenguaje y una parte posterior por arquitectura.
Las etapas de la compilación incluent :
Cada ficha es una unidad atómica única de la lengua (unidades lexicales o lexèmes), por ejemplo una palabra-llave, identificando o nombre del símbolo. La syntaxe de ficha es generalmente un lenguaje regular, pues un automate a estados acabo construidos a marchar de una expresión regular puede ser utilizado para reconocerlo. Esta fase es llamada también lexing o a balayage, y el software que efectúa un análisis lexicale es llamado un analyseur lexical o un escáner (lex, flex por ejemplos).
Generalmente, la fase de prétraitement se produce antes de que el análisis sintáctico o semántico, por ejemplo en el caso de C, el préprocesseur manipula los símbolos lexicaux antes que de las formas sintácticas.
Esta fase se apoya generalmente sobre un árbol de análisis, que reemplaza la secuencia lineal de fichas con una estructura en árbol construido según las reglas de una gramática formal que define la syntaxe del lenguaje. El árbol de análisis es analizado a menudo, aumentado y transformado por fases más tarde en el compilateur. Yacc Y Bisonte son los analyseurs sintácticos los más utilizados.
Esta fase efectúa comprobaciones semánticas como la comprobación de tipo (comprobación de los errores de tipo), u objeto de conexión (asociando variables y de las referencias de función con sus definiciones), o trata definida (necesitando todas las variables locales tienen que ser inicializadas antes utilización), el vertido de los programas incorrectos o la emisión de advertencias. El análisis semántico necesita habitualmente un árbol de análisis completo, lo que significa que esta fase es la consecuencia lógica de la fase de análisis, y precede lógicamente la fase de generación de código, pero es a menudo posible de replegar las fases múltiples en una pasa sobre el código en una apuesta œuvre de compilateur.
El objetivo de esta fase es de generar un código reducido, permitidas por de las pasas de compilación que se greffent por encima un compilateur existente. Es una propiedad de investigación continua !
Estas diferentes etapas explican que las compilateurs hagan siempre el objeto de investigaciones, particularmente en la propiedad de la optimización del código producido.
La mayoría (pero no todos) de los compilateurs traducen un fichero fuente de un programa escrito en un lenguaje de programación en un fichero objeto (o un exécutable, o un fichero en assembleur, o mismo en otro lenguaje).
Una implementación (realización concreta) de un lenguaje de programación puede ser interpretada o compilée. Es esta realización que es un compilateur o un interpréteur, y un lenguaje de programación (especificación más o menos teórica y formalizada de su syntaxe y de su semántica) puede tener una implementación compilée, y otra interpretada.
La calidad más de entidad es por supuesto de obtener el « cero bug », es pues la confianza. Luego, hay el hecho que el código generado tiene que ser rápido : es el optimalité. El compilateur le-mismo tiene que ser rápido : la eficacia. El compilateur tiene que ser compatible sobre varios plateformes : la portabilité. Los errores señalados tengan que ser utilizadas : la productividad.
La clasificación de las compilateurs por número de pases tiene para origen la carencia de recursos materiales de los computadores. La compilación es un proceso couteux y los primeros computadores no habían bastante de memoria para contener un programa que tenía que hacer este trabajo. Los compilateurs tienen pues sido divididos bajo programas que hacen cada uno una pasa sobre la fuente (de una forma o de otra) para cumplir las diferentes fases de análisis lexicale, de análisis sintáctico y de análisis semántico.
La capacidad de combinar el todo en un solo pasaje ha sido considerado como una ventaja porque simplifica la tarea de escribir de un compilateur y él compile generalmente más rápidamente que un compilateur multi pasa. Así, alimentada en parte por recursos limitados de los primeros sistemas, de numerosos lenguajes han sido específicamente concebidos con el fin de que puedan ser compilés en un solo pasaje (por ejemplo, el lenguaje Pascal).
En ciertos casos, la concepción de una funcionalidad de lenguaje tiene necesidad de un compilateur para efectuar más de una pasa sobre la fuente. Por ejemplo, consideramos una declaración que figura en la línea 20 de la fuente que afecta la traducción de una declaración que figura en la línea 10. En este caso, la primera pasa tiene que recoger informaciones sobre las declaraciones que figuran después de las declaraciones que afectan, con la traducción propiamente dicha que se efectúa durante un pasaje ultérieur.
El inconveniente de la compilación en un solo pasaje, es que no es posible de ejecutar la mayoría de las optimizaciones sophistiquées necesarias para generar del código de elevada calidad. Él puede ser difícil de dénombrer exactamente el número de pasas que un compilateur optimisant efectúa.
El fractionnement de un compilateur pequeños programas es una técnica utilizada por los investigadores interesados a producir de los compilateurs eficientes. Probar la exactitud de una serie de pequeños programas necesita a menudo menos de esfuerzo que de probar la exactitud de un plus grande programa único equivalente.
Un compilateur cruzado ( inglés Cross Compiler) es un programa capaz de traducir un código fuente en código objeto que tiene un medio ambiente de fusilamiento (arquitectura material, sistema de aprovechamiento) diferente de aquel donde la compilación es efectuada. Estos compilateurs son utilizados principalmente informático industrial.
Ciertos compilateurs traducen un lenguaje fuente en lenguaje maquina virtual, es decir en un código (generalmente una continuación de octets) ejecutado por una máquina virtual : un programa émulant las principales funcionalidades de un computador. El portage de un programa no requiere así como el portage de la máquina virtual. Es el caso del compilateur Java, que traduce del código Java bytecode Java (código objeto). Una máquina virtual DotNet puede ejecutar del bytecode MSIL producto por los lenguajes de Microsoft C#, Visual Basic o demás.
Si la mayoría de las compilateurs traducen un código de un lenguaje de programación hacia otro, este no es el caso de todos los compilateurs. Por ejemplo, el software LaTeX compile un código escrito en el lenguaje de formatage de texto LaTeX, para convertirlo en otro lenguaje, por ejemplo DVI, HTML, PostScript...
Ciertos compilateurs traducen, de modo incrémentale o interactiva, el programa fuente (pegado por el usuario) del código máquina. Por ejemplo, ciertas implementaciones de Common Lisp (como SBCL) traduzcan un extremo de programa del código maquina (en memoria).
Los compilateurs Just In Time (justo a tiempo) traduzcan una representación intermediaria (a menudo del código octet) del código maquina, de manera progresiva.
Los premiers compilateurs eran escritos directamente en lenguaje assembleur, un lenguaje simbólico elemental que corresponde en las instrucciones del processeur blanco y algunas estructuras de control ligeramente más evolucionadas. Este lenguaje simbólico tiene que ser assemblé (y no compilé) y ligado para obtener una versión exécutable. Debido a su sencillez, un programa mero bastado a convertirlo en instrucciones máquinas.
Los compilateurs actuales son escritos generalmente en el lenguaje que tienen que compiler ; por ejemplo un compilateur C es escrito C, SmallTalk SmallTalk, Lisp Lisp, etc. En la realización de un compilateur, una etapa decisiva es superada cuando el compilateur para el lenguaje X es suficientemente completo para se compiler le-mismo : no depende entonces más de otro lenguaje (estuvo-este del assembleur) para ser producido.
Los bugs de los compilateurs son a veces muy complejos a detectar. Si un compilateur de lenguaje C comporta un bug, los programmeurs en lenguaje C habrán naturalmente tendencia a poner en entredicho su propio código fuente, no no el compilateur.
Peor, si esto compilateur buggé (versión V1) compile un compilateur (versión V2) no buggé, el exécutable compilé (por V1) del compilateur V2 será buggé. Sin embargo su código fuente es buena. El bootstrap obliga pues los programmeurs de compilateurs a rodear los bugs de los compilateurs existentes.