Quel langage de script est le mieux adapté à l’intégration dans une application C / C ++ multithread

Considérant les exigences suivantes:

  • Doit être pris en charge sous Windows. Fonctionne de préférence aussi sur d’autres plates-formes.
  • Doit supporter le multi threading. Je veux dire par là que le moteur peut fonctionner en parallèle dans plusieurs threads.
  • La lisibilité est importante.
  • La licence doit être compatible avec les projets à source fermée.

J’aime Python pour sa lisibilité. Je suis aussi plus expérimenté avec Python que les autres langages de script. Cependant, CPython n’est pas multi-thread et IronPython nécessite l’hébergement du CLR et d’un langage compatible (C ++ / CLI ou C #).

Vous pourriez envisager d’intégrer un moteur JavaScript populaire. Non seulement ils seront rapides et bien pris en charge, mais de nombreuses personnes savent programmer en JavaScript, ce qui facilitera leur adoption et leur lecture par un large public.

Selon cette réponse, le moteur SpiderMonkey est compatible avec les threads, alors que le V8 de Google / Chrome peut ne pas l’être.

Lua pourrait être intéressant de vérifier. Il peut être utilisé de manière sécurisée et le langage prend en charge un concept de «co-routine» qui pourrait répondre à vos besoins.

Lua est le meilleur choix. Python, Ruby et JavaScript sont de grands langages et ne sont pas conçus pour être intégrés. Mais Lua est différent, conçu pour s’intégrer.

Vous devriez considérer la “ressortingction” plus que toute autre chose pour votre langage de script. Les scripts intégrés peuvent être utilisés pour pirater (mauvaise signification) facilement.

Par exemple, par défaut, Lua ne peut pas imprimer sur la console. Comme je le sais, Blizzard utilise le Lua à cause de ça.

J’ai été confronté au même dilemme: choisir Lua sur Python et JScript. Ce que Lua fait de mieux, c’est le bon interopérabilité avec du code C / C ++ utilisant des bibliothèques comme luabridge et luabind. Autrement dit, vous pouvez appeler lua depuis C ++ et faire en sorte que le script soit renvoyé sans problème dans C ++, accéder aux données c ++ à partir du script et inversement.

Le problème avec les langages tels que Python et Lua est que le langage n’est pas vraiment multithread au sens habituel du mot: si un C ++ l’utilise en utilisant le moteur de script de langage pour exécuter un script, vous ne pouvez pas utiliser le même moteur pour en exécuter un autre scénario. Les deux langues ont un locking à l’échelle du moteur qui peut être utilisé dans ces cas pour garantir l’intégrité du moteur. Cependant, les deux langages sont multi-threads dans le sens où vous pouvez exécuter une fonction en arrière-plan et interagir avec n’importe quel object de synchronisation souhaité (comme pour C ++). J’ai donc choisi de faire en sorte que tous les threads créés à partir de C ++ et du code de script ne s’exécutent que dans un thread dédié (thread par moteur) et interagissent régulièrement avec les autres threads de l’application.

Si vous avez besoin de passer des données et du contrôle de C ++ à un script et vice versa, Lua est bien meilleur que Python. À côté de cela, je n’accueillerais pas le CLR dans un projet C ++. C’est trop salissant.

JScript est une excellente solution. Il est déjà pris en charge avec Windows Script Host et émule le multithreading avec les événements. C’est plus facile à utiliser que Python, je vous le promets. Cet article MSDN est une excellente référence.

On pourrait utiliser Guile , qui est un schéma intégrable.

Lua est vraiment facile à intégrer et peut fonctionner dans plusieurs threads en utilisant quelque chose comme Lua Lanes (qui est multi-plateforme Windows / Linux / MacOS).

Je suis presque sûr que Python sans stack sera le seul à prendre en charge le multithreading. Stackless Python a été choisi par CCP pour son MMO: Eve-Online spécifiquement parce que la nature empilée du code leur permettait de planifier les continuations sur les threads du système d’exploitation nécessaires après avoir créé les primitives nécessaires pour sécuriser l’ensemble du thread.

Lua peut être utilisé dans un environnement multi-thread, mais chaque thread simultané aurait besoin d’un object lua_State distinct. Vous devrez donc créer votre propre système de transmission de messages inter-interprètes pour le code lua, afin de communiquer.

Vous pouvez essayer spidermonkey. Découvrez l’encapsuleur basé sur des modèles C ++ de Libjspp pour l’incorporation et l’extension de spidermonkey de moteur Javascript: http://code.google.com/p/libjspp/

Entièrement basé sur les préférences. La plupart des langues ont un moyen d’intégrer C avec des options d’exportation dans l’environnement de script.

Si c’était moi, je partirais avec le Javascript V8.

Par “multithread”, je suppose que vous voulez dire “peut exploiter efficacement plusieurs cœurs”? Si votre système ne dispose que d’un seul processeur, vous ne ferez qu’une seule chose, quel que soit le langage de script choisi.

Si vous décidez d’aller sur l’itinéraire CPython, la principale chose à retenir est que seul le moteur de script lui-même est protégé par le verrou d’interpréteur global. Si le script exécuté passe beaucoup de temps à appeler du code non-Python (y compris les opérations d’E / S et d’autres opérations au niveau du système), il peut alors exploiter plusieurs threads avec bonheur.

Un autre facteur à prendre en compte est que les capacités d’introspection de Python le rendent insortingnsèquement difficile à sécuriser correctement (Google l’a fait pour AppEngine, mais ils ont dû interdire un certain nombre de tâches).

Compte tenu de la prédominance des moteurs Javascript dans les navigateurs et les moteurs Lua dans les jeux PC, l’une de ces solutions est probablement la solution la plus simple.

Essayez le langage de programmation Falcon