2010-06-04 14 views
10

Nella presentazione di .NET 4.0 di Anders Hejlsberg discussa in NET 5.0 ("o qualche versione futura") stanno lavorando a un modello "Compilatore come servizio". StatiQuali sono i vantaggi del compilatore come servizio

Anders di Hejlsberg: [fonte] [1] "Vogliamo aprire il nostro compilatore così diventa un'API è possibile chiamare per compilare un pezzo di codice e tornare alberi di espressione e/o IL Ciò consente a. tutta una serie di scenari, come la programmabilità delle applicazioni, un prompt interattivo, i refactoring scritti dall'utente e linguaggi specifici del dominio che contengono piccole isole di C# in essi incorporate. "

Sto lottando per trovare un esempio reale in cui ciò potrebbe effettivamente essere utile. Mi manca il concetto principale qui? o questo andrà davvero a beneficio della lingua?

[1]: http://www.simple-talk.com/opinion/geek-of-the-week/anders-hejlsberg-geek-of-the-week/ compilatore as a Service

+2

E gli algoritmi genetici ricomitanti auto-modificanti? Ho appena lanciato alcune parole d'ordine? Può essere. O forse siamo un passo più vicini a Skynet .... – Randolpho

risposta

4

Per alcuni problemi, è più semplice scrivere un programma in grado di generare un programma che risolva il problema reale. Un'area in cui questo è particolarmente utile è per la costruzione di parser per i compilatori.

In altri casi, è possibile generare al volo un codice che può essere adattato per fornire prestazioni ottimali quando si lavora con un particolare tipo di dati, sulle proprietà che si sono appena apprese in fase di esecuzione riflettendo sui relativi metadati. Un esempio che posso darti per questo è il mio progetto Modelshredder. In pratica, sta prendendo tutti i campi e le proprietà di un oggetto e impacchetta il loro valore in un array di oggetti.

Il mio primo approccio a questo problema è stato l'iniezione MSIL codificata a mano utilizzando Reflection.Emit. Il secondo approccio era un po 'più dinamico e si basava su Expression Trees, che può essere effettivamente costruito e compilato in fase di runtime per fornire la stessa funzionalità della mia iniezione MSIL codificata a mano. Puoi vedere quello realizzato nel trunk MoreLinq (dai un'occhiata al sito di Modelshredder, c'è un link per questo). Avere il compilatore come servizio mi permetterebbe in realtà di aumentare il livello di astrazione ed emettere il codice C# che verrà poi compilato in MSIL.

Il caso per le lingue specifiche del dominio è già stato fatto, inoltre penso che un linguaggio imperativo come C# non sia adatto allo scenario della "riga di comando" ma piuttosto che agli script più grandi. C'è un sistema di make pulito basato su un F # DSL chiamato FAKE, che prende in prestito molti concetti di Compiler as a Service. Concetti simili sono impiegati dalla finestra interattiva F # (si chiama così?) All'interno di VisualStudio.

4

Un vero esempio di come questo mondo potrebbe essere utile è per l'utente-estensibilità per i giochi. La maggior parte dei giochi moderni consente un certo tipo di estensibilità dell'utente attraverso linguaggi di scripting, che possono essere relativamente lenti, o attraverso DLL compilate che richiedono una piattaforma di sviluppo (e la conoscenza per usarlo). Ciò consentirebbe agli utenti di scrivere estensioni al gioco usando C#, che verrà compilato dal gioco in fase di runtime, senza richiedere all'utente di compilarlo da sé. Permetterebbe anche di testare nuove idee inserendo, ad esempio, il codice C# in una finestra della console di gioco senza dover riavviare il gioco per ogni piccola modifica. Attualmente questo tipo di cose è realmente possibile solo con linguaggi di scripting interpretati e incorporati.

+1

Non solo i giochi. Molte logiche di business possono essere incorporate come codice C# grezzo e, se lo desideri, dovresti essere in grado di modificarle in fase di runtime. –

2

Penso che un altro esempio sia la protezione dalla copia. Potresti avere un codice univoco sulla tua macchina, generato durante l'installazione per legare un programma a un ID CPU.

Supponiamo che io utilizzi il numero seriale come parametro nel calcolo delle imposte. Una copia del programma è facile da fare e totalmente inutile.

0

Inoltre rende davvero facile la scrittura di programmi con funzionalità simili a Linqpad.

È possibile utilizzare un altro caso di utilizzo per l'utilizzo di blocchi di codice sorgente memorizzati in un database e richiamare dati specifici in base alle configurazioni, in modo simile al modo in cui Workflow Foundation può essere chiamato in questo momento. Ciò potrebbe essere di aiuto nell'automazione del flusso di lavoro per CRM, ERP e altre applicazioni di data warehousing (anche se in caso di abuso ciò costituirebbe un antipatico epico).

Problemi correlati