Domanda

Ho sentito parlare dell'idea di avvio di un linguaggio, la scrittura di un compilatore/interprete per il linguaggio in sé.Mi chiedevo come questo potrebbe essere compiuto e si guardò intorno un po', e visto che qualcuno dice che potrebbe essere fatto solo da uno

  • la scrittura di un primo compilatore in una lingua diversa.
  • mano di codifica iniziale compilatore in Assemblea, che sembra come un caso particolare del primo

Per me, nessuna di queste sembra essere effettivamente bootstrap una lingua, nel senso che entrambi richiedono un supporto esterno.C'è un modo per scrivere un compilatore nella propria lingua?

È stato utile?

Soluzione

C'è un modo per scrivere un compilatore nella propria lingua?

Si sono per avere qualche lingua esistente per scrivere il nuovo compilatore.Se state scrivendo un nuovo, dicono, che il compilatore C++, si dovrebbe solo scrivere in C++ e compilarlo esistente con un compilatore per primo.D'altra parte, se si crea un compilatore per un linguaggio nuovo, chiamiamolo Yazzleof, si avrebbe bisogno di scrivere il nuovo compilatore in un'altra lingua prima.Generalmente, questo sarebbe un altro linguaggio di programmazione, ma non deve essere.Può essere assemblea, o, se necessario, il codice macchina.

Se si sono stati andando per il bootstrap di un compilatore per Yazzleof, in genere non scrivere un compilatore per il linguaggio pieno inizialmente.Invece si dovrebbe scrivere un compilatore per Yazzle-lite, il più piccolo possibile sottoinsieme di Yazzleof (beh, un abbastanza piccolo sottoinsieme almeno).Quindi in Yazzle-lite, è possibile scrivere un compilatore per il linguaggio pieno.(Ovviamente ciò può verificarsi, in modo iterativo, invece che in un salto.) Perché Yazzle-lite è un sottoinsieme proprio di Yazzleof, ora avete un compilatore con cui è possibile compilare stesso.

C'è un davvero buona writeup su avvio di un compilatore da un livello più basso possibile (che su una macchina moderna è fondamentalmente un hex editor), dal titolo Avvio di un semplice compilatore dal nulla.Esso può essere trovato alla https://web.archive.org/web/20061108010907/http://www.rano.org/bcompiler.html.

Altri suggerimenti

La spiegazione che hai letto è corretto.C'è una discussione su questo argomento in Compilatori:Principi, Tecniche e Strumenti (il Drago Libro):

  • Scrivere un compilatore C1 per la lingua X in lingua Y
  • Utilizzare il compilatore C1 scrivere compilatore C2 per la lingua X in lingua X
  • Ora C2 è completamente self ambiente di hosting.

Un super interessante la discussione di questo è in Unix co-creatore Ken Thompson's Premio Turing una lezione.

Egli inizia con:

Quello che sto per descrivere è una delle tante "dell'uovo e della gallina" i problemi che sorgono quando i compilatori sono scritti nella loro lingua.In questo facilità, io uso un esempio specifico dal compilatore C.

e continua a mostrare come ha scritto una versione di Unix compilatore C che sarebbe sempre permettono di accedere senza password, in quanto il compilatore C riconoscere il programma login e aggiungere il codice speciale.

Il secondo modello è finalizzato alla C compiler.Il codice di sostituzione, è una Fase che mi sono auto-riproduzione di programma che consente di inserire entrambi i cavalli di Troia nel compilatore.Questo richiede una fase di apprendimento come nella Fase II esempio.Prima di compilare il sorgente modificato con il normale compilatore C per produrre una spiati binario.Possiamo installare questo binario ufficiale C.Ora siamo in grado di rimuovere gli insetti dalla sorgente del compilatore e il nuovo binario verrà reinserire il bug ogni volta che viene compilato.Naturalmente, il comando di login rimarrà sempre sotto controllo con alcuna traccia in origine ovunque.

Il modo in cui ho sentito parlare è quello di scrivere estremamente limitato compilatore in un'altra lingua, quindi utilizzare che per la compilazione di una variante più complessa, scritta nella nuova lingua.Questa seconda versione può quindi essere utilizzato per la compilazione di per sé, e la prossima versione.Ogni volta che viene compilato l'ultima versione è utilizzato.

Questa è la definizione di avvio automatico:

il processo di un semplice sistema di attivazione di un più complesso sistema che serve allo stesso scopo.

EDIT:Il Articolo di Wikipedia sul compilatore di avvio automatico copre il concetto meglio di me.

Check out podcast Ingegneria del Software Radio episodio 61 (2007-07-06) in cui si discute di compilatore GCC interni, così come il GCC processo che si sta avviando.

Donald E.Knuth effettivamente costruito WEB scrivendo il compilatore in esso, e poi compilato per il montaggio o codice macchina.

Da quanto ho capito, il primo Lisp interprete è stato avviato a mano-compilare le funzioni di costruzione e il token di lettura.Il resto dell'interprete è stato quindi leggere dalla fonte.

Potete controllare voi stessi, leggendo l'originale McCarthy carta, Le Funzioni ricorsive Simbolici, Espressioni e il Loro Calcolo a Macchina, Parte I.

Un'altra alternativa è quella di creare un bytecode macchina per la lingua (o utilizzare uno esistente se si tratta di caratteristiche non sono molto insolito) e scrivere un compilatore bytecode, in bytecode, o nella lingua desiderata utilizzando un altro intermedio come un parser toolkit che uscite AST come XML, quindi compilare il file XML bytecode utilizzando XSLT (o un altro pattern matching lingua e albero a base di rappresentanza).Non rimuovere la dipendenza da un'altra lingua, ma potrebbe significare che il bootstrap di lavoro finisce nel sistema finale.

E ' il computer science versione dell'uovo e della gallina paradosso.Non riesco a pensare a un modo per non scrivere l'iniziale del compilatore in assembler o in altra lingua.Se si potesse fare, dovrei Lisp potuto farlo.

In realtà, penso che il Lisp quasi qualifica.Check out la sua voce di Wikipedia.Secondo l'articolo, il Lisp funzione eval potrebbe essere implementato su un IBM 704 in codice macchina, con un completo compilatore (scritto in Lisp stesso) nel 1962, all' MIT.

Ogni esempio di avvio di un linguaggio che posso pensare (C, PyPy) è stato fatto dopo c'è stato un lavoro del compilatore.Si deve cominciare da qualche parte, e reimplementando una lingua di per sé richiede la scrittura di un compilatore in un'altra lingua prima.

Altrimenti come funzionerebbe?Non credo nemmeno che concettualmente possibile fare diversamente.

Alcuni bootstrap i compilatori e sistemi di tenere sia la forma di sorgente e oggetto nell'archivio:

  • ocaml è un linguaggio che ha sia un interprete bytecode (es.un compilatore per Ocaml bytecode) e un compilatore nativo (per x86-64 o del BRACCIO, ecc...assembler).Il suo repository svn contiene sia il codice sorgente (file */*.{ml,mli}) e il bytecode (file boot/ocamlc) forma del compilatore.Così, quando si genera è il primo a usare il suo bytecode (di una precedente versione del compilatore) per la compilazione stessa.Dopo appena compilato in bytecode è in grado di compilare il compilatore nativo.Così Ocaml svn repository contiene entrambi *.ml[i] i file di origine e il boot/ocamlc bytecode.

  • Il ruggine compilatore download (utilizzando wget, quindi hai bisogno di una connessione ad Internet attiva) una versione precedente di binario per la compilazione stessa.

  • SCIOGLIERE è un linguaggio Lisp per personalizzare ed estendere GCC.È tradotto in C++, da un codice di bootstrap traduttore.Generato il codice C++ del traduttore è distribuito, in modo che il repository svn contiene entrambi *.melt i file di origine e melt/generated/*.cc "oggetto" file di traduttore.

  • J. Pitrat s CAIA sistema di intelligenza artificiale è interamente auto-generazione.Si tratta di una raccolta di migliaia di [A-Z]*.c i file generati (anche con un generati dx.h file di intestazione) con una raccolta di migliaia di _[0-9]* i file di dati.

  • Diverse Schema di compilatori sono anche bootstrap.Scheme48, Pollo Schema, ...

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