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.