12
votes

Comment puis-je créer un programme Nasty C ++ scriptable avec Python et / ou Lua?

Je suis confronté à la tâche de faire une application C ++ script par les utilisateurs. L'application est en développement depuis plusieurs années avec personne qui gaspille une pensée à ce sujet avant. Il contient toutes sortes de diéties telles que multithreading, magiciennes et héritage multiple. En tant que langue de script, Python est préférable, mais Lua pourrait être accepté s'il est nettement plus facile de mettre en œuvre.

Question 1

De ce que j'ai appris jusqu'à présent, il existe de manière généreusement deux façons d'intégrer Python / Lua avec C ++: "Extension" et "Incorporation".

Dans ce cas, on dirait que j'ai besoin de la fois. Le langage de script a besoin d'un accès aux objets, méthodes et données de l'application mais doit être appelé par l'application une fois que l'utilisateur a écrit le script - sans rien redémarrer.

Comment cela est-il habituellement fait dans le monde réel?

question 2

Il semble y avoir un éventail de solutions manuelles et de générateurs de liaison, tous, tous moins que parfaits.

  • Swig, Pyste, Py ++, Ctypes, Boost.python SIP, Pycxx, Pybindgen, Robin, (Cython / Pyrex, Weave)
  • cppplua, diluculum, Luabind, Luabridge, LuaCPP, Luna / Lunawrapper, Mluabind, Multiscript, Oolua, SLB, Sweet Lua, Lux (Cette liste du Wiki Lua)
  • CPB, tolua, tolua ++, toluaxx, luna et à nouveau Swig

    La plupart des crédits sur ceux-ci trouvés sur la bande sont un peu obsolètes. Par exemple, on dit que Swig est difficile dans des cas non triviaux et de générer du code incompréhensible. OTOH, il est récemment allé à V2.0.

    Une partie de l'utilisation ci-dessus utilise pygccxml pour permettre à GCC analyser le code C ++, puis générer la liaison. Je trouve cette idée attrayante, car GCC comprend probablement le code mieux que moi :-). Cela fonctionne-t-il bien?

    Testez tous peut facilement me coûter la moitié du temps alloué pour l'ensemble du projet.

    Alors, lesquels recommandez-vous?


4 commentaires

Cela fonctionnerait beaucoup mieux lors de l'affichage de 3 questions distinctes - une nouvelle Q par langue pour le meilleur clavier. Pour cela, il y a probablement aussi des duplicats déjà.


"Personne ne gaspillant une pensée à ce sujet avant" - heh! J'ai travaillé sur quelques projets qui avaient clairement été développé par une personne très frugale avec leurs pensées :)


@ Georg Fritzsche Je sentais que des questions distinctes pourraient être fronça les sourcils, un peu comme la traversée des groupes de discussion. DUPLICATES: Oui, mais je ne peux pas trouver grand chose sur le problème spécifique de faire des choses utilisateur scriptables. Connaissez-vous d'un exemple facilement grokkable de comment faire cela (étendre et incorporé)?


Cela dépend de la langue dont vous parlez. Des questions distinctes sont bien meilleures ici - elles peuvent potentiellement être répondues par différentes personnes, sont faciles à trouver lors de la recherche, ... En bref, plus le mieux axé. (Sidenote: Cet espace après que les notifications @ rendent ne fonctionnent pas et que vous n'avez pas besoin du nom complet - voir ici .)


5 Réponses :


12
votes

Je ne recommanderais pas Swig car il est difficile de le faire pour générer une liaison satisfaisante dans des situations complexes: y a été fait. J'ai dû écrire un script horrible qui "analysé" le code C ++ original pour générer un code C ++ acceptable que Swig pourrait mâcher et générer des liaisons acceptables. Donc, en général: éviter toute solution qui repose sur l'analyse du programme original C ++.

Entre Lua et Python: J'ai trouvé beaucoup de Lua, beaucoup mieux documenté et plus proprement mis en œuvre. Python a un gil (verrouillage global), alors qu'avec Lua, vous pouvez avoir une instance d'interprète dans chaque fil, par exemple. Donc, si vous pouvez choisir, je recommanderais Lua. C'est une langue plus petite, plus facile à comprendre, plus facile à intégrer (une API beaucoup plus propre et plus petite, avec une excellente documentation). J'ai utilisé Luabind pour un petit projet de mien et j'ai trouvé facile à utiliser.


4 commentaires

Gil signifie Global Interprète LOCK. Si vous avez des interprètes distincts, je ne vois pas comment le GIL sera pertinent, sauf si vous souhaitez enfiler à l'intérieur de chaque interprète.


J'irais aussi avec Lua. L'API C est très simple. Je crée presque toujours des liaisons Lua à la main.


@Detly Ceci est une cité de la documentation de l'API C Python à docs.python.org/c- API / INIT.HTML "Le verrouillage de l'interprète global est également partagé par tous les threads, quel que soit l'interprète qu'ils appartiennent."


@zcrba - Droite, je suis corrigé. Merci pour la référence.



0
votes

Mon expérience peut ne pas être beaucoup, mais je pense que cela vaut au moins vaut ce que vous avez payé pour cela;)

J'ai fait des modules de base "Hello World" Python, et je ne pouvais pas vraiment entrer dans Swig - cela semblait être beaucoup de frais généraux pour ce que je faisais. Bien sûr, il est également possible que ce soit juste la bonne quantité à vos besoins.


0 commentaires

1
votes

Concernant la question 1 - Oui, vous devez faire les deux.

Vous exposeriez votre interface de script d'applications à un interprète intégré, qui exécute ensuite le script utilisateur en question.

La section des manuels Python sur l'encreur comprend une section étendue python incorporé < / a> et il y a des tutoriels pour des choses similaires pour Lua, voir par exemple Cet article . Bien sûr, il existe probablement des moyens plus faciles à trouver lorsque vous avez décidé avec quel langage de script et quel mécanisme de liaison vous voulez aller.


0 commentaires

0
votes

Essayez Boost :: Python, il a un peu une courbe d'apprentissage associée à celle-ci, mais c'est le meilleur outil pour le travail à mon avis, nous avons un vaste système en temps réel et développé la bibliothèque de script pour l'AQ à Boost: : Python.


0 commentaires

1
votes

Une partie de l'utilisation ci-dessus utilise pygccxml pour permettre à GCC analyser le code C ++, puis générer la liaison. Je trouve cette idée attrayante, car GCC comprend probablement le code mieux que moi :-). Cela fonctionne-t-il bien?

Une approche similaire est utilisée dans la liaison Lua QT - LQT . Il utilise CPPtoxML pour générer un fichier XML contenant toutes les classes et les méthodes avec des paramètres et la liaison générée C ++ code en fonction de celle.

Cela fonctionne vraiment bien, le générateur est capable de lier presque toutes les classes et méthodes Qt, y compris des méthodes virtuelles, des opérateurs surchargés, des classes de modèle sélectionnées, un mécanisme de signal / emplacement, etc.

Bien qu'il ait été créé spécialement pour qt, il a un mode "noqt", dans lequel il peut servir de classeur générique, je n'ai malheureusement aucune expérience avec elle, donc je ne peux donc pas dire combien de travail ce serait de lier votre code.


0 commentaires