Avec quel langage fonctionnel convient le mieux pour créer des jeux? [fermé]

19

J'ai un œil sur les langages de programmation fonctionnels depuis un certain temps, mais j'hésite vraiment à m'y mettre. Mais je pense qu'il est temps que je commence au moins à regarder dans cette direction pour m'assurer que je suis prêt à tout.

J'ai vu parler de Haskell, F #, Scala, etc. Mais je n'ai aucune idée des différences entre les langues et leurs communautés, et je ne m'en soucie pas particulièrement; sauf dans le cadre du développement de jeux.

Donc, du point de vue du développement de jeux, quel langage de programmation fonctionnel a le plus de fonctionnalités adaptées à la programmation de jeux? Par exemple, existe-t-il des bibliothèques / moteurs / frameworks de développement de jeux fonctionnels ou des moteurs graphiques pour les langages fonctionnels? Existe-t-il un langage qui gère mieux certaines structures de données couramment utilisées dans le développement de jeux?

Conclusion: quel langage de programmation fonctionnel est le meilleur pour la programmation de jeux fonctionnels, et pourquoi?

Je crois / j'espère que cette question déclarera un meilleur langage clair donc je ne l'ai pas marqué CW malgré sa tendance subjective.

Ricket
la source
2
"Que voulez-vous dire, jeux 2D ou jeux 3D?" "Huh? Je ne sais pas - aieeee "
Cyclope
@Cyclops euh, quoi? Je ne comprends pas ...
Ricket
@Ricket, c'était en partie une demande pour clarifier de quel type de jeu vous parlez, 2D ou 3D (et peut-être en temps réel ou au tour par tour). C'était en partie une blague de Monty-Python qui a obscurci la première partie. Wups. :) Et je pense que spécifier le type de jeu est utile - à moins qu'il n'y ait un seul langage fonctionnel parfait pour tout , alors différents langages peuvent être meilleurs pour différentes choses.
Cyclops
Je ne pense pas que la 2D ou la 3D aient un impact sur le choix d'une langue, sauf par la variété de moteurs / bibliothèques disponibles pour une langue. Je m'intéresse personnellement à la fois à la 2D et à la 3D, donc je ne pensais pas à l'une ou à l'autre en écrivant cette question. Mais dans l'ensemble, les jeux 2D et 3D partagent de nombreux systèmes et structures de données communs (par exemple, audio, entrée, IA, structure de programme, boucle de jeu) et il existe de nombreux jeux 3D qui pourraient être portés en 2D ou vice versa. Et oui, je n'ai pas vu Monty Python, c'est pourquoi je ne l'ai pas du tout compris. :)
Ricket
1
Je ne pense pas qu'il y ait de réponse définitive sur la meilleure langue.
Wei Hu

Réponses:

12

F # faisant partie de la famille Microsofts .net a accès à XNA, qui est une base fantastique pour construire des jeux. Un peu de recherche sur Google révèle des tutoriels, des vidéos et des articles. Les excellents documents XNA devraient également vous aider.

Il y a également eu un certain mouvement dans les jeux pour Haskell, voir ici . Vous utiliserez probablement des liaisons openGL.

Étant donné que Scala joue en Java, il s'intègre à tous les moteurs / liaisons Java disponibles, voir cet article SO .

Je pense que cela se résume à la préférence, alors que je n'ai joué qu'avec Haskell, j'imagine que chaque langage fonctionnel a ses propres particularités. Il peut être utile de préparer un petit jeu de test dans chacun et de voir lequel vous semble le mieux.

Comme je l'ai dit, je n'ai qu'une expérience minimale de Haskell, donc je ne peux pas faire de commentaire sur le meilleur, mais ces ressources devraient vous aider à démarrer, espérons-le.

cmjreyes
la source
2
Entre les problèmes avec les machines virtuelles Java et l'immaturité de l'implémentation du compilateur, j'ai trouvé les performances de Scala inacceptables lors de l'utilisation d'un style fonctionnel, même si le langage lui-même le supporte bien. Il finit par être aussi rapide que, disons, Python ou Ruby, pas F # ou OCaml. (La vitesse de Scala est compétitive pour plus de styles OO / procéduraux.)
J'ai en fait un projet F # exécutant XNA (c'est une fenêtre XNA vide avec du bleuet bleu, seul le code était F # et non C #.
RCIX
8

Je dirais Lisp.

Il a été utilisé dans les jeux comme langage de script, chez Naughty Dog au moins (ou c'était je pense), et est un langage très mature.

L'avantage de Lisp réside dans la désérialisation, qui constitue une partie importante de ce que nous appelons la gestion d'actifs. La désérialisation de lisp est triviale, le code et les données ne font qu'un. Cela rend plus facile d'avoir un format de fichier pour les actifs et les comportements. Ce n'est pas comme vous un fichier json / xml / yaml / bin et un fichier F # pour l'IA. Vous pouvez tout enregistrer sous forme d'expressions s, ce qui simplifiera beaucoup le pipeline d'actifs.

Jonathan Fischoff
la source
TBH je recommanderais contre cela. Les langages de script ne sont pas réservés au développeur; les moddeurs voudront modifier le jeu, et rien ne les effrayera plus vite que (() ()))) () ((()). De plus, même en ce qui concerne les langages fonctionnels, Lisp est ésotérique.
RCIX
7
Si effrayer les moddeurs est quelque chose qui vous inquiète, opter pour un langage fonctionnel n'est probablement pas la bonne chose à faire.
Paul Wicks
3
@RCIX & @Joe - Necro pouvoirs ACTIVATE. Quoi qu'il en soit, le schéma est utilisé comme langue d'enseignement. SICP est quelque chose comme la moitié d'un diplôme CS dans un livre et est utilisé par un tas d'écoles (y compris le MIT jusqu'à récemment), et HTDP est une introduction moins hardcore.
Jesse Millikan
1
@RCIX & Joe en effet. lisp & scheme sont les langues d'introduction dans de nombreuses universités.
oberhamsi
1
Lisp n'est pas quelque chose que vous souhaitez utiliser. Naughty Dog avait UN, un seul programmeur Lisp et quand il a quitté, ils ont fait la transition de tous leurs moteurs vers C ++. Aucune idée pourquoi un moteur obsolète d'une entreprise est traîné en tant qu'exemple brillant tout le temps =)
Patrick Hughes
8

Après avoir acquis une certaine expérience pratique avec lui, je voterais pour Clojure - déjà écrit un petit jeu dedans, et prévoyant d'en faire plus.

Les raisons:

  • Productivité - Clojure est un langage dynamique. Il a de grandes fonctionnalités pour le développement interactif de style REPL, par exemple, vous pouvez utiliser le REPL pour interroger ou modifier l'état dans une instance d'application de jeu en cours d'exécution. Le code de Clojure est aussi souvent ridiculement concis. Je suppose que je suis 3 à 5 fois plus productif en Clojure qu'en Java ou C #.
  • Impur - alors que j'apprécie la beauté et l'élégance de langages fonctionnels purs comme Haskell, la programmation de jeux est une poursuite désordonnée où le pragmatisme gagne. Je veux pouvoir mettre des effets secondaires dans mes fonctions quand j'en ai besoin, et Clojure le permet. Cela dit, le style Clojure idiomatique doit être purement fonctionnel la plupart du temps .
  • Métaprogrammation - L'héritage Lisp de Clojure en tant que langage homoiconique le rend idéal pour la métaprogrammation / génération de code. Il est facile d '"étendre la langue" pour créer vos propres DSL ou d'éliminer la plaque biologique. Vous pouvez facilement utiliser Clojure comme son propre langage de script de jeu, et la compilation de code dynamique signifie que vos scripts s'exécuteront aussi rapidement que votre moteur de jeu principal.
  • Accès aux bibliothèques Java . Vous pouvez utiliser toutes les bibliothèques de sons / graphiques / IA / réseaux de Java, ce qui est un énorme avantage par rapport à la plupart des autres langages fonctionnels (où vous devrez soit les écrire à partir de zéro, soit développer beaucoup de code d'interface délicat). Cela peut vous sauver la vie.
  • Multiplateforme - cela vient gratuitement de l'exécution sur la JVM, mais c'est un bon bonus.
  • Performance - pour un langage fonctionnel dynamique, Clojure est à peu près aussi rapide que possible. Il est toujours compilé en JIT, jamais interprété. avec une optimisation intelligente, vous pouvez égaler la vitesse du code Java pur et bas niveau dans Clojure. Par exemple, vous pouvez utiliser des tableaux primitifs Java ou fournir des indications de type pour vous assurer que le compilateur produit des appels de fonction typés statiquement dans du code critique pour les performances.
  • Concurrence - Clojure dispose d'un excellent modèle de gestion des états simultanés, soutenu par un impressionnant système de mémoire transactionnelle logicielle. Cela vaut la peine de voir cette vidéo pour plus d'informations sur la façon dont cela fonctionne.

La seule fois où je ne considérerais pas Clojure serait si j'écrivais un jeu graphique intensif de pointe où vous avez besoin de performances de pointe (où je pense toujours que vous avez besoin de C / C ++).

mikera
la source