2011-03-16 13 views
23

Actualmente estoy construyendo un servidor de juegos (no un motor), y quiero que sea extensible, como un sistema de complementos.
La solución que encontré es usar un lenguaje de scripting. Hasta aquí todo bien.Ruby vs Lua como lenguaje de scripting para C++

No estoy seguro de si debería usar Ruby o Lua. Lua es más fácil de integrar, pero Ruby tiene una biblioteca más grande y una mejor sintaxis (en mi opinión). El problema es que no hay una manera fácil de usar Ruby como lenguaje de scripting con C++, mientras que es muy fácil con Lua.

¿Tiene dudas sobre esto? Sugerencias para usar Ruby como lenguaje de scripting (¿Probé SWIG, pero no es tan bueno como usar Lua)?

Gracias.

+5

Si crees que Lua es demasiado simplista y Ruby demasiado difícil de integrar, ¿deberías considerar Python? – Macke

+2

Si está exponiendo una base de código (especialmente un servidor) ¿realmente desea una biblioteca grande? Puede dedicar más esfuerzos a eliminar las características peligrosas de la biblioteca que los usuarios pueden explotar cuando se trata de sandboxing. –

Respuesta

8

He usado Lua extensamente en el pasado.

Luabind es realmente fácil de usar, no hay necesidad de un generador externo como SWIG, el documento es excelente. Los tiempos de compilación siguen siendo decentes.

El mayor problema que he visto: lua es principalmente ... de solo escritura. Realmente no tienes clases, pero solo las matrices asociativas con un poco de azúcar sintáctica (objeto ['clave'] pueden escribirse objeto.clave), por lo que fácilmente puedes agregar un 'miembro' en una función oscura, olvidarse por completo al respecto, y tener efectos secundarios más adelante.

Por esta razón, y solo por esta razón, preferiría Python. Boost :: Python es la base de Luabind, por lo que ambos tienen una API similar (Luabind solía ser un poco más fácil de construir, pero ya no). En términos de funcionalidad, son bastante equivalentes.

No está directamente relacionado: ninguno de estos se puede utilizar de forma fiable en un entorno multiproceso (por lo que esto depende de la complejidad de su servidor).

  • N hilos de Python: el GIL (Global Interpreter Lock) está en camino. Cada vez que utiliza una variable en un hilo, está bloqueada, por lo que arruina el punto, excepto para operaciones de E/S largas y llamadas a funciones C.
  • lua tiene corrutinas, pero no son paralelas.
  • hilos Ruby no son realmente los hilos, pero similar a la co-rutinas de Lua

Tenga en cuenta que todavía se puede crear un environement para cada hilo, pero no será capaz de comunicarse (excepto con una maquinaria de C++) . Esto es especialmente fácil en Lua.

+1

Con Lua, la tarea de subprocesamiento múltiple se puede resolver usando [LuaLanes] (http://kotisivu.dnainternet.net/askok/bin/lanes/). – jpjacobs

+4

@ Calvin1602 Las versiones más nuevas de Ruby (1.9+) utilizan hilos de nivel de sistema reales. Todavía tiene un GIL, lo que lo coloca en igualdad de condiciones con Python. – dunedain289

+0

@ dunedain289: es bueno saberlo, gracias. @jpjacobs: Estoy al tanto de LuaLanes, pero nunca lo intenté. Se siente un poco "antinatural", pero debería intentarlo. – Calvin1602

0

Me gustaría ir con lo que sea más fácil de aprender/tiene la mayor cantidad de jugadores que lo usan. Desea que sea lo más accesible para sus clientes como sea posible.

+0

¿Por qué debería importar la cantidad de jugadores? –

5

Puede que le interese saber Squirrel. Creo que fue el lenguaje de scripting utilizado por Left 4 Dead 2. Es más avanzado que lua (usa objetos y clases) y está pensado para integrarse fácilmente en una aplicación de C++, que suena exactamente como lo que estás buscando.

+0

Gracias. ¿Hay algún libro sobre cómo incrustar el lenguaje Squirrel en C++? – bl00dshooter

+0

Ninguno, por lo que sé, es un lenguaje de script bastante nuevo. No dejes que el '3.0' te engañe, ha existido desde 2004, pero no se ha usado tanto como algunos otros lenguajes de scripting. La documentación (vinculada en la página principal) parece buena. – James

10

He considerado incrustar Ruby en C/C++ antes, y me pareció extremadamente difícil. Hay una gran cantidad de retos que se enfrentará:

  • poner en Rubí de C/C++ requiere 2 capas de funciones para ser escrito (una capa a llamar, y uno para la captura de excepciones)
  • Llamando de nuevo en C/C++ desde Ruby requiere el trabajo normal de tipo TRAGO
  • Mover datos de ida y vuelta requiere mantener un registro cuidadoso de las asignaciones, ya Rubí querrá recoger la basura todo lo que pueda

estoy seguro de que este puede hacerse, pero parecía e Es extremadamente difícil para mí, solo factible si puedes saltar a Ruby en un mínimo de puntos de entrada.

2

Vaya por lua, aunque recomendaría luajit, no solo por la velocidad, sino por la nueva biblioteca de ffi, impulsando la intercomunicación al máximo :). Lua también tiene tonos de módulos, y los nuevos son muy fáciles de crear, esto compensa la falta en su stdlib.

1

Una cosa que Lua tiene a su favor es su capacidad de transferir datos entre C++ (o C) y sí mismo muy fácilmente. Básicamente, solo estás presionando/estallando datos en una pila para poder comunicarte entre los dos. Tener múltiples entornos Lua en funcionamiento al mismo tiempo es bastante simple también (si necesitara esa funcionalidad). Aunque Lua es un lenguaje recogido de basura, es fácil evitar que lo haga en datos que necesitan permanecer en su código C++. Crear un sistema de complemento extensible debería ser fácil con Lua una vez que sentar las bases. El intercambio de complementos (en este caso, secuencias de comandos) dentro y fuera en el tiempo de ejecución también es bastante trivial (aunque esto también puede ser cierto para Ruby, no estoy lo suficientemente familiarizado como para saberlo).

Una cosa a tener en cuenta es la cantidad de material orientado a objetos que desea que sus scripts puedan manejar. Lua usa funciones, tablas, metatablas y prototipos para implementar una programación tipo OO. A algunas personas les gusta, otras no; Personalmente, me pareció interesante de usar, aunque un poco torpe a veces. Al no haber usado Ruby, no puedo hablar por ello, pero es posible que desee sopesar su necesidad de soporte de objeto/clase.

Creo que en su situación también debe considerar qué tan rápido quiere que su proyecto esté en funcionamiento. Como usted y otros han notado, Ruby es difícil de integrar en C++, mientras que Lua no lo es. El tiempo siempre es precioso y si quieres obtener algo que funcione lo antes posible, Lua es probablemente tu mejor opción.

Cuestiones relacionadas