Come potrebbe il primo compilatore C ++ essere scritto in C ++?

46

Stroustrup afferma che Cfront, il primo compilatore C ++, è stato scritto in C ++ ( Domande frequenti su Stroustrup ).

Tuttavia, come è possibile che il primo compilatore C ++ sia scritto in C ++?

Anche il codice che compone il compilatore deve essere compilato, e quindi il primo compilatore C ++ non avrebbe potuto essere scritto in C ++, vero?

    
posta Pacerier 01.09.2011 - 17:44
fonte

4 risposte

56

La chiave è proprio qui:

The first C++ compiler (Cfront) was written in C++. To build that, I first used C to write a "C with Classes"-to-C preprocessor. "C with Classes" was a C dialect that became the immediate ancestor to C++. That preprocessor translated "C with Classes" constructs (such as classes and constructors) into C. It was a traditional preprocessor that didn't understand all of the language, left most of the type checking for the C compiler to do, and translated individual constructs without complete knowledge. I then wrote the first version of Cfront in "C with Classes".

Quindi la prima versione di Cfront non è stata scritta in C ++, piuttosto nella lingua intermedia. La possibilità di creare compilatori C e preprocessori direttamente in C ha portato a molte delle innovazioni (e massicci buchi di sicurezza ) in C. Quindi scrivi il tuo nuovo preproduttore che trasforma il tuo codice" C con classi "in diritto C (perché il C dritto può fare qualsiasi cosa) e poi usi" C con Classes "per scrivere un compilatore C ++ (non che non si potesse farlo in C, basterebbe un po 'di tempo) e poi si usa quel compilatore C ++ per scrivere un compilatore più efficiente / completo in C ++. Capito?

    
risposta data 01.09.2011 - 18:07
fonte
17

È stato avviato. Non appena una funzionalità C ++ è stata aggiunta a cfront, allora cfront potrebbe anche usare quella funzione da quel punto in poi (ma non implementare quella caratteristica). Questo ha funzionato perché cfront aveva la capacità di convertire il codice C ++ in codice C. Quindi, se venisse fuori qualche nuova piattaforma, potreste usare cfront su un'altra piattaforma per convertire cfront da C ++ a C, e quindi usare il compilatore C della nuova piattaforma per completare la compilazione da C al codice oggetto.

    
risposta data 01.09.2011 - 18:07
fonte
9

Penso B.S. risponde a questa domanda:

The first C++ compiler (Cfront) was written in C++. To build that, I first used C to write a "C with Classes"-to-C preprocessor. "C with Classes" was a C dialect that became the immediate ancestor to C++. That preprocessor translated "C with Classes" constructs (such as classes and constructors) into C. It was a traditional preprocessor that didn't understand all of the language, left most of the type checking for the C compiler to do, and translated individual constructs without complete knowledge.

I then wrote the first version of Cfront in "C with Classes". Cfront was a traditional compiler that did complete syntax and semantic checking of the C++ source. For that, it had a complete parser, built symbol tables, and built a complete internal tree representation of each class, function, etc. It also did some source level optimization on its internal tree representation of C++ constructs before outputting C. The version that generated C, did not rely on C for any type checking. It simply used C as an assembler. The resulting code was uncompromisingly fast.

Prima ha creato qualcosa che ha chiamato "C with Classes" implementato da un semplice preprocessore in C. Era fondamentalmente C ++, ma il preprocessore ha fatto poco o nessun controllo. L'ha poi usato per scrivere Cfront, la versione più potente del traduttore di C ++ in C, completa di controllo del tipo, tabelle dei simboli, ecc.

    
risposta data 01.09.2011 - 18:08
fonte
2

Aggiungerò questa risposta poiché nessuna risposta copre questo aspetto.

Tecnicamente non hai bisogno di software per compilare il codice. Finché disponi delle specifiche del compilatore necessarie, puoi eseguire manualmente la compilazione vera e propria. Questo non è il modo in cui è stato compilato il primo compilatore C ++. Sto solo dicendo che è possibile.

Confronta con linguaggio assembly. Quando venivano utilizzati nei primi giorni, non esistevano software assembler per convertire il codice assembly in codice macchina. È stato fatto a mano, ma il linguaggio assembly ha dato ai programmatori una visione migliore.

    
risposta data 20.09.2017 - 00:51
fonte

Leggi altre domande sui tag