Devi sapere che CIL fa un compilatore per .NET?

4

Supponiamo che si voglia creare un semplice linguaggio .NET, o leggermente più difficile, un compilatore per un linguaggio .NET esistente. Hai bisogno di avere familiarità con il CIL (Common Intermediate Language) per implementare un compilatore? E devi tradurre la sintassi della tua lingua in CIL a mano? O c'è un altro (più preferibile) modo? In caso contrario, qual è il modo migliore per imparare CIL e soprattutto imparare come tradurre il codice di alto livello in CIL?

    
posta ApprenticeHacker 27.09.2011 - 12:11
fonte

3 risposte

4

Ovviamente puoi generare C # o qualsiasi altro codice di lingua di livello superiore invece di indirizzare direttamente CIL.

È comune implementare i compilatori come eDSL sopra le meta-lingue. Puoi prendere, per esempio, un'implementazione decente per .NET, o un linguaggio più pesante, come Nemerle , e costruire il tuo compilatore come una serie di macro sulla parte superiore di una lingua host, con un front-end della sintassi nella parte superiore di questa gerarchia.

Come hai detto "tradurre la sintassi in CIL", probabilmente avrai una visione distorta su come i compilatori dovrebbero funzionare. Normalmente ci sono molti più passaggi tra il parser e la generazione del codice, e non ha senso fare tutto in un solo passaggio.

E, naturalmente, se la semantica della lingua è significativamente diversa dalla lingua ospite, per un'implementazione efficiente staresti ancora meglio con la generazione di CIL direttamente (o tramite una sequenza di lingue intermedie).

L'apprendimento del CIL non è affatto un problema: tutto ciò che devi sapere è disponibile su MSDN .

E qui è un banale esempio di creazione di un compilatore su un meta-linguaggio: puoi farlo facilmente con qualsiasi Lisp.

    
risposta data 27.09.2011 - 12:21
fonte
3

Devi conoscere CIL? No, ma può aiutarti.

Devi tradurre la tua lingua in CIL? Non è affatto necessaria. (più in un momento)

Qual è il modo migliore per imparare CIL? Bene, ho trovato che il modo migliore per farlo è:
1. Leggere il set di istruzioni CIL, il formato file PE e avere sempre questi documenti nelle vicinanze come riferimento utile.
2. Scrivi un piccolo programma in una lingua .net con cui hai già familiarità, questo piccolo programma dovrebbe solo provare a fare una cosa che non sai come fare con CIL. Compilalo.
3. Usa ILDASM per guardare il programma che hai compilato come puro CIL. Ora capisci come farlo con CIL!
4. Tornare a 2. fino a quando non si masturba il CIL.

C'è un altro modo? Oh sì. Innanzitutto, consulta CodeDOM . Questo è un framework .net generico per 1) traduzione di codice grezzo in un modello di oggetto, 2) traduzione di un modello di oggetto in codice o 3) Creazione di un eseguibile. Se si implementa un parser CodeDOM per generare un modello a oggetti, è possibile utilizzare il MSIL CodeProvider scrivere il CIL per te! Non ho usato questo metodo specifico, ma ho creato un compilatore che ha generato CIL e utilizzato ILASM per creare un eseguibile. Ho anche fatto la compilazione del codice usando CodeDOM. Io sceglierei sempre di usare il maggior numero possibile di CodeDOM.

HTH!

    
risposta data 27.09.2011 - 18:32
fonte
0

In questo caso, dipende dalla tua lingua. Ho visto diversi linguaggi di programmazione rivolti a .NET o Java e gli sviluppatori hanno creato un traduttore "MyLanguage To Java" o "MyLanguage To C # / VB.NET translator" e successivamente lo trasformano in "MyLanguage To Java Bytecode" o " ByLode MyLanguage To MSIL / CIL ".

La tua lingua è simile a C # o VB.NET, forse sarà più facile, in questo caso, fare prima un traduttore.

    
risposta data 27.09.2011 - 17:08
fonte

Leggi altre domande sui tag