JeuWeb - Crée ton jeu par navigateur
Langages exotiques ? - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Langages exotiques ? (/showthread.php?tid=8042)

Pages : 1 2 3


RE: Langages exotiques ? - niahoo - 28-01-2020

Citation :Qu'est-ce qui fait d'Elixir votre langage de choix, ses killer feats ?

Pour ma part j'utilisais Erlang depuis plusieurs années quand Elixir est sorti, et par rapport à Erlang le langage est plus confortable (bien que perso je n'aime pas la syntaxe Rubyesque).

Je ne me rappelle plus du jour où j'ai découvert Erlang, mais je sais que j'ai accroché direct, pour la même raison que Sephi, avoir un système qui vit sa vie, réactif, et qui permet d'avoir à portée de main plein d'outils qui nécessitaient des programmes externes en PHP : queues, websockets/push, cron, etc. Même la base de données devient accessoire, je me sers du SQL là où il apporte quelque chose (relations, requêtes sur des collections) mais pas pour stocker un état complexe d'une partie, qui ressemble plus à un arbre de données qu'à un simple record avec des champs string/integer/etc.

Les jeux ont généralement une forte composante temps : tel bâtiment met N secondes à se contruire, à produire une ressource, tel déplacement de troupes prend N minutes, etc. Souvent le plus simple est de calculer tout ce qui s'est passé dans le passé au moment où on veut voir l'état actuel des choses, mais c'est cool de pouvoir aussi le déclencher de façon régulière.

Par exemple, si tu implémentes un marché d'échange entre les joueurs, il faut que le marché soit toujours à jour, et donc que la production des joueurs soit toujours à jour. Si tu calcules tout au moment où quelqu'un affiche le marché, ça peut prendre plusieurs secondes, déjà c'est relou, mais en plus tu augmentes les chances que deux joueurs demandent cet affichage en même temps, donc devoir gérer des transactions, faire des vérifications supplémentaires, et surtout à chaque fois qu'on affiche le marché tu dois vérifier que tout ton jeu est à jour. Pour un jeu complexe ça devient vite relou.

Autre exemple, dans mon quiz on a N secondes pour répondre. Je n'ai pas trop réfléchi à comment le faire en PHP, ça ne serait pas bien méchant, mais là en tout cas ma partie reçoit un message au bout des N secondes, ce qui est une façon infiniment simple de gérer le truc. Ensuite elle calcule qui a répondu juste, et envoie d'elle-même le nouvel état du jeu aux joueurs.


RE: Langages exotiques ? - Xenos - 28-01-2020

Pour l'implé PHP du quizz: le joueur envoie sa réponse, le serveur la stocke si la question n'a pas expirée et répond 200 OK; le client connait déjà la date d'expiration de la question (connue dès le départ) donc il affiche un joli compte à rebours, quand il arrive à 0, il contacte le serveur pour savoir quelle réponse a gagné; si une réponse était déjà marquée gagnante, le serveur l'envoie au client qui l'affiche, si aucune réponse n'était marquée gagnante, le serveur check qui a gagné, marque la réponse et renvoie le résultat que le client affiche. Après 2-3 secondes, le client refait une requête "next question plz", s'il n'y a pas de question, le serveur la génère et la stocke en DB avec sa date d'expiration et la renvoie au client; s'il y a déjà une question il fait de même sans en regénérer une.

Niveau transaction, perso, j'ai pas franchement de question à me poser: j'ouvre la transaction avant ma procédure stockée qui récupère/gère les data de la page, et la ferme une fois toutes les data récupérées, donc, ça va Smile


RE: Langages exotiques ? - niahoo - 28-01-2020

oui voilà, pas très dynamique mais possible Smile


RE: Langages exotiques ? - Zero - 28-01-2020

Vous m'avez fait chercher et découvrir beaucoup de choses, merci. Entre autres, j'ai installé Elixir et je joue un peu avec la REPL en lisant la doc. Bon ça donne pas une idée de ce que c'est que de développer un projet avec, mais c'est intéressant déjà.

Concrètement, imaginons qu'on ait une dizaine d'ennemis à l'écran, vous spawnez un process pour chacun ?

-----

Par rapport à Unity/Neoaxis, ta remarque sur les SDK est très juste. Je précise que j'aime vraiment créer des langages, non pour arriver à une fin particulière, mais parce qu'en développer me plait ! J'en ai créé plusieurs, dont l'intérêt est souvent limité... parfois minimalistes voire poétiques, ou juste pour explorer ce qui se passe quand on pousse telle ou telle logique à fond. Il est arrivé que ça produise des créatures étranges ! En voici un ou deux :

http://algo-tao-poesie.toile-libre.org/
http://seme.lang.free.fr/live/
https://github.com/ThinkbotsAreFree/Birdy
http://thinkbots.are.free.fr/ProjectBlackTiger/

Le dernier n'est qu'une syntaxe attendant sa sémantique. Encore une drôle de bestiole Wink


RE: Langages exotiques ? - niahoo - 28-01-2020

Sympa tout ça ! J'avais créé ça il y a 7 ans déjà (et ben …) Le langage Kraft

M'en suis pas servi au final mais c'était cool de créer son propre langage qui tourne sur la VM Erlang Big Grin

Citation :Concrètement, imaginons qu'on ait une dizaine d'ennemis à l'écran, vous spawnez un process pour chacun ?

Ben ça dépend, si c'est des ennemis qui ont une IA, qui peuvent réagir à leur environnement, prendre des décisions, voyager loin ... pourquoi pas. Si c'est 10 soucoupes volantes dans space invaders qui font que descendre et bouger sur le côté, non.

Le piège classique avec Elixir c'est de créer des process pour tout et n'importe quoi parce que ça te permet de simuler des objets, et de retrouver ses marques comme si on était dans un langage OO. Mais la concurrence il faut la voir au niveau du système global, comme une façon d'implémenter les choses, pas comme une façon de modéliser les choses.


RE: Langages exotiques ? - Zero - 29-01-2020

Oui je vois, c'est plus comme des "lobes" du cerveau en quelque sorte ? Ils coopèrent, mais chacun ayant son autonomie et sa logique. On peut les tester de façon indépendante, voire les remplacer par un lobe "nouvelle version", ...etc.

Le pattern-matching par contre c'est quelque chose que je n'ai jamais créé, faudrait peut-être que je m'y intéresse.

Là je suis parti dans une autre direction au niveau dév : https://github.com/ThinkbotsAreFree/logo.eno

Notation préfixée, hyper-légère, basé proto, avec une syntaxe contraignante mais du coup claire. Je suis en train de voir pour intégrer des éléments d'Ada dans le concept, entre autres. Exceptions, test cases, tasks, pub/sub... Au final, peut-être proposer une interaction avec un panneau SVG qu'on script (en guise de "tortue"). Cette fois, je veux faire léger mais scalable. Genre "sérieux" quoi, sauf que ça l'est pas évidemment.
Smile

Edit :

Et au fait, j'ai regardé Kraft, c'était bien sympa comme idée ! Je suis sûr qu'en le généralisant, on peut en faire un nouveau paradigme de programmation !


RE: Langages exotiques ? - niahoo - 31-01-2020

Citation :Le pattern-matching par contre c'est quelque chose que je n'ai jamais créé, faudrait peut-être que je m'y intéresse.

C'est assez chaud je pense. Si tu te lances il faut bien piger le fonctionnement d'Elixir : l'opérateur = n'est pas un opérateur d'assignement comme dans les langages style C, Java, PHP, JS, … C'est un opérateur de "match" et de "bind".

De "match" parce qu'il vérifie que l'expression de gauche match l'expression de droite. Par exemple tu peux très bien écrire true = 1 > 0. Dans le cas où ton expression de gauche est une simple variable, ça match toujours.

De "bind" parce que les variables exprimées à gauche sont "bindées" (en bon français) aux expressions auxquelles on les compare. SI la variable existait déjà, on ne modifie pas l'emplacement mémoire auquel elle faisait référence, on la "bind" à un nouvel emplacement. En gros c'est une nouvelle variable qui accidentellement à le même nom d'une variable déjà existante.

Mais tu peux matcher sur une variable existante grâce à l'opérateur ^. Par exemple [^a, b] = [1, 2] ne match que si la variable a vaut déjà 1.

En Erlang tu ne peux pas rebind une variable, donc l'opérateur ^ n'existe pas car inutile.

Sinon en Haskell par exemple c'est moins flexible mais en contrepartie tu peux matcher sur le système de types, donc tout aussi puissant (même plus).

Sinon pour tes langages tu compiles avec quoi ?

Citation :Et au fait, j'ai regardé Kraft, c'était bien sympa comme idée ! Je suis sûr qu'en le généralisant, on peut en faire un nouveau paradigme de programmation !

Non bah au final on a juste du pattern matching sur des types/quantités, quelques opérations mathématique et un switch/case. Ce n'est pas un langage complet. Si je devais le refaire aujourd'hui une paire de macros Elixir suffirait.


RE: Langages exotiques ? - Zero - 03-02-2020

Alors je ne compile pas, j'interprète ! Une fois en Go, toutes les autres fois en Javascript. Sans compter le jeu Squadbot en Turbo Pascal 6, on pouvait programmer les petits vaisseaux spatiaux avec un éditeur intégré.

Ce qui n'est pas facile, c'est d'interpréter en se gardant la possibilité d'interrompre à tout moment l'exécution, et sans utiliser la récursion dans l'interpréteur.

Mais au fait tu sais pour Kraft, on peut faire un langage turing-complet avec uniquement du pattern matching, il y a Thue par exemple !

Cela dit, moué. Le pattern matching à la Elixir, je crois que c'est trop gros pour moi. Ca sent la chasse au T-Rex avec une sarbacane.  :'(
Il y a plusieurs implémentations de mini-kanren en Javascript, mais j'ai jamais trop compris le principe d'implémentation du backtracking. Petit cerveau, trop de données.


RE: Langages exotiques ? - niahoo - 04-02-2020

Citation :Mais au fait tu sais pour Kraft, on peut faire un langage turing-complet avec uniquement du pattern matching

Mais ça ne servirait pas à grand chose. J'aime bien créer un langage mais uniquement s'il peut apporter quelque chose d'intéressant !

Citation : j'ai jamais trop compris le principe d'implémentation du backtracking

En soi c'est pas compliqué : à chaque étape de ton match, tu crées un nouvel état, et tant que ça marche tu continues. Si ça fail, tu annules uniquement la dernière étape et tu testes autre chose. L'idée est d'annuler une seule étape et de remonter d'un seul cran à la fois. Pour ça le plus simple c'est d'utiliser des données immutables et de les copier à chaque fois. (mais c'est pas optimisé)


RE: Langages exotiques ? - Zero - 04-02-2020

Mais alors on peut faire ça avec une bête stack ?

Il y a une lib que j'ai en ligne de mire depuis un moment, c'est logic.js
https://github.com/shd101wyy/logic.js

Sans aller jusqu'au pattern matching qui remplacerait l'assignement, ça pourrait trouver sa place dans une distribution "batteries included" sur logo.eno... qui a évolué un peu d'ailleurs.

En ce moment j'ai des idées de jeu intégrant logo.eno, sur le thème de la Chaos Magick. Si ça va plus loin que "des idées", je vous raconterai tout ça !
Smile