¿Motor de secuencias de comandos integrable en C ++ que se puede terminar a voluntad?

Estoy haciendo un juego de programación en C++ y Qt, pero tengo una restricción única en cuanto a mi elección de motores; Debido a que es posible que el reproductor pueda escribir código que se repite infinitamente o toma mucho tiempo para ejecutarse, necesito poder terminar la ejecución de un motor de secuencias de comandos en cualquier momento. Ayer hice una pregunta sobre esto en StackOverflow y, lamentablemente, no hay forma de eliminar un subproceso en C++ sin causar problemas de recursos (bloqueos que no se liberan, fugas de memoria, etc.).

Se me informó que necesito un motor de secuencias de comandos que me permita finalizar las secuencias de comandos a voluntad sin poner en peligro la sesión del jugador. ¿Qué opciones tengo, sujeto a estos requisitos?

  • Debe ser integrable en una aplicación C++.
  • Debe funcionar en Windows, Mac, Linux y Android.
  • No es necesario que sea un lenguaje convencional como Python, pero debe ser enseñable a alguien completamente nuevo en programación.
    • Haskell, Scheme, Prolog, etc. están descartados a menos que pueda convencerme de que serían buenos primeros idiomas para que los aprenda un niño de 11 años.
  • Necesito poder detener la ejecución de un script en cualquier momento.
    • No puedo matar el hilo en sí mismo, así que ¿por qué no matar el motor de secuencias de comandos?
  • Debo tener control total sobre el contexto de secuencias de comandos (por ejemplo, qué objetos/funciones/tipos están disponibles).
  • La integración de Qt estaría bien, pero es opcional (puedo hacer mi propio envoltorio).
  • No es necesario que sea muy rápido: el código del reproductor se ejecutará repetidamente, pero no más de una vez cada medio segundo aproximadamente.
  • Debo poder llamar a funciones de C++ desde este motor de secuencias de comandos y debo poder llamar a funciones escritas en este lenguaje de secuencias de comandos desde C++.
En realidad, es posible que no necesite la capacidad de terminar el motor de secuencias de comandos a voluntad. Bien podría ser suficiente poder indicarle que desea que finalice un script de ejecución prolongada; o podría hacer que use tiempos de espera internamente, como setTImeout() de Javascript
Recuerde también que puede instruir a los usuarios para que escriban secuencias de comandos simples, utilizando un pequeño subconjunto de la gramática del lenguaje de secuencias de comandos, y si intentan escribir algo más complejo, depende de ellos. Y una nota final: compruebe qué usan los juegos FOSS existentes (0 AD, Battle for Wesnoth, Cave Story), al menos algunos de ellos usan un motor de secuencias de comandos, y también puede obtener inspiración sobre cómo usarlo.

Respuestas (1)

Es posible que desee probar Lua .

  • Es integrable en C o C++

  • Es portátil (funciona en todas las plataformas que tienen un compilador de C)

  • es un lenguaje bastante facil

  • Puede llamar a Lua desde C++ y al revés (incluso anidado varias veces)

  • Tiene control total sobre qué funcionalidad/objetos/... se proporcionan a los scripts

  • Según tengo entendido, debería ser factible terminar un motor Lua en ejecución en un entorno de subprocesos múltiples

Si desea permanecer completamente dentro de C++, es posible que le interese luabind .

@JesseTG: La batalla por Wesnoth usa mucho a Lua.
Muchos juegos lo hacen: por ejemplo, WoW (para complementos de usuario) y Civilization V, solo para nombrar 2 títulos AAA de la parte superior de mi cabeza
Si Lua se ejecuta bajo un subproceso de C++ y lo finaliza, finaliza el subproceso de C++ y viola la objeción original del OP. ¿Por qué es esta una respuesta?