Domanda

Sto facendo un programma genetico, ma sto colpendo una limitazione con C # in cui voglio presentare nuove funzioni per l'algoritmo, ma non posso farlo senza ricompilare il programma. In sostanza voglio l'utente del programma per fornire le funzioni consentite e il GP verrà automaticamente usarli. Sarebbe bello se l'utente è tenuto a conoscere il meno sulla programmazione possibile.

Voglio inserire le nuove funzioni senza la compilazione nel programma. In Python questo è facile, dal momento che è tutto interpretato, ma non ho idea di come farlo con C #. Qualcuno sa come raggiungere questo obiettivo in C #? Ci sono delle librerie, le tecniche, etc?

È stato utile?

Soluzione

Dipende da come si desidera che l'utente del programma di "fornire le funzioni consentite".

  • Se l'utente è scegliere le funzioni che già implementati, è possibile passare questi intorno come delegati o alberi di espressione.
  • Se l'utente sta per scrivere i propri metodi in C # o in un altro linguaggio .NET, e compilarli in un assieme, è possibile caricare utilizzando la riflessione.
  • Se si desidera che l'utente sia in grado di digitare C # codice sorgente nel vostro programma, è possibile compilare che l'utilizzo di CodeDom, quindi chiamare l'assembly risultante utilizzando la riflessione.
  • Se si desidera fornire un linguaggio espressione personalizzata per l'utente, ad esempio, un semplice linguaggio matematico, allora (supponendo che si può analizzare la lingua) è possibile utilizzare Reflection.Emit per generare un montaggio dinamico e chiamare che l'utilizzo di - avete indovinato - Riflessione. Oppure si può costruire un albero di espressione dal codice utente e compilare che l'utilizzo di LINQ - dipende da quanto flessibilità necessaria. (E se si può permettersi di aspettare, alberi di espressione in .NET 4.0 rimuovono molte delle limitazioni che erano in 3.5, in modo da essere in grado di evitare del tutto Reflection.Emit.)
  • Se si è soddisfatti per l'utente di immettere espressioni utilizzando Python, Ruby o un'altra lingua DLR, è possibile ospitare il Dynamic Language Runtime, che interpreterà il codice utente per voi.

Hosting DLR (e IronPython o IronRuby) potrebbe essere una buona scelta qui perché si ottiene un ambiente ben collaudato e tutte le ottimizzazioni DLR fornisce. Ecco un how-to utilizzando IronPython.

Aggiunta in risposta alla tua domanda prestazioni: Il DLR è ragionevolmente intelligente di ottimizzazione. Non ciecamente ri-interpretare il codice sorgente ogni volta: una volta trasformato il codice sorgente (o, in particolare, una data funzione o classe) MSIL, manterrà riutilizzando quella rappresentazione compilato finché le modifiche del codice sorgente (ad esempio la la funzione viene ridefinito). Quindi, se l'utente continua a utilizzare la stessa funzione, ma su diversi set di dati, quindi fino a quando si può mantenere lo stesso ScriptScope intorno, si dovrebbe ottenere perf dignitoso; Idem se la vostra preoccupazione è solo che si sta andando a eseguire gli stessi zillions funzione di volte durante l'algoritmo genetico. Hosting DLR è abbastanza facile da fare, quindi non dovrebbe essere difficile da fare una prova di concetto e misura per vedere se è all'altezza delle vostre esigenze.

Altri suggerimenti

Si può cercare di creare e manipolare Expression Trees . Utilizzare Linq per valutare gli alberi di espressione.

È inoltre possibile utilizzare CodeDom di compilare ed eseguire una funzione. Di sicuro si può google per vedere alcuni esempi che potrebbero soddisfare le vostre esigenze. Sembra che questo articolo "Come compilare dinamicamente C # codice " e questo articolo "dinamicamente l'esecuzione di codice in .Net" potrebbe aiutare.

Si ha accesso al compilatore da codice, è possibile quindi creare istanze del codice compilato e utilizzarli senza riavviare l'applicazione. Ci sono esempi di intorno

Qui

e

Qui

Il secondo è un valutatore JavaScript ma potrebbe essere adattato abbastanza facilmente.

Si può dare un'occhiata a System.Reflection.Emit per generare il codice a livello di IL.

o generare C #, compilare in una biblioteca e caricare quel modo dinamico. Non così flessibile.

E 'infatti molto facile generare IL. Vedere questo tutorial: http://www.meta-alternative.net/calc.pdf

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