Vous pouvez utiliser clang comme une bibliothèque pour implémenter la compilation JIT comme indiqué par d'autres réponses. Ensuite, vous devez charger le module compilé (disons une bibliothèque .so). Pour ce faire, vous pouvez utiliser dlopen (unix) standard ou LoadLibrary (windows) pour le charger, puis utiliser dlsym (unix) pour référencer dynamiquement les fonctions compilées, par exemple une fonction "script" main() dont le nom est connu. Notez que pour C++, vous devez utiliser des symboles mutilés. Une alternative portable est par ex. GNU libltdl. En alternative, le "script" peut s'exécuter automatiquement au moment du chargement en implémentant des fonctions init du module ou en mettant du code statique (le constructeur d'un objet C++ globalement défini sera appelé immédiatement).
Le module chargé peut directement appeler n'importe quoi dans l'application principale. Bien sûr, les symboles sont connus au moment de la compilation en utilisant les fichiers d'en-tête de l'application principale appropriée. Si vous voulez ajouter facilement des "plugins" C++ à votre programme, et connaître l'interface du composant a priori (dites que votre application principale connaît le nom et l'interface d'une classe chargée depuis son .h avant que le module ne soit chargé en mémoire), après le chargement dynamique de la bibliothèque, la classe est disponible pour être utilisée comme si elle était liée statiquement. Assurez-vous de ne pas essayer d'instancier un objet de classe avant de dlopen() son module. L'utilisation du code statique permet également d'implémenter de bons mécanismes d'enregistrement automatique des plugins.
Merci. Il m'a fallu un certain temps pour le mettre en marche - essentiellement parce que je n'ai pas trouvé l'exécutable :) Maintenant, après l'avoir regardé, je dirais qu'il est à mi-chemin. Maintenant, j'ai besoin de comprendre comment appeler les fonctions qui sont définies dans la partie non-jitted. ... des idées à ce sujet? – FFox
Je ne suis pas sûr de ce que vous voulez dire. Vous devriez être capable d'obtenir un pointeur sur n'importe quelle fonction que vous avez compilée. Peut-être que ce tutoriel LLVM général serait utile: http://llvm.org/docs/tutorial/ (chapitre 4, en particulier). Je ne m'attends pas à ce que vous puissiez utiliser cet interpréteur tel quel, mais cela devrait vous donner une idée de la façon d'intégrer un interpréteur C/C++ dans votre application. (Je ne l'ai même pas utilisé moi-même, je me souviens juste de l'avoir vu.) –
Ok, voici ce que j'ai fait: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-July/009836.html ... et cela a fonctionné avec l'aide des gentilles personnes de la liste de diffusion cfe-dev. Pourquoi pensez-vous que cet interpréteur ne peut pas être utilisé dans une application? – FFox