Domanda

Possibili duplicati:
Come può il compilatore di una lingua essere scritto in quella lingua?
implementare un compilatore in “se stesso”

stavo guardando Rubinio, un'implementazione di Ruby che viene compilata in bytecode utilizzando un compilatore scritto in Ruby.Non riesco a capirlo.Come si scrive un compilatore per una lingua nella lingua stessa?Sembra che sarebbe solo testo senza nulla da compilare in un eseguibile che potrebbe poi compilare il futuro codice scritto in Ruby.Mi confondo solo scrivendo quella frase.Qualcuno può aiutarmi a spiegarlo?

È stato utile?

Soluzione

Per semplificare: si Scrivi un compilatore per il compilatore, in una lingua diversa. Poi, si compila il compilatore, e voilà!

Quindi, è necessario un qualche tipo di linguaggio che ha già un compilatore - ma dal momento che ci sono molti tali, è possibile scrivere il compilatore compilatore Rubino per esempio (!) in C, che sarà quindi compilare il compilatore Ruby, che possono quindi compilare programmi in Ruby, anche altre versioni di se stesso.

Naturalmente, i compilatori originali sono stati scritti in codice macchina, compilatori compilati per l'assemblaggio, che a loro volta compilatori compilati per esempio C o Fortran, che ha compilato compilatori per ... praticamente tutto. sviluppo iterativo in azione.

Il processo è chiamato bootstrapping - possibilmente dal nome la storia di Barone di Münchhausen, in cui si tirò fuori una palude dai suoi stessi bootstraps:)

Altri suggerimenti

Per quanto riguarda il bootstrap di un compilatore vale la pena di leggere su questo hack diabolicamente intelligente.

http://catb.org/jargon/html/B/back- door.html

mi confondo solo leggendo quella frase.

Può essere utile pensare al compilatore come traduttore, che i compilatori sono spesso chiamati. Il suo scopo è quello di prendere il codice sorgente che gli esseri umani in grado di leggere e tradurlo in codice binario che i computer in grado di leggere. Nel caso di Rubinius, il codice che legge sembra essere codice Ruby, e il codice che converte in è codice macchina (in realtà LLVM codice macchina che è essa stessa ulteriormente compilato in codice macchina Intel, ma questo è solo un dettaglio sfondo) . Rubinius in sé avrebbe potuto essere scritto in quasi qualsiasi linguaggio di programmazione. E 'appena successo per essere stato scritto nella stessa lingua che si compila.

Naturalmente, avete bisogno di qualcosa per l'esecuzione Rubinius, in primo luogo, e questo molto probabilmente un normale interprete Ruby. Si noti, tuttavia, che una volta che si è in grado di eseguire Rubinius su un interprete, si può passare il proprio codice sorgente, e sarà creare ed eseguire una versione compilata di se stesso. Questo è chiamato bootstrap, dalla vecchia frase, "tirarsi su dalle bootstraps".

Una nota finale: i programmi di Ruby non può invocare codice macchina arbitrario. Quella parte di Rubinius in realtà è scritto in C ++.

Ebbene è possibile farlo nel seguente ordine:

  1. Scrivi un compilatore in qualsiasi linguaggio, ad esempio C per il tuo codice Ruby.
  2. Ora che puoi compilare il codice Ruby, puoi scrivere un compilatore che compila il codice Ruby e compilare questo compilatore con il compilatore C che hai scritto nel passaggio 1. wahh questa frase è strana!
  3. D'ora in poi potrai compilare tutto il tuo codice Ruby con il compilatore scritto in 2.:)

Divertiti!:)

Un compilatore è solo qualcosa che il codice sorgente di trasforma in un file eseguibile. Così doen't importa quello che è scritto in -. Può essere la stessa lingua di compilare o qualsiasi altra lingua di sufficiente potenza

Il divertimento arriva quando si sta scrivendo un compilatore per un linguaggio per una piattaforma, scritto nella stessa lingua, che non ha ancora un compilatore per il linguaggio di implementazione. Le scelte qui sono per la compilazione su un'altra piattaforma per la quale si ha un compilatore, o scrivere un compilatore in un'altra lingua, e l'uso che per compilare il compilatore "reale".

E 'un processo in 2 fasi:

  1. scrivere un compilatore rubino in qualche altro lanaguage come C, assumendo un compilatore rubino non esiste ancora
  2. dal momento che ora avete un compilatore Ruby, è possibile scrivere un programma di Ruby che è una (nuova) Rubino compilatore

Dal momento che qualcuno già ha scritto un compilatore Rubino (Matz), è "solo" ha a che fare la seconda parte. Più facile a dirsi che a farsi.

Tutte le risposte finora hanno spiegato come avviare il compilatore utilizzando un compilatore diverso. Tuttavia, c'è un'alternativa: la compilazione del compilatore a mano. Non c'è alcun motivo per cui il compilatore deve essere eseguita da una macchina, si può altrettanto bene essere eseguito da un essere umano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top