Ce document fait suite à une série de publications basées sur les rapports que nous avons faits lors de la conférence Games Gathering 2017 en décembre dernier. Dans l'un des
rapports , le sujet du choix d'un langage de script intégré a été soulevé.

Qu'est-ce que et pourquoi les langages de script sont-ils nécessaires?
Comme déjà mentionné dans le
post précédent de notre blog , notre entreprise a écrit son propre moteur. Aujourd'hui, nous allons parler de ce qui nous a guidés lors du choix d'un langage de script pour ce moteur.
Pourquoi y a-t-il un besoin de langages de script? Comme le dit le proverbe,
"dans l'industrie du jeu, il n'y a pas de problèmes complexes, il n'est pas nécessaire d'exiger des solutions complexes" . En plus des programmeurs expérimentés (et coûteux!) Qui résolvent des problèmes complexes, nous avons besoin de personnes (beaucoup de gens!) Qui seront engagées, disons, dans des quêtes. Et, honnêtement, nous aimerions que ces programmeurs ne soient pas si chers, et idéalement pas des programmeurs du tout, mais directement des concepteurs de jeux et des scénaristes.
Ainsi, il existe un besoin d'un outil pour décrire une logique simple, mais toujours logique, sans impliquer d'artillerie lourde par des programmeurs. Nous concluons - qu'est-ce qu'un langage de script pour nous? Il s'agit d'un outil qui rendra le développement de jeux plus rapide et moins cher.
La question se pose immédiatement, pourquoi n'utilisons-nous pas simplement quelque chose comme XML? Le fait est que pour nos besoins, nous avons souvent besoin de structures de contrôle - ramification et boucles, tandis que XML est une description déclarative.
Un autre avantage des langages de script est que les scripts d'un projet peuvent être du code ou une ressource. Et, en conséquence, la partie script du jeu peut être mise à jour non seulement avec le code, c'est-à-dire lors des mises à jour régulières via les mécanismes des magasins d'applications. Mais aussi avec des ressources, c'est-à-dire avec des éléments graphiques et autres utilisant CDN.
Exigences du langage de script parfait
Nous formulons les exigences pour un langage de script idéal.
- Dynamique. À notre avis, un langage de script idéal devrait être dynamique.
- Popularité. Par popularité d'une langue, nous entendons la présence d'une communauté suffisamment grande prête à répondre à des questions sur des ressources spécialisées comme StackOverflow.
- La courbe d'apprentissage douce. Nous voulons prendre, relativement parlant, pratiquement n'importe quelle personne, et la former rapidement à un niveau qui permettra à cette personne de travailler de manière productive sur nos tâches.
- De nombreuses opportunités. Le langage doit être puissant et avoir suffisamment de fonctionnalités, il doit prendre en charge différents paradigmes de programmation. Un programmeur professionnel à qui on propose d'écrire dans un tel langage pourra le faire avec confort et plaisir.
- Haute performance. La performance est l'une des pierres angulaires de l'industrie du jeu.
- Un grand nombre de bibliothèques. Très souvent, au cours de la résolution des tâches qui nous attendent, nous ne créons pas un code fondamentalement nouveau, mais utilisons ce que quelqu'un d'autre a déjà écrit. Les bibliothèques les plus stables et bien prises en charge que nous pouvons utiliser en utilisant une certaine langue, mieux c'est.
- Facile à intégrer. Nous parlons de langages intégrés, donc lors du choix d'un langage de script, la possibilité de l'intégrer joue un rôle important.
Analysons quelques langages de programmation populaires utilisés comme scripts pour répondre à ces exigences.
Python
Python est un langage dynamique très populaire. Il se caractérise par une courbe d'apprentissage assez douce, il est assez simple à apprendre. Cependant, l'étudier correctement ne devrait pas être si facile. En conséquence, les bons programmeurs Python sont rares et coûteux. Cela contredit notre volonté d'accélérer et de réduire le coût de développement de la logique de jeu.
Python a de grandes fonctionnalités et de bonnes performances. Son problème est un système de bibliothèque incohérent. Un autre de ses problèmes, qui joue un rôle important pour nous, est qu'il n'est en fait pas un langage intégré. Il s'agit d'un langage à partir duquel il est pratique d'appeler des bibliothèques écrites en C ou C ++.
En ce qui concerne les capacités d'intégration de Python, nous pouvons dire que, par exemple, il y a Maya, où Python est utilisé. Mais quiconque a vu les plugins Python pour Maya de l'intérieur sera d'accord avec nous qu'ils ne sont pas très bons.
En conséquence, nous pouvons dire que Python, malgré toutes ses forces, ne nous convient pas. Considérez maintenant JavaScript.
Javascript
JavaScript est, sans exagération, un grand langage qui a littéralement conquis le monde.
JavaScript est un langage dynamique populaire, caractérisé par une courbe d'apprentissage douce, avec des fonctionnalités riches, de bonnes performances et un ensemble complet de bibliothèques.
Si nous avons besoin d'un interprète de langue pour construire un moteur de jeu, nous pouvons trouver beaucoup de ces interprètes. En réalité, vous devez choisir entre deux de ces projets - V8 et WebKit. Cela et un autre ont des tailles assez grandes. Par conséquent, si nous parlons de jeux de société, nous pourrions tenter notre chance et inclure l'intégralité de l'interprète dans le jeu, mais dans le cas des jeux mobiles, cette option ne nous convient pas.
SocialQuantum possède son propre interpréteur JavaScript, qui passe 98% des tests, nous prévoyons de transférer ce projet vers la catégorie open source.
En conséquence, il s'avère que JavaScript ressemble à un candidat fort pour le rôle d'un langage intégré, mais il ne nous convient pas non plus.
Haxe
Il convient de noter que lorsqu'il s'agit de parler de JavaScript, les prochains se souviennent généralement d'Haxe. Mais, en fait, il est inutile de parler de la possibilité d'utiliser ce langage comme un langage embarqué, car Haxe, en fait, n'est pas tant un langage qu'un trans-compilateur vers d'autres langages. Et ce n'est pas ce dont nous avons besoin.
Peut-être sommes-nous satisfaits d'ActionScript ou d'un autre langage de script?
ActionScript
Si nous analysons formellement ActionScript pour vérifier la conformité avec les exigences ci-dessus, il peut sembler que le langage de script idéal a été trouvé. De son côté, la nature dynamique, la popularité, la facilité d'étude, les bonnes fonctionnalités, les performances, la disponibilité des bibliothèques, la facilité d'intégration. Cette langue est aimée et mémorisée dans l'industrie du jeu, elle écrit un grand nombre de merveilleux jeux Flash. Le principal problème avec ActionScript est que ce langage est presque mort. Il ne nous convient donc pas non plus.
AngelScript, Squirrel et autres
En plus d'ActionScript, il existe de nombreux langages de script tels que AngelScript, Squirrel et d'autres. Parmi eux, vous pouvez trouver ceux qui, formellement, satisfont presque complètement nos exigences, mais généralement ce sont des langages liés à leur développeur, ils ont de vieux problèmes qui n'ont pas été corrigés depuis des années. Très probablement, ils ne sont pas très populaires, ils ne sont pas bien documentés, il y a peu de matériel de formation sur eux, ils n'ont pas de très grandes communautés. L'une des conséquences de cet état de fait est qu'il est difficile d'étudier - ne serait-ce que parce que ce n'est pas complètement clair - ce qu'ils sont et comment ils fonctionnent.
Comme vous pouvez le voir, nous n'avons pas encore trouvé le langage embarqué idéal. Et si vous créez votre propre langue?
Créez votre propre langue
Il est possible que le langage développé au sein de l'entreprise réponde idéalement à ses besoins et soit facile à apprendre. Mais, très probablement, une telle langue ne deviendra pas populaire. Une telle langue aura soit un nombre minimal de bibliothèques, soit elles n'existeront pas du tout. De plus, il est difficile de croire que dans les conditions modernes, il est possible de créer quelque chose qui fonctionnera mieux, qui aura une plus grande productivité et sera plus facile à intégrer que quelque chose qui est déjà sur le marché.
Il y a des entreprises qui développent et utilisent leurs propres langages, parmi elles il y a des acteurs du marché des jeux à succès, mais ce n'est probablement pas une bonne idée.
Après avoir examiné les langages de programmation existants qui prétendent être intégrés et discuté de l'idée de développer notre propre langage, passons à Lua.
Lua est le langage intégré que nous avons choisi
Lua est un langage dynamique. Il est assez populaire, une grande communauté s'est développée autour de lui, notamment dans le domaine du développement de jeux. Il a une courbe d'apprentissage très douce. Par exemple, dans notre entreprise, les scripts des autotests sont écrits en Lua. Un cours d'introduction standard pour les autotests dure environ deux heures, après quoi une personne est capable d'utiliser cette langue. Dans le même temps, Lua est un langage multi-paradigme. Il prend en charge un style fonctionnel de programmation et de POO. En conséquence, il convient non seulement pour résoudre certaines tâches simples, mais aussi pour des questions plus graves que les programmeurs professionnels font.
Lua a de bonnes performances et possède de nombreuses bibliothèques. Pas autant que JavaScript, mais, néanmoins, sur le site Web de
LuaForge, vous pouvez trouver presque tout ce dont vous pourriez avoir besoin. Et enfin, Lua est très facile à intégrer, de plus, il a été créé pour être utilisé comme langage intégré.
Par exemple, voici à quoi ressemble notre espace de travail JetBrains IDE
CLion . Ici, vous pouvez voir le mécanisme de saisie semi-automatique créé par nous pour Lua, que nous prévoyons de rendre open source. Nous allons faire du débogueur open source.
Environnement de travailNous avons choisi Lua, mais lorsqu'il s'agit de l'utiliser comme langage de script intégrable, vous rencontrez généralement les mêmes objections que nous allons maintenant considérer.
Objections à l'utilisation de Lua
Lua est pour C, pas C ++
Personne ne prétend que Lua est une excellente langue intégrable. La principale chose qu'ils considèrent comme un inconvénient est qu'il a été créé pour être utilisé avec le langage C, et non C ++. Pour cette raison, lorsque nous essayons d'appliquer quelque chose dans Lua qui est en C ++ et non en C, nous rencontrons des problèmes. Cependant, il faut comprendre ici que ces problèmes ont été résolus par beaucoup de gens assez intelligents. Parmi les outils qui résolvent les problèmes d'incorporation de Lua dans C ++ figurent des projets, tels que Luabind, Luabridge, toLua ++, SQLuaHost. Ce n'est pas une liste complète. Ils ont des avantages et des inconvénients différents, mais, très probablement, tout ce dont vous pourriez avoir besoin est déjà implémenté dans l'une de ces solutions.
Prenons, par exemple, SQLuaHost. Il s'agit d'une liaison qui est faite à l'intérieur de SocialQuantum et qui devrait être open source. Cette décision représente notre vision de la façon dont Lua devrait se lier. Par conséquent, il est fort possible que si vous n'avez pas trouvé ce dont vous avez besoin dans les classeurs existants, vous le trouverez dans SQLuaHost.
Lua est lent
Nous rencontrons souvent l'opinion que Lua est une langue très lente. Premièrement, ce n'est pas le cas. Lua est une machine empilée, et il n'y a vraiment rien à ralentir là-bas. De plus, nous devons comprendre que dans le langage de script, nous donnons généralement la logique du jeu, la logique métier et pas des choses vraiment lourdes. Par conséquent, si les scripts Lua ralentissent le jeu, le problème peut résider dans une liaison sous-optimale ou une utilisation inappropriée de certaines fonctionnalités du langage. Par exemple, nous avons effectué des tests synthétiques sur lesquels LuaJIT est plus rapide que Mono. En même temps, personne ne prend la peine d'écrire sur un tel code non optimal:
function myGame:onUpdate() local tex = Texture::new(name) self.background:setTexture(tex) end
Ici, à chaque tick du jeu, une nouvelle texture est créée et définie comme arrière-plan. Bien sûr, une telle conception ne fonctionnera pas particulièrement vite, mais personne ne prend la peine d'écrire de telles choses.
Lua ne convient qu'aux petits projets.
L'objection suivante est que Lua est fait pour écrire de petites choses et que quelque chose de grand ne peut pas être écrit dans cette langue. D'une part, c'est vrai. Mais ce langage est hautement modulaire. Et à partir des nombreux petits blocs, vous pouvez créer des systèmes assez grands et complexes. Et si vous vous souvenez de ce qui a déjà été dit sur la multiparadigmité et la POO, il s'avère que la POO pousse le développeur à créer de petits modules qui peuvent être utilisés pour créer des structures grandes et complexes.
De plus, souvent sur Lua, certains petits modules sont écrits rapidement, et dans l'industrie du jeu "plus rapide" signifie "moins cher".
Autres arguments contre Lua
Critiquant Lua, ils disent que la langue est ancienne, que, comme ils le disent, "out of the box" ne prend pas en charge la POO, que la numérotation des éléments dans ses tableaux ne commence pas par 0, comme on pourrait s'y attendre de toute langue décente, mais avec 1.
Ils disent que son inconvénient est qu'il n'a pas d'opérateur ternaire. En fait, il y a beaucoup de tels arguments contre Lua, mais nous n'en discuterons pas, car nous pensons qu'ils concernent, pour la plupart, les habitudes et les préférences personnelles des développeurs.
Résumé
Pour résumer. Si votre tâche consiste à obtenir un langage intégré avec un minimum d'effort, prenez Lua. Dans le même temps, si vous avez le temps et les ressources pour développer votre propre langage ou vos propres reliures - faites à nouveau attention à Lua. Pourquoi recommandons-nous Lua dans les premier et deuxième cas?
Dans le premier cas, en choisissant Lua, vous choisirez une langue très facile à intégrer et à utiliser. Il existe exactement un
tutoriel sur cette langue écrit par son auteur. Il n'y a pas d'autres livres simplement parce que le premier dit absolument tout ce que vous devez savoir sur Lua, et il n'y a rien de plus à dire à ce sujet. Lua n'est pas une langue idéale ou la plus répandue dans le monde, mais, par la somme des critères, c'est certainement l'une des meilleures langues pour l'intégration. Il est le meilleur que nous ayons en ce moment. De plus, il existe de nombreux outils standard pour Lua qui simplifient considérablement la vie de ceux qui l'utilisent.
Dans le second cas, si vous avez les ressources pour développer des outils, en choisissant Lua vous pouvez vraiment dépenser ces ressources, puisque Lua, malgré sa popularité dans l'environnement de développement de jeux, le langage est très sous-estimé. En conséquence, vous aurez la possibilité, en prenant Lua comme base, de prendre en compte vos besoins et d'obtenir exactement ce dont vous avez besoin.