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?
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.
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.
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).
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:
In altre parole, quando hai il primo uovo, è facile fare più uova.
Leggi altre domande sui tag programming-languages c lambda