2010-07-11 24 views
14

Je n'ai aucune expérience avec llvm ou clang, pour l'instant. De ce que je lis clang est dit être facilement intégrable Wikipedia-Clang, cependant, je n'ai pas trouvé de tutoriels sur la façon d'y parvenir. Alors est-il possible de fournir à l'utilisateur d'une application C++ des capacités de script en compilant JIT et en exécutant du code défini par l'utilisateur lors de l'exécution? Serait-il possible d'appeler les classes et méthodes propres aux applications et de partager des objets?Un tutoriel pour intégrer Clang en tant qu'interprète de script dans le code C++?

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

Répondre

10

Je ne connais pas de tutoriel, mais il est un interprète par exemple C dans la source Clang Cela pourrait être utile. Vous pouvez le trouver ici:

Vous n'aurez probablement pas beaucoup de choix de syntaxe pour votre langage de script si vous suivez cette route. Clang n'analyse que C, C++ et Objective C. Si vous voulez des variations, vous pouvez avoir du travail à faire pour vous.

+0

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

+0

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.) –

+1

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

0

Je ne sais pas Clang, mais vous voudrez peut-être regarder Ch:

http://www.softintegration.com/

Ceci est décrit comme intégrable ou autonome c/C++ interprète. Il y a un article Dr. Dobbs avec des exemples de l'intégrer ici:

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

Je ne l'ai pas fait plus que jouer avec lui, mais il semble être un produit stable et mature. C'est commercial, fermé, mais la version "standard" est décrite comme libre 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'incorporation dans un produit qui est ensuite vendu ou distribué. (Je ne suis pas un avocat, donc il faut vérifier avec SoftIntegration pour être certain des termes de la licence.)

5

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.

0

Je ne suis pas sûr que l'intégration d'un C ou C++ compilateur comme Clang est une bonne idée dans votre cas. Parce que le "script", c'est-à-dire le code (C ou C++) alimenté (à l'exécution!) Peut être arbitraire, donc être capable de planter l'application entière. En général, vous ne voulez pas que l'entrée d'un utilisateur défectueux bloque votre application. Si vous souhaitez intégrer un interpréteur, choisissez un objet conçu à cet effet, par exemple Guile ou Lua, et veillez à ce que les erreurs du script ne provoquent pas le blocage de l'application entière. Voir this answer pour une discussion plus détaillée de l'intégration de l'interpréteur.