Il compilatore gcc C è scritto in C stesso?


87

Il compilatore gcc C è scritto in C stesso? O è scritto in Assembly? Se il compilatore è scritto in C, qual è il compilatore utilizzato per compilare il codice del compilatore?


12
Sì, lo è (principalmente). Naturalmente, è necessario un compilatore C per compilare C quindi, come con la maggior parte dei compilatori, ci sono una serie di fasi di "boot-strap". L'idea generale è trattata in Installazione di GCC: creazione e installazione di GCC - LFS .

2
Diverse workstation di marca negli anni '80 e all'inizio degli anni '90 avevano i propri ambienti unix-like con compilatore c, strumenti, ecc ... che erano tutti un po 'diversi l'uno dall'altro. Con il sorgente GCC si potrebbe fare una compilazione iniziale di gcc su una di queste piattaforme, e poi compilare gcc con se stesso alcune volte per verificare più o meno un punto fisso.
Paul

Risposte:


98

La cronologia specifica di gcc è fornita nel Wiki di GCC . Il punto più generale è che i compilatori sono generalmente originariamente compilati con qualche altro compilatore fino a quando non sono abbastanza potenti da compilarsi da soli. In alternativa, è possibile scrivere un compilatore di base in grado di gestire un sottoinsieme delle funzionalità in assembler e creare da lì. Ma ancora una volta, questo non è quasi mai più necessario. Sono disponibili molti compilatori, in una varietà di lingue. Anche quando Stephen Johnson scriveva pcc (uno dei primi compilatori C), erano disponibili compilatori per B, insieme a molti altri linguaggi. gcc aveva diversi compilatori tra cui scegliere per crearlo originariamente, e RMS dice che stava usando il compilatore Pastel almeno durante il suo sviluppo iniziale.

Ricorda, non è necessario che un compilatore C sia scritto in C. Se lo desideri, potresti scriverlo in Perl. Non è richiesto che un compilatore per una data piattaforma sia originariamente scritto su quella piattaforma (i sistemi embedded quasi sempre sono compilati su qualche altro sistema). Quindi ci sono molti modi per farti eseguire il bootstrap.

Questa domanda ha alcune sottigliezze interessanti relative alla prima istanza di bootstrap del compilatore. Se fossi molto intelligente, potresti usare quel bootstrap per fare qualcosa di incredibile, brillante e terrificante .


Woah, quel secondo articolo a cui ti sei collegato è follemente intelligente.
Ponkadoodle

1
Grazie per l'ottimo link di avvio. Ho dato per scontato che i compilatori erano sempre scritte in linguaggi più semplici per tutto il tragitto in codice macchina per tipo di questo motivo. (Ad esempio, cosa succede se ti rendi conto che il binario del tuo compilatore contiene un errore? Questo fornisce un esempio molto più chiaro, ovviamente.) Quindi quali sono i vantaggi di scrivere il compilatore nella sua lingua? Le persone estremamente paranoiche si preoccupano di questo e creano i loro compilatori senza il bootstrap "automatico"?
RoG

4
Alcuni gruppi linguistici considerano un segno d'onore potersi compilare. Recentemente Go ha fatto una grande spinta in questa direzione. Swift, d'altra parte, in particolare non ha in programma di riscrivere il proprio compilatore in Swift. Notare comunque che GCC è sempre stato scritto in C. È stato semplicemente compilato con altri compilatori. Ma se tutti i compilatori C fossero scritti in BCPL, ciò non risolverebbe nulla riguardo alla paranoia. Sposta semplicemente la questione indietro di un passo. (Otterresti gli stessi vantaggi di paranoia semplicemente compilando GCC w / clang.)
Rob Napier

Nota che gcc ha una politica secondo la quale la versione principale di gcc X può sempre essere compilata con la versione principale di gcc X-1, quindi qualsiasi nuova funzionalità aggiunta al compilatore in X può essere utilizzata solo nel sorgente gcc stesso da X + 1. es. dovresti essere in grado di compilare qualsiasi versione 9 di gcc, indipendentemente dal numero di versione minore, con qualsiasi gcc 8, anche in questo caso indipendentemente dalla versione minore.
Baruch il

51

Originariamente era scritto in un linguaggio assembly, poi iniziò a mangiare per cani stesso.


2
Non ho visto alcun riferimento a RMS utilizzando l'assembler per il bootstrap originale. Qual è la tua fonte per questo? Aveva molti altri compilatori con cui eseguire il bootstrap, quindi sembra un sacco di lavoro.
Rob Napier

17
Pensavo che il termine fosse bootstrap.
Martin York

7
hahaha L'ho letto poche settimane fa e pensavo che fossi fuori di testa con quell'espressione, non mi rendevo conto che fosse standard. Buon spettacolo signore! en.wikipedia.org/wiki/Eating_your_own_dog_food

3

Sebbene questo sia ovviamente solo un indicatore molto approssimativo, ho trovato interessante questo elenco rapido nella gcc-5.1.0-src/gcc/directory. Questa directory contiene i sorgenti principali di GCC stesso (ad eccezione delle librerie di runtime).

Ecco i conteggi dei file principali (oltre 100) raggruppati per estensione dominata dai file C e 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 

Si noti che oggigiorno si GCCfa riferimento alla GNU Compiler Collection, non solo al GNU C Compiler.

6.3 La sottodirectory gcc

La directory gcc contiene molti file che fanno parte dei sorgenti C di GCC, altri file usati come parte del processo di configurazione e compilazione e sottodirectory inclusa la documentazione e una suite di test.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.