¿El compilador gcc C está escrito en C?

87

¿El compilador gcc C está escrito en C? ¿O está escrito en ensamblado? Si el compilador está escrito en C, ¿cuál es el compilador que se usa para compilar el código del compilador?

euforia83
fuente
12
Sí lo es (en su mayoría). Por supuesto, se necesita un compilador de C para compilar C, por lo que, como ocurre con la mayoría de los compiladores, hay una serie de fases de "correa de arranque". La idea general se cubre en Instalación de GCC: Construcción e instalación de GCC - LFS .
2
Las estaciones de trabajo de diferentes marcas en la década de 1980 y principios de la de 1990 tenían sus propios entornos tipo Unix con compilador c, herramientas, etc., que eran un poco diferentes entre sí. Con la fuente de GCC, podría hacer una compilación inicial de gcc en una de estas plataformas y luego compilar gcc consigo mismo unas cuantas veces para verificar más o menos un punto fijo.
Paul

Respuestas:

98

La historia específica de gcc se proporciona en el Wiki de GCC . El punto más general es que los compiladores generalmente se compilan originalmente con algún otro compilador hasta que son lo suficientemente potentes para compilarse a sí mismos. Alternativamente, es posible escribir un compilador básico que pueda manejar un subconjunto de sus características en ensamblador y construir desde allí. Pero nuevamente, esto ya casi nunca es necesario. Hay muchos compiladores disponibles en una variedad de idiomas. Incluso cuando Stephen Johnson estaba escribiendo pcc (uno de los primeros compiladores de C), había compiladores para B disponibles, junto con muchos otros lenguajes. gcc tenía varios compiladores para elegir para construirlo originalmente, y RMS dice que estaba usando el compilador Pastel al menos durante su desarrollo inicial.

Recuerde, no es necesario que un compilador de C esté escrito en C. Puede escribirlo en Perl si lo desea. No es necesario que un compilador para una plataforma determinada esté escrito originalmente en esa plataforma (los sistemas integrados casi siempre se compilan en algún otro sistema). Así que hay muchas formas de iniciarse.

Esta pregunta tiene algunas sutilezas interesantes relacionadas con la primera instancia de arranque del compilador. Si fueras muy inteligente, podrías hacer uso de ese bootstrap para hacer algo increíble, brillante y aterrador .

Rob Napier
fuente
Vaya, ese segundo artículo al que vinculó es increíblemente inteligente.
Ponkadoodle
1
Gracias por el excelente enlace de arranque. Yo había asumido que los compiladores siempre fueron escritos en lenguajes más simples toda la parte posterior forma de código de máquina para una especie de ello. (Por ejemplo, ¿qué pasa si se da cuenta de que el binario de su compilador contiene un error? Esto proporciona un ejemplo mucho más sólido, por supuesto.) Entonces, ¿cuáles son las ventajas de escribir el compilador en su propio idioma? ¿La gente extremadamente paranoica se preocupa por esto y construye sus compiladores sin "auto" arranque?
RoG
4
Algunos grupos lingüísticos consideran que es una señal de honor poder compilarse a sí mismos. Go hizo recientemente un gran impulso en esta dirección. Swift, por otro lado, notablemente no tiene planes actuales para reescribir su compilador en Swift. Sin embargo, tenga en cuenta que GCC siempre se escribió en C. Simplemente se compiló con otros compiladores. Pero si todos los compiladores de C estuvieran escritos en BCPL, eso no solucionaría nada con respecto a la paranoia. Simplemente hace retroceder el problema un paso. (Obtendría los mismos beneficios de la paranoia con solo compilar GCC w / clang.)
Rob Napier
Tenga en cuenta que gcc tiene una política de que la versión principal de gcc X siempre se puede compilar con la versión principal de gcc X-1, por lo que cualquier característica nueva agregada al compilador en X solo se puede usar en la fuente de gcc en sí desde X + 1. por ejemplo, debería poder compilar cualquier versión de gcc 9, sin importar el número de versión menor, con cualquier gcc 8, nuevamente sin importar cuál sea la versión menor.
Baruch
51

Originalmente estaba escrito en lenguaje ensamblador y luego comenzó a ser comida para perros.

Daniel A. White
fuente
2
No he visto ninguna referencia a RMS usando ensamblador para el bootstrap original. ¿Cuál es tu fuente para eso? Tenía varios otros compiladores con los que empezar, por lo que parece mucho trabajo.
Rob Napier
17
Pensé que el término era bootstrap.
Martin York
7
jajaja Leí esto hace unas semanas y pensé que estabas loco con esa expresión, no me di cuenta de que era estándar. Buen espectáculo señor! en.wikipedia.org/wiki/Eating_your_own_dog_food
3

Si bien esto es obviamente solo un indicador muy aproximado, encontré interesante esta lista rápida en el gcc-5.1.0-src/gcc/directorio. Este directorio contiene las fuentes principales de GCC en sí (excepto las bibliotecas en tiempo de ejecución).

Aquí están los principales recuentos de archivos (más de 100) agrupados por extensión dominados por archivos C y C ++.

    112 .opt
    118 .def
    140 .cc
    185 .x
    250 .exp
    353 .md
    366 .mm
    414 .f
    430 .f03
    521 .m
    625 .a
   1082 .go
   1371 .h
   1602 .ads
   1655 .adb
   1828 .ada
   3860 .f90
  11231 .C        // C++ 
  23811 .c        // C 

Tenga en cuenta que hoy en día se GCCrefiere a la colección de compiladores GNU, no solo al compilador GNU C.

6.3 El subdirectorio gcc

El directorio gcc contiene muchos archivos que forman parte de las fuentes C de GCC, otros archivos utilizados como parte del proceso de configuración y compilación, y subdirectorios que incluyen documentación y un conjunto de pruebas.

Referencia: https://gcc.gnu.org/onlinedocs/gccint/gcc-Directory.html

oo_miguel
fuente