Reddit – love2d – Les inconvénients de la programmation de jeux en Lua

Intro

Pour préfacer ceci, j’ai très peu programmé en Lua. J’ai fait ce jeu super simple, et je travaille actuellement sur un autre. Cependant, cela a été suffisant pour me faire voir certains des inconvénients de la programmation en Lua.

Plaintes

Voici mes trois principales plaintes :

1) Typage dynamique et (un peu) faible

2) Tout est une erreur d’exécution

3) Manque de classes

Exemples

Type dynamique/manque d’annotations de type

Prenons une fonction comme exemple spécifique.

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

Tout d’abord, la lecture de la fonction elle-même devient difficile. Qu’est-ce que cette fonction prend en compte ? Et que retourne-t-elle, le cas échéant ? Nous n’obtenons pas ces informations en regardant la signature de la fonction. Au lieu de cela, nous devons lire le corps de la fonction. Pour les fonctions simples, c’est correct. Mais pour les fonctions plus longues et plus complexes, déterminer le type de retour devient plus un tracas.

De plus, lire/écrire/déboguer les appels de fonction devient difficile. Nous pouvons passer une valeur de n’importe quel type à cmd ! Si nous exécutons ent:update_state(4, …), le ent ne sera pas mis à jour. Mais au lieu d’attraper cela comme une erreur de type, nous devrons le déboguer à l’exécution.

En général, les langages avec typage dynamique sont plus difficiles à lire. Si vous voulez connaître le type d’une variable, vous devez penser au chemin d’exécution du code, au lieu de pouvoir jeter un coup d’œil à une annotation de type (par exemple, Java) ou vérifier le type dans un REPL (par exemple, en utilisant ghci pour vérifier les types Haskell). Le langage Hack est une exception. Il est typé dynamiquement, mais fournit toujours une vérification statique des types. Avec Lua, vous bénéficiez de tous les avantages et inconvénients d’un langage dynamiquement typé. Il est super facile d’écrire du code, et tout aussi difficile d’en assurer la correction.

Runtime/Silent Errors

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

Voici un scénario que j’ai souvent rencontré. J’ai besoin d’ajouter/supprimer/modifier une fonction. Donc, je change la fonction, puis je fais le tour et je change tous les appels. Ce n’est pas si mal ; je peux chercher dans tout le projet et mettre à jour les appels un par un. Mais que se passe-t-il si j’en oublie un ? Ou si j’ajoute un nouvel appel et oublie que j’ai modifié la fonction ? Vous l’avez deviné : un échec d’exécution !

Autre exemple au hasard : 4 / 0 = inf. Il ne jette pas d’erreur.

No Classes

Il y a ceci, qui fonctionne bien. Mais il manque encore beaucoup de fonctionnalités OO intéressantes : la visibilité des méthodes et les interfaces pour en nommer quelques-unes. Sans la première, il devient très facile de changer l’état d’un objet de n’importe où dans le code, et beaucoup plus difficile de raisonner sur l’état des objets.

Ce n’est pas tout mauvais

Ok, c’est tous les exemples que j’ai (pour le moment). J’ai en fait appris un peu décent en écrivant ceci. J’allais me plaindre du global scoping, mais j’ai trouvé ceci. J’allais me plaindre de la coercition de type, mais ce n’est pas si grave (ça n’arrive qu’avec les chaînes de caractères et les ints). Et il s’avère qu’il existe une version typée de Lua ! Je ne l’ai pas encore essayée, mais elle semble prometteuse. Si vous lisez ceci et que vous avez essayé typedlua, faites-moi savoir comment c’est dans les commentaires.

Pourquoi est-ce que je me plains ?

Je réalise que se plaindre de toutes ces choses peut sembler un peu stupide. Lua est un langage de script léger ; les choses que j’ai mentionnées ci-dessus ne sont pas toujours contre. Lua n’est pas conçu pour construire de grandes applications complexes. Mais c’est pourquoi je poste ceci dans le subreddit Love2D. Il semble que les gens font des jeux assez grands et complexes avec Lua et Love2D. Par exemple, Mari0, Warlock’s Tower, etc. Comment font-ils (vous ?) ? Je n’arrive pas à m’imaginer en train de créer un jeu « normal » avec Lua/Love2D. Si je faisais une pause d’une semaine, j’oublierais probablement la moitié du code, et je perdrais beaucoup trop de temps à essayer de comprendre les types de toutes mes variables et fonctions. Les jeux utilisent-ils généralement Lua comme langage de base et implémentent-ils le reste en C/C++ ? Est-il plus facile de créer un grand jeu en Lua qu’avec d’autres langages, même avec les problèmes que j’ai mentionnés ci-dessus ? Pourquoi les gens utilisent-ils Lua pour les jeux de grande taille, s’ils le font ?

Merci d’avoir pris le temps de lire ceci :D. Et si j’ai quelque chose de faux en haut, s’il vous plaît faites le moi savoir!

Lectures intéressantes:

Lua : Les bonnes, mauvaises et vilaines parties

La typographie faible et forte

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.