J'ai eu une idée d'un programme que je veux écrire, mais quelle langue serait le mieux mon problème. P>
Si j'ai un jeu de course automobile et que je souhaite permettre aux utilisateurs de soumettre un code pour de nouvelles pistes de course 3D interactives (pensez à des pistes telles que trouvées dans le film Speed Racer), des véhicules et de leurs véhicules autonomes, ils le feraient Créez l'AI pour leur voiture qui permettra à la voiture de déterminer comment gérer les dangers. P>
Donc, j'ai besoin d'une langue qui fonctionnera rapidement et dans le cadre d'une carte du monde que le serveur ait toutes les courses possibles disponibles et leurs différents états. P>
Je suis curieux si ce serait une bonne raison de regarder créer un DSL dans Scala, par exemple? P>
Je ne veux pas avoir à redémarrer une application pour charger de nouvelles dlls ou de fichiers jar à de nombreuses langues compilées seraient un problème. P>
Je suis ouvert à Linux ou Windows, et pour les langues, la plupart des langues de script, F #, Scala, Erlang ou la plupart des OOP que je peux programmer. P>
L'utilisateur sera en mesure de surveiller la manière dont leur véhicule va et s'ils ont plus d'un AI téléchargé pour cette voiture, lorsqu'il s'agit de certains obstacles, ils devraient être en mesure d'échanger un programme AI à une autre à la demande. < / p>
Mise à jour: Jusqu'à présent, les solutions sont JavaScript, en utilisant V8 et Lua. p>
Je suis curieux si cela peut être une bonne utilisation pour un DSL, en fait 3 séparés. 1 Pour créer une piste de course, une autre pour contrôler un racécracar et le troisième pour la création de nouvelles voitures. P>
Si tel est le cas, Haskell, F # ou Scala Soyez de bons choix pour cela? P>
Mise à jour: strong> aurait-il de sens que différentes parties se retrouver dans différentes langues? Par exemple, si Erlang a été utilisé pour le contrôle de la voiture et de la Lua pour la voiture elle-même, ainsi que pour la piste de course animée? p>
5 Réponses :
Pourquoi pas JavaScript ou ECMAScript? Google V8 est une très belle façon de sandboxed de le faire. Je me souviens que c'est vraiment vraiment facile. Bien sûr, vous devrez écrire quelques liaisons pour cela. P>
Énorme +1. JavaScript est absolument la voie à suivre. Il y a aussi l'option de Rhino si vous préférez un environnement Java.
Mon seul problème avec JavaScript est qu'il peut être difficile de créer une langue pour faire des graphiques, tels que l'écriture du code qui crée / contrôle le circuit.
JavaScript serait idéal pour la programmation de la voiture de course, par exemple, ce qui est plus susceptible d'être fait, il se peut donc que plus d'une langue puisse être utilisée théoriquement.
Votre situation ressemble à un bon candidat à Lua.
os.execute code>, par exemple, et il n'y a aucun moyen pour l'utilisateur d'accéder à cette fonction. Li>
- Vous voulez vite: Découvrez une partie du critères de référence Lua contre Autres langues . Li>
- Vous devez interopérer avec une autre langue. Lua est très facile (OMI) d'intégrer au moins C ou C ++, au moins. Je n'ai pas utilisé Luainterface , mais c'est la liaison C #. Li>
- Lua a des fonctions de premier ordre, il devrait donc être facile d'échanger des fonctions à la volée. Li>
- lua prend en charge OOP dans une certaine mesure avec des métabiles. LI>
- La structure de données principale de Lua est le Table (réseau associatif) qui est bien adapté au clairsemé structures de données telles que l'intégration d'une carte du monde. LI>
- Lua a une syntaxe très régulière. Il n'y a pas d'astuces amusantes avec des points-virgules ou une indentation, de sorte que vos utilisateurs apprennent quand ils ramassent votre langue - à ne pas mentionner, en utilisant une langue bien documentée enlève une partie du travail que vous devez faire dans termes de le documenter vous-même. li>
ul>
Aussi, comme @Elviejo souligne dans un commentaire, Lua est déjà utilisé comme langue de script dans de nombreux jeux. Si rien d'autre, il y a certainement un précédent pour utiliser Lua de la manière dont vous avez décrit. Et, comme @gmonc mentionne, il est possible que vos utilisateurs aient déjà utilisé Lua dans un autre jeu. P>
p>
En ce qui concerne comment em> pour intégrer avec Lua: Généralement, vos utilisateurs doivent simplement avoir besoin de télécharger un fichier de script Lua. Pour trop simplifier, vous pouvez fournir aux utilisateurs des fonctions disponibles telles que Turnleft code>, Turright code>, Go code> et arrêt code> . Ensuite, les utilisateurs téléchargeraient un script comme p> xxx pré> puis sur le côté serveur, vous pouvez les démarrer avec un Go () code>. Ensuite, lorsque leur voiture atteint un cône, vous appelez leur actions.cone.cone () code> fonction; Un mur mène à la fonction actions.wall () code> Fonction, etc. À ce stade, vous avez déjà (espérons-le) Sandboxy de l'environnement Lua, afin que vous puissiez simplement exécuter leur script sans même considérer l'erreur Vérification - Si leur script entraîne une erreur, aucune raison pour laquelle vous ne pouvez pas transmettre l'erreur directement à l'utilisateur. Et s'il y a n'est pas em> aucune erreur, le lua_state code> dans le code de votre serveur doit contenir l'état final de leur voiture. P> p>
Meilleur exemple h2>
Voici un fichier C autonome qui prend un script Lua de STDIN et le gère comme je l'ai expliqué ci-dessus. Le jeu est que vous rencontrerez du sol, une clôture ou une succursale, et vous devez respecter, sauter ou diguer. Vous entrez un script Lua via STDIN pour décider de réagir. La source est un peu longue, mais j'espère que c'est facile à comprendre (outre l'API de Lua qui prend un certain temps pour s'habituer à). C'est ma création originale au cours des 30 dernières minutes, espérons que cela aide: p> xxx pré> Construire ci-dessus sur GCC avec GCC Runner.c -O Runner -LLUA5.1 -Je / usr / include / lua5.1 code>. P> et à peu près le seul script Lua qui passera avec succès à chaque fois est: p>
$ echo "Actions = {} Actions.Ground = Jump; Actions.Fence = Duck; Actions.Branch = Run" | ./runner
Wrong move!
You failed!
Je pensais que Lua peut avoir une mention. Je vais le regarder de plus près et voir comment ça fonctionne. Merci.
Lua est déjà utilisé comme langue intégrée dans plusieurs jeux vidéo. Voici une liste de jeux qui l'utilisent: en.wikipedia.org/wiki/Category:Lua -Video_games Donc, peut-être que Lua n'est pas la solution parfaite. Mais c'est sûr que ce n'est pas un mauvais.
Comme il est très bien utilisé dans d'autres plates-formes de jeu, vous pouvez avoir l'avantage des utilisateurs de familiarité avec la syntaxe Lua, que je crois que ce n'est pas la caractéristique la plus importante mais toujours un bon ajout.
Avec le vote ici, je devrai regarder plus comment Lua serait utilisé. Serais-je utiliser metalua, par exemple? Je suis en fait surpris des résultats jusqu'à présent.
Y a-t-il une chance que vous puissiez Aidez-moi ici ?
J'avais déjà fait dans MMO auparavant, vous savez que les scripts de réponse NPC utilisaient Python, tandis que c'est dans un cadre de C ++, dites que toute action liée à la NPC déclenchera le cadre pour exécuter un script Python (une interface C-Python de Cours, pas un appel de shell tel que "python /rscript/run.py"). Les scripts sont remplaçables d'exécution, bien que le joueur ou le jeu admin pour émettre une commande pour effectuer une actualisation, mais de toute façon, le programme de serveur de jeu n'est pas nécessaire pour le redémarrer. P>
En fait, j'ai oublié que si "faire une actualisation en émettant une commande" était nécessaire ou non pour un nouveau script runtime..2 ans avant ... mais je pense que cela vous convient. P>
considère Erlang: p>
Vous avez besoin de sandboxing / DSL: vous pouvez écrire "Générateurs d'analyseurs" pour accéder à l'accès aux appels système critiques / vulnérables. Le compilateur de stock peut être «facilement» amélioré avec cette fonctionnalité. P> li>
J'avais récemment entendu parler du fait que Erlang est rapide, ce qui est intéressant.
Je recommanderais Dot Net pour plusieurs raisons: P>
Les joueurs peuvent choisir quelle langue ils implémentent leurs solutions dans: C #, IronPython, VB.Net, BOO, etc. Mais votre runtime ne s'en soucierait pas - il ne fait que charger de manière dynamique des assemblages de points dans son bac à sable. Mais cela donne à vos joueurs un choix de leur propre langue préférée. Cela encourage les joueurs à profiter de l'expérience, plutôt que certains joueurs décidant de ne pas participer, car ils n'aiment tout simplement pas la langue unique que vous avez choisie. Votre cadre général serait probablement en C #, mais le code des joueurs pourrait être dans une langue nette de DOT. P>
Sandboxing et chargement dynamique sont très matures dans DOT NET. Vous pouvez charger les assemblages des joueurs dans vos propres appdomions de sandboxed qui fonctionnent avec une fiducie partielle. Vous n'auriez pas à redémarrer le processus de conteneur pour charger et décharger ces Appdomains de joueur. P>
Les joueurs sont encouragés à "jouer" de ce jeu car la langue (quelle que soit la langue nette qu'ils choisissent) est non seulement utile pour les scripts de jeu, mais peut conduire à une réelle carrière dans l'industrie. Faire une recherche d'emploi pour "C #" donne un lot em> plus de hits que pour "Lua" ou "HASKELL", par exemple. Par conséquent, le jeu n'est pas seulement amusant, mais surtout pour les jeunes joueurs, les aidera à apprendre à apprendre des compétences véritablement utiles et commercialisables qui peuvent les gagner de l'argent plus tard. C'est gros encouragement à participer à ce jeu. P>
La vitesse d'exécution est flamboyante. Contrairement à certaines alternatives telles que Lua, ce code compilé est bien connu pour une excellente performance, même dans des jeux en temps réel. (Voir Unity3D, par exemple). P>
Les joueurs peuvent utiliser Monodevelop sur Mac et Linux ou peuvent utiliser Visual Studio Express gratuitement à partir de Microsoft, ou ils peuvent utiliser le bon bloc-notes et la ligne de commande. La différence entre les alternatives ici est que les IDE matures et modernes sont disponibles si les joueurs doivent choisir de les utiliser. P>
Un DSL ne semble pas être une bonne idée pour les parties IA du problème simplement car la mise en œuvre de l'AI pour les véhicules nécessitera beaucoup de résolution de problèmes créatifs de la part des joueurs. Avec un DSL, vous les verrouillez uniquement dans la manière dont vous avez défini le problème lorsque vous y pensez. Les joueurs intelligents avec une plate-forme complète comme Dot Net (ou certains autres choix mentionnés) peuvent avoir des solutions radicalement nouvelles et innovantes à certains problèmes d'IA que vous n'avez jamais présenté. Avec les bons outils, ces joueurs pourraient mettre en œuvre des programmes d'apprentissage fous ou des petits réseaux de neurones ou qui sait ce que la mise en œuvre de leur AI. Mais si vous les enfermez dans une DSL simplifiée, il pourrait ne pas y avoir beaucoup de variété dans des implémentations de l'AI des joueurs différents (car leur ensemble d'expressions d'idées disponibles est tellement plus petite). P>
Pour les autres parties du problème, telles que la définition des pistes, une DSL pourrait aller bien. Encore une fois, cependant, je me pencherais vers l'une des langues nettes plus simples de points comme BOO simplement afin de pouvoir avoir une pile technique unifiée pour votre projet entier. P>
Ma seule préoccupation avec .net est que je ne serais pas en mesure de charger et de fonctionner de manière dynamique, sans redémarrer l'application, et si vous faites simplement un algorithme pour un autre, j'ai un problème que je dois arrêter l'application pour faire ce. L'autre problème n'est pas tout le monde la programmation .NET, mais c'est une question mineure.
Vous pouvez définitivement charger et décharger de manière dynamique sans redémarrer l'application.
Et oui, tout le monde ne fait pas .net (ou autre chose), mais vous pourriez probablement trouver plus de personnes qui font l'une des langues nettes de points que tout autre langage fixe. Au moins, les joueurs pourraient choisir l'une des langues qu'ils aiment (ou déjà savoir) de cette façon.
Quelqu'un doit le dire: Peu importe la langue que vous choisissez (je suis malheureusement non qualifié d'offrir des conseils dans ce domaine), assurez-vous de sander la boite de sable hors de celle-ci. L'exécution du code d'utilisateur est toujours un risque de sécurité majeur majeur.
Je pensais aussi ça aussi. C'est pourquoi je suis penché vers un DSL, mais je n'en ai jamais créé un, mais ce sera peut-être l'approche la plus sûre.
Du point de vue du sandboxing, il est tentant de suggérer une langue pure-fonctionnelle comme Haskell. Vous pouvez créer votre propre monade d'état qui ne permettait que les opérations que vous vouliez autoriser. L'utilisateur soumettrait une fonction qui a renvoyé une instance de cette monade (surveille simplement les appels
inapsafeperformio code> dans leur code!). D'autre part, cela serait très b> difficile pour les utilisateurs qui ne sont pas bons à la programmation.
@David - C'est pourquoi je pense qu'un DSL pourrait être utile, car je pourrais alors leur donner une langue facile à utiliser pour chaque partie, si je le comprends correctement. Je pourrais apprendre Haskell, mais j'ai expérimenté Scala, F # et commençais à expérimenter avec Erlang.
Indépendamment de la langue que je suis curieux de voir ce jeu en action :)
Je suis également intéressé, en fait. Je pense que l'idée d'un cadre qui soutient cela sera difficile, mais très intéressant.