2009-10-05 8 views
8

I linguaggi di programmazione sembrano passare attraverso diverse fasi. In primo luogo, qualcuno sogna una nuova lingua, Foo Language. Il compilatore/interprete è scritto in un'altra lingua, di solito C o qualche altro linguaggio di basso livello. Ad un certo punto, FooL matura e cresce, e alla fine qualcuno, da qualche parte, scriverà un compilatore e/o un interprete per FooL in FooL stesso.Quali caratteristiche linguistiche sono richieste in un linguaggio di programmazione per creare un compilatore?

La mia domanda è questa: qual è il sottoinsieme minimo di funzionalità linguistiche tale che qualcuno possa implementare tale linguaggio in sé stesso?

+1

Completezza di Turing? –

+2

vedere: http://stackoverflow.com/questions/13537/bootstrapping-a-language –

+0

Non lo stesso, ma una lettura correlata: [quale-è-il-migliore-linguaggio-a-scrivere-un-compilatore-in ] (http://stackoverflow.com/questions/809710/what-is-the-best-language-to-write-a-compiler-in) – nawfal

risposta

2

Una possibilità è un read-eval-print loop. Questo può essere usato per costruire molti costrutti di livello superiore. Credo che questo sia il percorso seguito da LISP.
Non sono sicuro degli inizi di C, ma penso che sia iniziato con alcune chiamate di sistema per implementare ramificazioni, loop, assegnazioni e I/O a singolo carattere e costruito da lì.

4

In teoria, sorprendentemente piccolo. Un computability theorist direbbe che tutto ciò che serve è mu-recursion o un Turing machine o simili.

Tuttavia, da un punto di vista pratico, non sarai molto felice nel tentativo di implementare un linguaggio di programmazione in una macchina di Turing. Direi che, come minimo, si vorrebbe avere tutti i consueti costrutti del flusso di controllo, i tipi di dati primitivi, le subroutine, nonché le matrici e le strutture. Questo dovrebbe essere sufficiente per consentire di implementare quel sottoinsieme della lingua nella lingua stessa - e quindi puoi eseguire il bootstrap da lì.

+2

"In teoria, non c'è differenza tra teoria e pratica. , c'è." - Ho dimenticato chi. –

+0

"* tutto * di cui hai bisogno è una macchina di Turing" mi ha fatto sorridere, considerando che è fondamentalmente il più potente modello di calcolo "ragionevole" noto :-) –

0

Supponiamo che un assemblatore effettui il taglio.

0

La mia domanda è questa: qual è il sottoinsieme minimo di funzionalità del linguaggio tale che qualcuno possa implementare tale linguaggio in sé stesso?

Non è necessario che il linguaggio sia utile per qualcosa di diverso dalla compilazione stessa? Vi presento Useless, la lingua in cui ogni testo è un programma appropriato e significa "un programma che prende qualsiasi input e produce se stesso" (questo è anche noto come compilatore Useless).

+0

Mi piace il linguaggio di Jon Skeet. Ma per amor di discussione, assicuriamoci che il linguaggio sia utile come definito, per lo meno essere Turing-complére. –

+0

Questo è sicuramente un ** linguaggio di programmazione '' inutile' **. –

+0

@Brad: Sì, sì, lo è. @Matthew: sei sicuro che il linguaggio di Jon Skeet possa compilarsi da solo? –