Esto ha me ha estado molestando por un tiempo. ¿Cómo GCC y g++ compila a sí mismos?

Supongo que cada revisión se compila con una previamente construido revisión. ¿Es esto cierto? Y si es así, significa que el mayor de g++ y GCC versiones fueron escritas en la asamblea?

  • Cada revisión, finalmente, puede ser compilado por sí mismo. 🙂
  • Este es muy interesante de leer, si desea ver cómo los primeros compiladores se produjo.
  • Es el enlace de muertos?
InformationsquelleAutor user1010005 | 2012-02-24

1 Comentario

  1. 173

    La más antigua versión de GCC fue compilado utilizando otro compilador de C, ya que hubo otros que cuando fue escrito. El primer compilador de C de siempre (ca. 1973, si mal no recuerdo) fue implementado, ya sea en PDP-11 de la asamblea, o en la B lenguaje de programación que lo precedió, pero en cualquier caso la B compilador fue escrito en la asamblea. del mismo modo, el primer compilador de C++ (CPre/Cfront, 1979-1983) fueron probablemente el primero implementado en C, luego reescrito en C++.

    Al compilar GCC o cualquier otro tipo de auto-hosting compilador, el orden completo de construcción es:

    1. Construir la nueva versión de GCC con las compilador de C
    2. re-construir la nueva versión de GCC con la recién construida
    3. (opcional) repita el paso 2 para fines de verificación.

    Este proceso se llama bootstrapping. Comprueba que el compilador de la capacidad de elaboración de sí mismo y se asegura de que el resultado del compilador está construido con todas las optimizaciones que a su vez implementa.

    EDITAR: Drew Dormann, en los comentarios, los puntos a Bjarne Stroustrup de la cuenta de la primera aplicación de C++. Fue implementado en C++, pero traducido por qué Stroustrup llama un «preprocesador» de C++ a C; no un compilador completa de acuerdo a su definición, pero todavía C++ fue bootstrap en C.

    • No es el paso 2 normalmente repetido un par de veces? Creo clang hace.
    • No veo por qué no, excepto para las pruebas. Suponiendo que el inicial compilador implementa el lenguaje correctamente, se construye una correcta aunque tal vez subóptima compilador, mientras que con el paso 2 de implementar todas las optimizaciones que el nuevo compilador tiene. El final binario no debe cambiar después del paso 2.
    • Los 3 pasos de la versión de los archivos de inicio de proceso de compilación es, de hecho, para la verificación: el propio compilador se utiliza como su propio caso de prueba. GCC compila con [otros] debe producir los mismos resultados (idéntico binarios, descontando las macros como __DATE__ y __TIME__ que varían incluso entre las invocaciones de la mismo compilador) como GCC compila con [GCC compila con [otras]] – si no, eso es un error, y el 3-etapa de bootstrap construir está diseñado para detectar eso.
    • no, eso es un error» o, menos probable, un retorcido backdoor en el proceso de introducción («Reflexiones sobre la Confianza de Confianza»).
    • En realidad, los archivos binarios también podría variar debido a la generación de código se ha mejorado (por ejemplo, una mejor optimización). Así que en general los archivos binarios no tiene que ser idéntica.
    • Ellos deberían converger, sin embargo. A menos que llegar a La Singularidad 🙂
    • eso no es cierto. El binario de salida de la etapa 2 debe ser idéntica a la de la salida binaria del paso 3, de lo contrario hay un error en alguna parte. La razón es como pmjordan dice: NewCompiler1 y NewCompiler2 son programas con idéntico origen (de NewCompiler). Ellos son idénticas dadas de entrada (la fuente de NewCompiler). Por lo tanto, que producirán idénticos salida no importa lo que el compilador de ellos mismos fueron compilados con (en este caso, NewCompiler1 fue compilado con OldCompiler, y NewCompiler2 fue compilado con NewCompiler1). Es decir, NewCompiler2 y NewCompiler3 son binarios idénticos.
    • Lo siento, mi error. Por supuesto, la salida del paso 1 y el paso 2 anterior puede ser diferente, pero 2 y 3 debe generar el mismo GCC binario.
    • Yo alguna vez me pregunté: ¿Qué si hemos perdido todas las compilador de C binarios? Y había para arrancar desde cero? Esto es cómo me gustaría ir sobre esto: Hay el Pequeño Compilador de C (que en realidad puede compilar el kernel de Linux, por lo que es muy característica completa). Todo es de código fuente en C archivos de hacer una mera 30k líneas de código, incluyendo los comentarios. A pesar de que aún era bastante esfuerzo, alguien que entiende C puede aprender de las fuentes, cómo generar binarios de salida y la de «compilar» la TCC fuentes de mano (en realidad, el pensamiento de tarjetas perforadas aquí). A continuación, vuelva a compilar TCC con eso y usarlo para arrancar GCC o similar.
    • algo así, sí. Si podemos asumir que hemos perdido todos el compilador de C de los binarios, pero todavía tenemos un ensamblador, entonces podríamos escribir un programa ensamblador TinyTinyC. Sería menos características completas, el compilador de C de TinyC: no lo necesitamos para poder compilar GCC o el kernel de linux, solo nos falta para ser capaz de compilar TinyC. A continuación, se ejecuta en el origen de TinyC, que nos da un compilador de C capaz de compilar Linux (y esperemos que glibc y GCC) y estamos en el negocio. Si ni siquiera tenemos un ensamblador, tendríamos primero bootstrap uno de esos, es más fácil que un compilador de C.
    • Si TCC no se puede compilar GCC me gustaría probar PCC como un intermediario.
    • Yo no soy probablemente el único friki que escribió su propia máquina virtual y un compilador para ello. No que disco duro.
    • Es muy improbable que hemos perdido todas las compilador de C binarios. Aún tengo varios Linux Distrubtions en Dvd en casa, el Cd de Visual Studio, etc. Todo lo que necesita es sólo una copia de trabajo de un compilador de C para arrancar el resto.
    • ¿Y si todas las plantas de energía en el mundo explotar a la vez?
    • El arranque está fresco. ¿Cómo hacer una superficie plana, sin una superficie plana? ¿Cómo conseguir que las herramientas de máquina en un mundo sin máquinas herramientas? Cómo hacer chips de 32 nm en un mundo sin trabajo chips? Hacer que los vehículos sin vehículos? Todas estas cosas se construyen en las generaciones anteriores.
    • Tendríamos más graves problemas que volver a compilar GCC si eso hubiera ocurrido, ¿no?
    • No.
    • Como su enlace de Wikipedia (y Stroustrop) describir, el primer compilador de C++ fue escrito en C++, no C. En ese momento, ya hay una herramienta que ayudara a convertir código fuente de C++ a C fuente, haciendo que este pollo/huevo escenario posible.
    • pero entonces ¿cómo se llama la herramienta que compila en C++ de código fuente de C? Y lo que fue escrito originalmente en? (Se podría decir C con Clases, pero considero que el engaño 🙂
    • Desde la boca del caballo: escribió un preprocesador en C que se convierten C Con Clases de fuente de C de origen. Luego escribió un compilador en C++ que aparentemente no choke que preprocesador. www2.research.att.com/~bs/bs_faq.html#bootstrap
    • Creo que este es un asunto de definición (compilador/traductor/preprocesador), pero he modificado la respuesta de todos modos. Gracias por el enlace.
    • Estoy completamente de acuerdo. Yo no soy maestro de la semántica, así que con cautela se refieren a Stroustrup cuenta propia. Voy a tomar su palabra para ella.
    • ¿Por qué se encuentra en la etapa 3 se necesita? ¿Cómo puede la etapa 2 y 3 diferir (excepto para __TIME__ de curso, que no debe importar)?
    • Imagina el caso de una puerta trasera de la etapa 1 del compilador (GCC, no el que está haciendo el bootstrap) reconoce un comentario de «//KeywordChecks» que aparece justo antes de una serie de if-elseif declaraciones, por lo que agrega en un pedazo de instrucciones para el recién construido binario que se reconoce «//BADCODE» como una palabra clave y si se encuentra inserta un fragmento de las instrucciones que se hace tortuosa cosas. Ahora su etapa 2 compilador reconoce «//BADCODE» que la etapa 1 compilador no. Así que al volver a compilar sí mismo en el paso 3, si «//BADCODE» es un comentario, luego de la etapa 2 y 3 serán diferentes.

Dejar respuesta

Please enter your comment!
Please enter your name here