web-dev-qa-db-fra.com

Langage de script pour C ++

Je rouille un peu dans les langages de script, à condition qu'ils éclatent comme des champignons récemment :)

Aujourd'hui, je pensais que ce serait bien d'avoir un langage de script qui parle parfaitement au C++, c'est-à-dire qui pourrait utiliser des classes C++ et, le plus important pour moi, pourrait être compilé en C++ ou en une DLL/.SO (plus son. h) afin que je puisse le lier à mon programme C++ et utiliser les classes que le script définit ou implémente.

Je sais que je pourrais intégrer n'importe quel langage de script populaire tel que lua, Ruby, python ... mais l'interface comprend généralement une sorte de fonction "eval" qui évalue le code de script fourni. Selon l'outil utilisé pour coupler C++ et le langage de script, l'intégration des rappels du script dans C++ pourrait être plus ou moins facile à écrire, mais je n'ai vu aucun langage de script qui me permette d'écrire des modules indépendants qui sont exposé en tant que .h et .so/dll à mon programme (peut-être le long d'un langage de script qui génère du code C++).

Connaissez-vous un tel outil/langage de script?

Merci d'avance.

PD. J'ai pensé dans le sens de Vala ou du GHC de Haskell. Ils génèrent du C, mais pas du C++ ...

39
Diego Sevilla

Les liens suivants sont davantage orientés vers l'intégration C++ que les liaisons de langage:

  • ChaiScript - essayant en ce moment dans un petit projet, intéressant, celui-ci est fait avec C++ à l'esprit et fonctionne en incluant juste un en-tête! Je ne sais pas si c'est encore bon pour un gros projet mais allez voir, essayez-le pour avoir du goût!
  • Falcon - essayer un gros projet, excellent; ce n'est pas un "one include embed" comme ChaiScript mais c'est parce qu'il est vraiment flexible, et totalement pensé pour être utilisé en C++ (uniquement le code C++ dans les bibliothèques) - j'ai décidé de m'en tenir à mon plus grand projet qui nécessite beaucoup de flexibilité de script (comparable à Ruby/python)
  • AngelScript - n'a pas encore essayé
  • GameMonkey - n'a pas encore essayé
  • Io - n'a pas encore essayé

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

32
Klaim

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

Pour utiliser des classes C++ dans lua, vous pouvez utiliser:

Pour générer une liaison, utilisez tolua ++: http://www.codenix.com/~tolua/

Il prend un en-tête nettoyé en entrée et génère un fichier c qui fait le travail difficile. Facile, agréable et un plaisir de travailler avec.

Pour utiliser des objets Lua en C++, j'opterais pour l'écriture d'un objet Proxy générique avec des méthodes comme (champ, setField, callMethod, méthodes, champs).

Si vous voulez une DLL, vous pouvez avoir le .lua comme ressource (sous Windows, je ne sais pas ce qui pourrait être un équivalent approprié pour Linux) et sur votre DllMain initialisez votre objet proxy avec le code lua.

Le code c ++ peut ensuite utiliser l'objet proxy pour appeler le code lua, avec peut-être quelques méthodes d'introspection dans le proxy pour faciliter cette tâche.

Vous pouvez simplement réutiliser l'objet proxy pour chaque bibliothèque lua que vous souhaitez écrire, en changeant simplement le code lua qui lui est fourni.

21
Vitor Py

La question généralement posée dans ce contexte est: comment exposer mes classes C++ afin qu'elles puissent être instanciées à partir d'un script? Et la réponse est souvent quelque chose comme http://www.swig.org/

Vous posez la question opposée et il semble que vous compliquez un peu les choses. Un moteur de script qui produirait des fichiers .h et .so ne serait pas vraiment un moteur de script - ce serait un compilateur! Dans ce cas, vous pouvez utiliser C++.

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

21
Daniel Earwicker

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

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

13
Dragontamer5788

Je suis l'auteur de LikeMagic, une bibliothèque de liaisons C++ pour le langage Io. (Je ne suis pas l'auteur de Io.)

http://github.com/dennisferron/LikeMagic

L'un de mes objectifs explicites avec LikeMagic est l'interopérabilité C++ complète et totale, dans les deux sens. LikeMagic rassemblera les types Io natifs en tant que types C++ (y compris la conversion entre les conteneurs STL et le type List natif d'Io) et il représentera les classes, méthodes, champs et tableaux C++ dans Io. Vous pouvez même passer un bloc de code Io out de l'environnement Io et l'utiliser en C++ comme foncteur !!

L'emballage des types C++ pour la consommation dans le script Io est simple, rapide et facile. L'accès aux objets de script à partir de C++ nécessite une fonction "eval" comme vous l'avez décrit, mais la conversion de type et le marshaling basés sur un modèle facilitent l'accès au résultat de l'exécution d'une chaîne de script. Et il y a la capacité susmentionnée de transformer les objets Io block () en foncteurs C++.

À l'heure actuelle, le projet en est encore à ses débuts, bien qu'il soit pleinement opérationnel. J'ai encore besoin de faire des choses comme documenter ses étapes de construction et ses dépendances, et il ne peut être construit qu'avec gcc 4.4.1+ (pas Microsoft Visual C++) car il utilise des fonctionnalités C++ 0x non encore prises en charge dans MSVC. Cependant, il prend entièrement en charge Linux et Windows, et un port Mac est prévu.

Maintenant, la mauvaise nouvelle: faire en sorte que les scripts produisent des fichiers .h et des fichiers .so ou .dll appelables à partir de C++ nécessiterait non seulement un compilateur (d'une sorte) mais cela devrait également être = un compilateur JIT. C'est parce que (dans de nombreux langages de script, mais surtout dans Io) les méthodes et les champs d'un objet ne sont pas connus avant l'exécution - et dans Io, les méthodes peuvent même être ajoutées et supprimées des objets vivants! Au début, j'allais dire que le fait même que vous demandiez cela me fait me demander si vous ne comprenez peut-être pas vraiment ce qu'est un langage dynamique . Mais je crois en une manière de concevoir dans laquelle vous essayez d'abord d'imaginer la manière idéale ou la plus simple possible de faire quelque chose, puis de revenir en arrière de ce qui est réellement possible. Et donc je vais admettre d'un point de vue de la facilité d'utilisation, ce que vous décrivez les sons plus faciles à utiliser.

Mais bien qu'il soit idéal et à peine possible (en utilisant un langage de script avec une compilation JIT), ce n'est pas très pratique, donc je ne sais toujours pas si ce que vous demandez est ce que vous voulez vraiment. Si les fichiers .h et .so/.dll sont JITtés à partir du script et que le script change, vous devrez recompiler votre programme C++ pour profiter de la modification! Cela ne viole-t-il pas le principal avantage de l'utilisation du script en premier lieu?

La seule manière pratique serait que les interfaces définies les scripts ne changent pas, et que vous créez simplement des wrappers C++ pour les fonctions de script. Vous finiriez par avoir beaucoup de fonctions C++ comme:

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

J'admets que c'est un code plus propre du point de vue des appelants 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 générer un fichier .h à partir des listes de méthodes stockées dans les objets de script? Ce type de réflexion peut être facile à faire en Io . À un moment donné, je prévois d'intégrer le traducteur source à source OpenC++ en tant que bibliothèque appelable de LikeMagic, ce qui signifie que vous pourriez même utiliser un générateur de code C++ robuste au lieu d'écrire des chaînes.

5
Dennis

Vous pouvez le faire avec Lua, mais si vous avez beaucoup de classes, vous voudrez un outil comme SWIG ou toLua ++ pour générer une partie du code de colle pour vous.

Aucun de ces outils ne traitera la partie inhabituelle de votre problème, qui est d'avoir un fichier .h derrière lequel est caché un langage de script, et d'avoir vos scripts d'appel de code C++ sans savoir que ce sont des scripts. Pour ce faire, vous devrez procéder comme suit:

  • Écrivez vous-même le code de la colle. (Pour Lua, c'est relativement facile, jusqu'à ce que vous entriez dans les classes, après quoi ce n'est pas si facile, c'est pourquoi des outils comme SWIG et toLua ++ existent.)

  • Cachez derrière l'interface une sorte d'état global de l'interpréteur de script.

  • En supposant que vous ayez plusieurs fichiers .h que chacun est implémenté à l'aide de scripts, vous devez décider lesquels partagent l'état dans le langage de script et lesquels utilisent des états de script distincts. (Ce que vous avez essentiellement est un VM pour le langage de script, et les extrêmes sont (a) tous les fichiers .h utilisent le même VM en commun et ( b) chaque fichier .h a sa propre machine virtuelle séparée et isolée. D'autres choix sont plus compliqués.)

Si vous décidez de le faire vous-même, l'écriture du code de collage pour transformer les tables Lua en classes C++ (afin que le code Lua ressemble au C++ pour le reste du programme) est assez simple. Aller dans l'autre sens, où vous enveloppez votre C++ dans Lua (de sorte que les objets C++ regardent les scripts comme des valeurs Lua) est une grosse douleur dans le cul.

Peu importe ce que vous faites, vous avez du travail devant vous.

2
Norman Ramsey

moteur V8 de Google est écrit en C++, je pense que vous pourrez peut-être l'intégrer dans un projet. Ils parlent de faire ça dans cet article .

1
T.J. Crowder

Bonne question, j'y ai souvent pensé moi-même, mais hélas il n'y a pas de solution facile à ce genre de chose. Si vous êtes sous Windows (je suppose que non), vous pouvez obtenir quelque chose comme ça en créant des composants COM en C++ et VB (en considérant cela comme un langage de script). La conversation se fait via des interfaces COM , qui est une bonne façon d'interopérer entre des langages disparates. Il en va de même pour les langages basés sur .NET qui peuvent interagir entre eux.

Moi aussi, je suis impatient de savoir si quelque chose comme ça existe pour C++, de préférence open source.

1
tathagata

Vous pouvez vérifier l'intégration Guile (un interpréteur de schéma) ou V8 (l'interpréteur javascript de Google - utilisé dans Chrome - qui est écrit en C++ ).

0
Ben Collins

Essayez le langage de programmation Ring http://ring-lang.net

(1) Extension utilisant les langages C/C++ https://en.wikibooks.org/wiki/Ring/Lessons/Extension_using_the_C/C%2B%2B_languages

(2) Intégration de l'interpréteur d'anneaux dans les programmes C/C++ https://en.wikibooks.org/wiki/Ring/Lessons/Embedding_Ring_Interpreter_in_C/C%2B%2B_Programs

(3) Générateur de code pour encapsuler les bibliothèques C/C++ https://en.wikibooks.org/wiki/Ring/Lessons/Code_Generator_for_wrapping_C/C%2B%2B_Libraries

0
msfclipper