c++ - tablas - lua tutorial
Ruby vs Lua como lenguaje de scripting para C++ (6)
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 en que pensar es en cuánto material orientado a objetos quieres que tus 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 tu situación también deberías considerar qué tan rápido quieres poner en marcha tu proyecto. 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.
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.
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.
Duro sobre esto? Sugerencias para usar Ruby como lenguaje de scripting (¿Probé SWIG, pero no es tan bueno como usar Lua)?
Gracias.
He usado Lua extensivamente 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 relacionado directamente: ninguno de estos se puede usar de manera confiable en un entorno multiproceso (por lo tanto, esto depende de la complejidad de su servidor).
- N subprocesos 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 corotines, pero no son paralelos.
- Los hilos de rubí no son realmente hilos, sino similares a las corotinas de Lua
Tenga en cuenta que aún puede crear un entorno para cada subproceso, pero no podrá comunicarse (excepto con un mecanismo de C ++). Esto es especialmente fácil en Lua.
He visto integrar Ruby en C / C ++ antes, y me pareció extremadamente difícil. Hay muchos desafíos que enfrentarás:
- Llamar a Ruby desde C / C ++ requiere la escritura de 2 capas de funciones (una capa para llamar y otra para detectar excepciones)
- Volver a llamar a C / C ++ desde Ruby requiere el trabajo normal de tipo SWIG
- Mover datos de un lado a otro requiere un seguimiento cuidadoso de las asignaciones, ya que Ruby querrá que la basura recolecte todo lo que pueda
Estoy seguro de que esto se puede hacer, pero me pareció extremadamente difícil, solo factible si puedes saltar a Ruby en un mínimo de puntos de entrada.
Me gustaría ir con lo que sea más fácil de aprender / tiene la mayor cantidad de jugadores usándolo. Desea que sea lo más accesible para sus clientes como sea posible.
Puede interesarte aprender sobre 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.
Ve 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.