Ricompilazione di dll e aggiunta di più durante il runtime: quali sono le mie opzioni?

4

Voglio compilare le funzioni personalizzate durante il runtime in base agli script scritti dall'utente. Darò un esempio ipotetico che dovrebbe dimostrare esattamente quello che devo fare. Questo è il modo migliore per descrivere il problema. Mi piacerebbe un piccolo input / idee su come posso risolvere questo. In fondo ti do le mie idee.

Ho 2 classi, una con public int xey. Un altro con int pubblico x, y, z. Ci possono essere più di un'istanza di ogni classe in esecuzione.

La cosa con queste classi però (ed ecco che arriva il mio problema) è che devono essere aggiornabili tramite una funzione scritta dall'utente e poi compilata durante il runtime, che poi viene aggiunta a un elenco di funzioni di aggiornamento che vengono eseguite una volta per ciclo / evento. Quale potrebbe essere al tocco di un pulsante o qualcosa del genere.

Esempio: l'utente ha scritto uno script per aggiornare i membri pubblici di Classe A. Ha scritto A.X = B.Y + C.Z. Le variabili qui sono pubbliche, mai private. Questo metodo deve essere compilato e aggiunto a un elenco di funzioni per chiamare ogni ciclo. Ovviamente questo metodo ha bisogno di accedere alla classe B e C, così come a A. Quindi i riferimenti a quelli che devono essere passati. La funzione non restituisce nulla.

Quando dico le classi A, B e C., intendo queste come alcune istanze di qualsiasi classe. 'A' potrebbe essere la classe Q, mentre sia B che C potrebbero essere della classe T. O qualsiasi altra variazione. Queste classi non hanno bisogno di ricompilazione / scrittura dell'utente o qualcosa del genere.

Ho solo bisogno di aiuto con le opzioni e come compilare una funzione che viene passata in alcuni puntatori e fa qualcosa con loro. Ma con tutto questo tempo di esecuzione definito, cosa fa la funzione, cosa viene trasmessa in esso, ecc.

---- Cosa penso di poter fare ---

Sto saltando molto in profondità nella conoscenza, ma è quello che faccio sempre. Quindi sto passando da C # a C ++ e ho poco da fare per ora mentre conosco poco. Quindi tutto quello che posso fare è indovinare le soluzioni e ricercarle. Immagino che potrei compilare una DLL in ritardo di caricamento per ogni funzione, e suppongo che la DLL debba sapere qualcosa sulle strutture dati passate, quindi penso che potrebbe funzionare per renderle in una normale dll separata utilizzabile da qualsiasi programma. (Le cose di classe A, B e C, o piuttosto le classi Q e T che A, B e C erano istanze della mia piccola demo). Così ora sia il programma normale che le funzioni dll conoscono tutto sulle classi, e tutto quello che devo fare è compilare le DLL durante il runtime, caricarle e in qualche modo ottenere un puntatore a loro che la mia applicazione principale ha e può chiamare con l'appropriato argomenti. Quindi se l'utente cambia lo script, la DLL scarica, ricompila, carica nuovamente e viene ottenuto un nuovo puntatore?

Qualsiasi aiuto è molto apprezzato. Se puoi aiutare a dirigere il mio apprendimento / ricerca, imparerò molto più velocemente e potrò implementarlo. Grazie mille!

    
posta Dimension 24.05.2013 - 04:10
fonte

2 risposte

1

Utilizza un compilatore esistente, come LLVM . Questo può essere incorporato nella tua applicazione per compilare codice personalizzato in fase di runtime usando la funzione JIT di LLVM - vedi l'esempio di cpp che sembra fare esattamente ciò di cui hai bisogno: compila una funzione fornita dall'utente in fase di esecuzione e poi chiamala!

    
risposta data 24.05.2013 - 13:47
fonte
0

Tecnicamente, è possibile consentire al programma di creare una libreria e caricarla dinamicamente nel programma. Ma è molto improbabile che un tale programma possa avere successo. Per i principianti, a meno che tu non abbia come target gli sviluppatori C ++ come utenti, dovresti non presumere che sia presente un compilatore C ++.

Un approccio molto migliore è quello di incorporare un motore di scripting nel tuo programma e lasciare che gli utenti scrivano le estensioni nel linguaggio di scripting. Le possibilità qui sono ad esempio Boost.Python o Lua . In questo modo ottieni il meglio da entrambi i mondi: la velocità di C ++ per il tuo programma principale con la flessibilità dei linguaggi di scripting per le estensioni.

    
risposta data 24.05.2013 - 10:21
fonte

Leggi altre domande sui tag