Un tutoriel pour incorporer Clang en tant qu’interprète de script dans du code C ++?

Je n’ai pas encore d’expérience avec llvm ou Clang. D’après ce que j’ai lu, clang est facilement intégrable dans Wikipedia-Clang . Cependant, je n’ai trouvé aucun tutoriel sur la manière d’y parvenir. Ainsi, est-il possible de fournir à l’utilisateur d’une application c ++ des pouvoirs de script en compilant et en exécutant JIT du code défini par l’utilisateur au moment de l’exécution? Serait-il possible d’appeler les propres classes et méthodes des applications et de partager des objects?

edit: je préférerais une syntaxe de type C pour le script-languge (ou même le C ++ lui-même)

Je ne connais aucun tutoriel, mais il existe un exemple d’interpréteur C dans la source Clang qui pourrait être utile. Vous pouvez le trouver ici: http://llvm.org/viewvc/llvm-project/cfe/trunk/examples/clang-interpreter/

Si vous suivez cette voie, vous n’auriez probablement pas beaucoup de choix de syntaxe pour votre langage de script. Clang parsing uniquement C, C ++ et Objective C. Si vous voulez des variantes, votre travail sera peut-être fait pour vous.

Je pense que voici ce que vous avez décrit exactement.

http://root.cern.ch/drupal/content/cling

Vous pouvez utiliser clang en tant que bibliothèque pour implémenter la compilation JIT, comme indiqué par d’autres réponses. Ensuite, vous devez charger le module compilé (par exemple, une bibliothèque .so).

Pour ce faire, vous pouvez utiliser le standard dlopen (unix) ou LoadLibrary (windows) pour le charger, puis utiliser dlsym (unix) pour référencer de manière dynamic les fonctions compilées, par exemple une fonction de type “script” main () dont le nom est connu . Notez que pour C ++, vous devez utiliser des symboles mutilés. Une alternative portable est par exemple le libltdl de GNU.

Alternativement, le “script” peut s’exécuter automatiquement au moment du chargement en implémentant des fonctions de module init ou en mettant du code statique (le constructeur d’un object défini globalement en C ++ serait appelé immédiatement).

Le module chargé peut appeler directement 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 souhaitez append facilement des “plugins” C ++ à votre programme et connaître l’interface de composant à priori (par exemple, votre application principale connaît le nom et l’interface d’une classe chargée à partir de son fichier .h avant que le module ne soit chargé en mémoire), après avoir terminé. charge dynamicment la bibliothèque, la classe est disponible pour être utilisée comme si elle était liée statiquement. Assurez-vous simplement que vous n’essayez pas d’instancier un object de classe avant de dlopen () son module.

L’utilisation de code statique permet également d’implémenter de beaux mécanismes d’enregistrement automatique de plug-in.

Je ne sais pas à propos de Clang mais vous voudrez peut-être regarder Ch:

http://www.softintegration.com/

Ceci est décrit comme un interpréteur c / c ++ intégrable ou autonome. Il y a un article du Dr. Dobbs avec des exemples de son intégration ici:

http://www.drdobbs.com/architecture-and-design/212201774

Je n’ai pas fait plus que jouer avec, mais il semble être un produit stable et mature. C’est commercial, à code source fermé, mais la version “standard” est décrite comme gratuite pour un usage personnel et commercial. Cependant, en regardant la licence, il semble que “commercial” ne peut inclure que l’utilisation interne de l’entreprise, et non l’intégration à un produit qui est ensuite vendu ou dissortingbué. (Je ne suis pas avocat, il est donc clair que vous devez vérifier auprès de SoftIntegration pour être certain des termes de la licence.)

Je ne suis pas sûr que l’incorporation d’un compilateur C ou C ++ comme Clang soit une bonne idée dans votre cas. Parce que le “script”, c’est-à-dire le code (C ou C ++) alimenté (au moment de l’exécution!) Peut être arbitraire, il est donc possible de bloquer l’application entière. En général, vous ne voulez pas que des entrées utilisateur défectueuses puissent bloquer votre application.

Si vous souhaitez intégrer un interprète, choisissez un élément conçu à cet effet, tel que Guile ou Lua , et veillez à ce que les erreurs du script ne bloquent pas l’application dans son intégralité. Voir cette réponse pour une discussion plus détaillée de l’intégration d’interprète.