Domanda

Sono stato di programmazione in Ruby per un po 'di tempo con solo l'implementazione standard MRI di Ruby, ma sono sempre stato curioso di sapere le altre implementazioni che ho sentito tanto parlare.

stavo leggendo Rubinius l'altro giorno, un interprete di Ruby scritto in Ruby. Ho provato a guardare in su in vari luoghi, ma mi è stato un periodo difficile capire esattamente come qualcosa come funziona questo. Non ho mai avuto molta esperienza in compilatori o lingua di scrittura, ma mi affascina molto per capirlo.

Come esattamente può un linguaggio di essere interpretato da se stesso? C'è un passo fondamentale nella compilazione che non capisco dove questo ha un senso? Qualcuno può spiegare questo a me come se fossi un idiota (perché non sarebbe essere troppo lontano di base in ogni modo)

È stato utile?

Soluzione

E 'più semplice di quanto si pensi.

Rubinius non è al 100% scritto in Ruby, proprio per lo più.

http://rubini.us/

  

Una grande aspetto di linguaggi popolari come C e Java è che la maggior parte delle funzionalità disponibili al programmatore è scritto nel linguaggio stesso. Rubinius ha l'obiettivo di aggiungere Rubino a quella lista. Rubysti potrebbero più facilmente aggiungere funzionalità al linguaggio, bug fix, e imparare come funziona la lingua. Per quanto possibile Rubinius è scritto in Ruby. Dove non è possibile (ancora), è C ++.

Altri suggerimenti

Il concetto che si sta cercando è compilatore bootstrap .

In sostanza significa scrivere un compilatore (o un interprete) per la lingua bootstrapping x in lingua x . Questo si può fare scrivendo un compilatore di base su un livello inferiore a mano (vale a dire la scrittura di un compilatore C in Assemblea), oppure utilizzando una lingua diversa alto livello.

Per saperne di più sul bootstrapping wikipedia . La risposta di Greg per quanto riguarda i valutatori meta-circolare è anche altamente raccomandato, compreso il relativo capitolo nel SICP.

In caso di Rubinius, la VM è scritto in C ++ e si occupa di tutto il basso livello (sistema operativo legati) le operazioni di roba e di base. La VM ha il proprio formato bytecode (come la JVM ha un proprio così) e quando viene avviato Rubinius si avvia la macchina virtuale che esegue il bytecode. La maggior parte di libreria standard Rubinius' (che fa parte di Ruby linguaggio) è implementato in Ruby tuttavia, rispetto a C (MRI) o Java (JRuby). Inoltre, il bytecode compilatore Rubinius è anche scritto in Ruby. Quindi sì, ad un certo punto nella fase iniziale in principio hanno dovuto usare l'interprete standard di Rubino (MRI) per il bootstrap Rubinius. Ma questo non dovrebbe essere il caso più (anche se non sono sicuro se ancora averne bisogno in quanto i suoi usi accumulo sistema rake).

Si supponga che la lingua che si sta lavorando è un linguaggio, diciamo Lisp, anche se non importa. (Potrebbe essere C ++, Java, Ruby, niente.)

Bene avete un'implementazione di Lisp. Chiamare questa implementazione Imp (solo alcuni costituito nome breve per l'attuazione). Dal momento che Imp è un programma di per sé, il computer può eseguirlo. Ora si scrive il proprio implementazione per Lisp scritto in Lisp e lo chiami Circ. Circ è solo un programma compilato (o interpretate se si vuole) dal codice Lisp. Il tuo codice è scritto in modo che legge un file, lo analizza (processi in dati significativi), e fa qualcosa con i dati. Che cosa è questa cosa? Nel caso del Circ, esegue i dati.

Ma come farlo?

Bene Supponiamo per un semplice caso che il codice Circ legge ed analizza è qualcosa di semplice come fare un po 'di matematica e l'output il risultato. Circ elabora il codice in facile da utilizzare i dati (anche per un linguaggio come Lisp è facile cominciare, ma questo è oltre il punto) e lo memorizza. Bene in Lisp è possibile scrivere codice per fare calcoli, in modo che il codice scritto per Circ può farlo anche perché è scritto in Lisp. Quindi i dati elaborati sia collegato a un codice di trasformazione Oltre ... e voilà! Avete il risultato numerico! Poi il programma Circ emette il risultato.

La stessa cosa si può fare con le cose più complesse di semplice matematica. In realtà è possibile compilare / interpretare altri aspetti del linguaggio. Scrivi abbastanza di questi 'altri aspetti' e incollare insieme, si ottiene un un compilatore per Lisp scritto in Lisp.

Dato che il compilatore è compilato da Imp, che può essere eseguito dalla macchina, e presto! Si è fatto.

Questa tecnica è generalmente chiamato un metacircular valutatore e stato introdotto alcuni decenni fa nel contesto di Lisp.

Una descrizione bene della tecnica può essere trovato in Struttura e Interpretazione dei programmi per elaboratore , capitolo 4.

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