41 votes

Langage de script pour C ++

Je suis un peu rouillé dans les langages de script, à condition qu'ils éclater comme des champignons ces derniers temps :)

Aujourd'hui, j'ai pensé qu'il serait agréable d'avoir un langage de script qui parle parfaitement, C++, qui est, pourrait utiliser les classes C++, et, le plus important pour moi, peut être compilé en C++ ou certaines DLL/.DONC (en plus de son .h) pour que je puisse lien dans mon programme en C++ et utiliser les classes le script définit ou d'instruments.

Je sais que je pourrais intégrer n'importe quel langage de script tel que lua, ruby, python... mais l'interface comprend généralement une sorte de "eval" fonction qui évalue la condition du code de script. Selon l'outil utilisé pour couple C++ et le langage de script, l'intégration pour les rappels du script en C++ peut être plus ou moins facile à écrire, mais je n'ai pas vu tout langage de script qui permet effectivement de moi pour écrire des modules indépendants qui sont exposés en tant que .h et .so/dll à mon programme (peut-être le long des lignes d'un langage de script qui génère du code C++).

Connaissez-vous un tel outil/langage de script?

Merci à l'avance.

PD. J'ai été de penser le long des lignes de Vala ou Haskell GHC. Ils génèrent C, mais pas de C++...

35voto

Klaim Points 24511

Les suivantes sont des plus C++ intégration orientée de liaisons de langage :

  • ChaiScript - essaie en ce moment dans un petit projet, intéressant, celui-ci est FAIT avec du C++ dans l'esprit et fonctionne juste en incluant un en-tête de! Vous ne savez pas si c'est bon pour un gros projet, mais encore le verrez, l'essayer d'avoir du goût!
  • Falcon - essayer sur un gros projet, qui est excellent, ce n'est pas un "one comprennent embed" comme ChaiScript mais c'est parce que c'est vraiment flexible et totalement pensé pour être utilisé en C++ (C++ code dans libs) - j'ai décidé de rester avec elle pour mon plus grand projet qui nécessitent beaucoup de scripts de flexibilité (comparable à ruby/python )
  • AngelScript - je n'ai pas essayer encore
  • GameMonkey - je n'ai pas essayer encore
  • Io - je n'ai pas essayer encore

Pour vous, si vous voulez vraiment écrire votre script de module en C++ et facilement exposer au langage de script, je voudrais recommander d'aller avec Falcon. C'est totalement FAITE en C++, tous les modules/bibliothèques sont écrits de cette façon.

21voto

Daniel Earwicker Points 63298

La question généralement posée dans ce contexte est la suivante: comment puis-je exposer mes classes C++ de sorte qu'ils peuvent être instanciés à partir d'un script? Et la réponse est souvent quelque chose comme http://www.swig.org/

Vous vous posez la question opposée et il semble que vous êtes de nature à compliquer un peu. Un moteur de script qui l'a produite .h de fichiers et de .donc les fichiers ne seront pas vraiment un moteur de script serait - il un compilateur! Dans ce cas, vous pourriez utiliser C++.

Les moteurs de script ne fonctionne pas comme ça. Vous leur transmettre un script et quelques rappels de fournir un ensemble de fonctions qui peuvent être appelées à partir du script, et le moteur interprète le script.

21voto

Vitor Points 3312

Essayez lua: http://www.lua.org/

Pour l'utilisation de classes C++ en lua, vous pouvez utiliser:

Pour générer de la liaison utilisation tolua++: http://www.codenix.com/~tolua/

Il faut un nettoyés en-tête comme des entrées et sorties d'un fichier c qui fait le travail dur. Facile, agréable et un plaisir de travailler avec.

Pour l'utilisation de Lua objets en C++ je voudrais prendre l'approche de l'écriture d'un Proxy générique de l'objet avec des méthodes comme (champ, setField, callMethod, méthodes, champs).

Si vous voulez une dll, vous pourriez avoir l' .lua comme une ressource (dans Windows, je ne sais pas ce qui pourrait être un bon équivalent pour Linux) et sur votre DllMain initialiser votre proxy de l'objet avec le code lua.

Le code c++ pouvez ensuite utiliser le proxy de l'objet à appeler le code lua, avec peut-être un peu d'introspection méthodes dans le proxy pour rendre cette tâche plus facile.

Vous pourriez réutiliser l'objet proxy pour chaque bibliothèque lua vous voulez écrire, simplement en changeant le code lua fournies.

12voto

Dragontamer5788 Points 1280

C'est un peu en dehors de mon domaine d'expertise, mais je suis prêt à risquer les downvotes. :-)

Boost :: Python semble être ce que vous recherchez. Il utilise un peu de magie macro pour faire son travail, mais il expose les classes Python au C ++ plutôt proprement.

5voto

Dennis Points 1410

Je suis l'auteur de LikeMagic, C++ pour la bibliothèque de liaison pour les Io de la langue. (Je ne suis pas l'auteur de Io.)

http://github.com/dennisferron/LikeMagic

Un de mes objectifs clairs avec LikeMagic est complet et total C++ de l'interopérabilité, dans les deux directions. LikeMagic mobilisera natif Io types de types C++ (y compris la conversion entre les conteneurs STL et Io native de type Liste) et il représentera C++ classes, des méthodes, des champs et des tableaux dans les Io. Vous pouvez même passer d'un bloc de Io code de sortir de l'Oi de l'environnement et de l'utiliser en C++ comme un foncteur!!

Habillage de types C++ pour la consommation en Io script est simple, rapide et facile. Accéder à des objets de script à partir de C++ ne nécessitent une "eval" fonction de celle que vous avez décrite, mais le modèle en fonction de conversion de type et de regroupement permet d'accéder facilement à la suite de l'exécution d'un script chaîne. Et il n'y a ladite capacité de transformer Io bloc() des objets en C++ foncteurs.

Actuellement, le projet est encore dans les premiers stades, mais il est pleinement opérationnel. J'ai encore besoin de faire des choses comme document de ses étapes de génération et de dépendances, et il ne peut être construit avec gcc 4.4.1+ (pas de Microsoft Visual C++) car il utilise C++0x fonctionnalités ne sont pas encore pris en charge dans MSVC. Cependant, il ne prend entièrement en charge Linux et Windows, et Mac port est prévu.

Maintenant la mauvaise nouvelle: Rendre les scripts produire .h de fichiers et de .donc ou .les fichiers dll appelable à partir de C++ ne serait pas seulement besoin d' un compilateur (une sorte de) mais il faudrait aussi un compilateur JIT. C'est parce que (dans de nombreux langages de script, mais plus particulièrement dans les Io) d'un objet, les méthodes et les champs ne sont pas connus jusqu'à l'exécution, et dans les Io, les méthodes peuvent encore être ajoutés et supprimés à partir d'objets en direct! Au début, j'allais dire que le fait même que vous me demandez cela me fait me demander si peut-être vous ne comprenez pas vraiment ce qu'est un langage dynamique est. Mais je crois en une sorte de conception dans laquelle vous essayez d'abord d'imaginer l'idéal ou de la meilleure façon possible de faire quelque chose, et ensuite travailler à rebours à partir de là à ce qui est réellement possible. Et donc, je vais vous avouer à partir d'une facilité d'utilisation point de vue, ce que vous décrivez semble plus facile à utiliser.

Mais alors que c'est l'idéal, et à peine possible (à l'aide d'un langage de script avec compilation JIT), il n'est pas très pratique, je suis toujours pas sûr si ce que vous demandez est ce que vous voulez vraiment. Si l' .h et .so/.dll les fichiers sont JITted à partir du script, et les modifications de script, vous devez recompiler votre programme C++ pour prendre avantage de ce changement! N'est-ce pas violer le principal avantage de l'utilisation de script en premier lieu?

Le seul moyen c'est pratique serait si les interfaces définies les scripts ne changent pas, et vous ne sont tout simplement faire de C++ wrappers pour les fonctions de script. Vous auriez beaucoup de fonctions C++ comme:

int get_foo() { return script.eval("get_foo()"); }
int get_bar() { return script.eval("get_bar()"); }

Je vais avouer que c'est plus propre à la recherche de code à partir du point de vue de l'appelant de la fonction wrapper. Mais si c'est ce que vous voulez, pourquoi ne pas simplement utiliser la réflexion dans le langage de script et de générer un .h fichier à partir de la méthode des listes stockées dans les objets de script? Ce type de réflexion peut être fait facilement en Io. À un certain moment, j'ai l'intention d'intégrer l' OpenC++ source-à-source traducteur comme un "callable" bibliothèque de LikeMagic, ce qui signifie que vous pouvez même utiliser un robuste C++ générateur de code au lieu d'écrire des chaînes de caractères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X