C è scritto in C, come è possibile? [duplicare]

40

So che la mia domanda va alla caverna della galassia sotterranea, dove nascono le lingue e coinvolge alcuni lambda di matematica e anni luce di studio di google. Ma che tipo di conoscenza è necessaria per creare un linguaggio?

    
posta H_7 26.03.2012 - 16:45
fonte

4 risposte

76

Cerca "bootstrap".

Fondamentalmente si inizia con un processo / insieme di funzioni molto minimale che può essere usato per compilare il codice che definisce un compilatore leggermente più funzionale. Questo crea il tuo prossimo compilatore che poi può essere usato per creare codice che possa fare ancora di più. Ripeti questo processo finché non hai un compilatore completo che può compilare tutte le funzionalità della lingua.

L'altra alternativa è scrivere la prima versione del compilatore in una lingua diversa e poi scrivere la prossima versione nella lingua di destinazione.

    
risposta data 26.03.2012 - 16:50
fonte
22

La risposta di ChrisF è eccellente, ma volevo aggiungere questo esempio che mi è sempre rimasto dopo il mio corso di informatica su bootstrap.

Supponiamo di avere un compilatore C di base che non supporta ancora i codici di escape per le stringhe e si desidera aggiungerlo. Puoi aggiungere uno snippet di codice simile a questo:

if( str[i] == 0x5c ) {       // ASCII code for backslash
   switch( str[i+1] ) {
      case 'n': return 0x0a; // ASCII code for new line
      case 't': return 0x09; // ASCII code for tab
      // ...                 // more ASCII code for other escapes
      default: return str[i+1];
   }
}

Dopo averlo aggiunto al compilatore e generato un nuovo binario del compilatore, puoi riscriverlo in:

if( str[i] == '\' ) { 
   switch( str[i+1] ) {
      case 'n': return '\n';
      case 't': return '\t';
      // ...
      default: return str[i+1];
   }
}

Ciò toglierebbe qualsiasi conoscenza sui codici ASCII dal codice sorgente del compilatore, ma il compilatore genererebbe comunque magicamente i codici corretti.

    
risposta data 26.03.2012 - 18:34
fonte
18

Il bootstrap è sicuramente il modo standard per costruire un compilatore oggi. Ma ricorda che non hai bisogno di un compilatore o di un interprete per scrivere un programma in una lingua. Ad esempio, Christopher Strachey ha scritto un famoso programma AI che è stato in grado di giocare a Dama in CPL prima che ci fosse un compilatore per CPL . Ha dovuto tradurre il programma in codice macchina "manualmente", che è noioso e soggetto a errori, ma non molto difficile (ecco perché i computer possono farlo così bene).

    
risposta data 26.03.2012 - 17:14
fonte
10

Spero che questo non sia fuori tema, ma volevo sottolineare che, una volta ottenuto un compilatore C per una piattaforma X, è possibile eseguire il bootstrap per altre piattaforme utilizzando cross-compilation:

  • Hai un compilatore C c1 per l'architettura X che gira su architettura X.
  • Si scrive un compilatore C c2 per l'architettura Y, scritto in C.
  • Si compila il compilatore c2 su X usando c1 e si ottiene il binario per il compilatore c2 che gira su X.
  • Usi il binario per c2 che gira su X per compilare se stesso e ottenere un binario di c2 che verrà eseguito su Y.

In altre parole, quando hai il primo uovo, è facile fare più uova.

    
risposta data 26.03.2012 - 17:48
fonte

Leggi altre domande sui tag