Reddit – love2d – Los contras de la programación de juegos en Lua

Intro

Para empezar, he programado muy poco en Lua. Hice este juego súper sencillo, y actualmente estoy trabajando en otro. Sin embargo, ha sido suficiente para hacerme ver algunas de las desventajas de programar en Lua.

Quejas

Aquí están mis tres quejas principales:

1) Tipado dinámico y (algo) débil

2) Todo es un error en tiempo de ejecución

3) Falta de clases

Ejemplos

Tipado dinámico/Falta de anotaciones de tipo

Consideremos una función como ejemplo específico.

function Ent:update_state(cmd, params) if cmd == 'at' then self.x, self.y = params.x, params.y endend

En primer lugar, la lectura de la propia función se hace difícil. ¿Qué toma esta función? ¿Y qué devuelve, si es que devuelve algo? No obtenemos esta información mirando la firma de la función. En su lugar, tenemos que leer el cuerpo de la función. Para las funciones simples, esto está bien. Pero para funciones más largas y complejas, determinar el tipo de retorno se convierte en una molestia.

Además, leer/escribir/depurar las llamadas a la función se vuelve difícil. ¡Podemos pasar un valor de cualquier tipo a cmd! Si ejecutamos ent:update_state(4, …), el ent no se actualizará. Pero en lugar de capturar esto como un error de tipo, tendremos que depurar en tiempo de ejecución.

En general, los lenguajes con tipado dinámico son más difíciles de leer. Si quieres saber el tipo de una variable, tienes que pensar en la ruta de ejecución del código, en lugar de poder echar un vistazo a una anotación de tipo (por ejemplo, Java) o comprobar el tipo en un REPL (por ejemplo, usando ghci para comprobar los tipos de Haskell). El lenguaje Hack es una excepción. Está tipado dinámicamente, pero sigue proporcionando una comprobación de tipos estática. Con Lua, se obtienen todas las ventajas y desventajas de un lenguaje de tipado dinámico. Es súper fácil escribir código, e igualmente difícil asegurar la corrección.

Errores en tiempo de ejecución/silencio

function test_func(test_arg) print(test_arg)endtest_func() -- prints 'nil'

Este es un escenario que he encontrado a menudo. Necesito añadir/eliminar/cambiar una función. Así que cambio la función, y luego voy alrededor y cambiar todas las llamadas. Esto no es tan malo; puedo buscar en todo el proyecto y actualizar las llamadas una por una. ¿Pero qué pasa si me olvido de una? ¿O qué pasa si añado una nueva llamada y olvido que he cambiado la función? Lo has adivinado: ¡un fallo en tiempo de ejecución!

Otro ejemplo al azar: 4 / 0 = inf. No lanza un error.

Sin clases

Hay esto, que funciona bien. Pero todavía falta un montón de buenas características OO: la visibilidad del método y las interfaces para nombrar un par. Sin las primeras, es muy fácil cambiar el estado de un objeto desde cualquier parte del código, y mucho más difícil razonar sobre el estado de los objetos.

No todo es malo

Ok, esos son todos los ejemplos que tengo (por ahora). La verdad es que he aprendido un poco decente mientras escribía esto. Iba a quejarme del alcance global, pero encontré esto. Iba a quejarme de la coerción de tipos, pero no es tan grave (sólo ocurre con cadenas e ints). ¡Y resulta que hay una versión tipada de Lua! No la he probado, pero parece prometedora. Si estás leyendo esto y has probado typedlua, hazme saber qué tal es en los comentarios.

¿Por qué me quejo?

Me doy cuenta de que quejarse de todas estas cosas puede parecer un poco estúpido. Lua es un lenguaje de scripting ligero; las cosas que he mencionado arriba no son siempre contras. Lua no está diseñado para construir aplicaciones grandes y complejas. Pero es por eso que estoy publicando esto en el subreddit Love2D. Parece que la gente hace algunos juegos bastante grandes y complejos con Lua y Love2D. Por ejemplo, Mari0, Warlock’s Tower, etc. ¿Cómo lo hacen (tú?)? Realmente no puedo imaginarme haciendo un juego «legítimo» en Lua/Love2D. Si me tomara un descanso durante una semana, probablemente olvidaría la mitad del código, y perdería demasiado tiempo tratando de averiguar los tipos de todas mis variables y funciones. ¿Los juegos suelen utilizar Lua como lenguaje «pegamento», e implementar el resto en C/C++? ¿Es más fácil hacer un juego grande en Lua que en otros lenguajes, incluso con los problemas que he mencionado anteriormente? ¿Por qué la gente usa Lua para juegos grandes, si es que lo hacen?

Gracias por tomarte el tiempo de leer esto :D. Y si tengo algo mal arriba, por favor hágamelo saber!

Las lecturas interesantes:

Lua: Lo bueno, lo malo y lo feo

Tipos débiles y fuertes

Deja una respuesta

Tu dirección de correo electrónico no será publicada.