Salut,
Après le fail que j'ai réalisé avec mon IA aléatoire, faute d'être capable de faire quelque chose de bien en C++, je
souhaiterais ajouter le support du JS à stechec2.
J'ai un peu regardé le code et j'ai vu qu'il y a déjà generator_js.rb et makefile_js.rb . Du coup, quel est le
problème avec les fichiers en question ? Est-ce qu'il faut d'autres éléments pour faire fonctionner le js ?
Autrement, j'ai aussi vu que les deux fichiers en question utilisent le moteur js de firefox, qui a l'air assez moche à
utiliser. Donc pourquoi pas faire en sorte d'utiliser nodejs, surtout qu'on pourra alors profiter de pas mal de
fonctions supplémentaires (inclusion et debug par exemple) ainsi qu'un gain en performance qui sera probablement
appréciable.
J'ai un peu regardé et c'est assez simple de créer un module nodejs en C++ (et donc de faire les appels à l'API du
jeu). Je sais (théoriquement) comment compiler nodejs en .so, mais je vois pas vraiment comment faire un .so qui
contiendra les fonctions que le jeu va appeler. Mais peut-être qu'il "suffit" de faire comme pour php ou python (je sais
pas comment c'est fait) ?
Ajout du JS à stechec2
JS sert à autre chose qu'exploiter des failles XSS !?
JavaScript, c'est le mal…
Le web, c'est mal.
En tout cas, ils sont peu destinés à avoir un intérêt dans le cadre d'un concours tel que Prologin.
Pour tester une IA aléatoire peut-être ?
Ne serait-ce pas le gars juste derrière moi qui a ragé après C++, puis qui a trollé avec php, puis qui a trollé le classement en ne finissant pas dernier ? :P
Au passage, je vais aller sur IRC pour voir comment on devient orga, puis si je suis accepté, je me porterai volontaire pour intégrer js à stechec
Mais pour te répondre, vraisemblablement, il y a deux solutions : soit faire un interfaçages avec le code compiler à
côté de Node.js qui serait sous la forme d'une sorte de module dans le langage utilisé (c'est ce qui est fait en python
et php je pense), soit compiler directement sous la forme d'une bibliothèque le code, ce qui serait a priori plus
efficace.
...Ça permettrait d'ajouter un suport natif pour le haskell et autres langage. Mais encore a priori, je vois pas ce qui
empêcherais de faire son propre interfaçage lors de la finale, tant que les orgas ont le code source dans l'archive...
(et encore, ça, c'est si t'es dans les 20 premier et qu'ils regardent les sources, sinon, osef)
Il me semble par contre qu'ils regardent toutes les sources.
Pas besoin d'être orga pour intégrer JS, il suffit de coder le générateur approprié.
Généralement quand quelqu'un demande un langage, on lui envoie
https://bitbucket.org/prologin/stechec2/src/3787e6f9f1a8e54e72b7ba5f1dcbc26b790c5ba9/tools/generator/?at=master puis il
abandonne (et c'est dommage !). Il y a un début de générateur JS, vous n'avez plus qu'à :
- Le faire marcher
- Faire des tests et vérifier qu'ils passent tous
- Faire une pull request
:-)
Pour la "procédure" d'adhésion à l'association, il faut ne pas être éligible au concours, de préférence être sur paris et envoyer un mail à info@prologin.org pour se présenter s'inscrire.
Forkons !
Des articles assez intéressants sur l'embedisation de Node dans C++ :
https://github.com/ZECTBynmo/tacnode
http://www.benfarrell.com/2013/01/03/c-and-node-js-an-unholy-combination-but-oh-so-right/
https://www.npmjs.org/package/node-ffi
Je le ferais quand j'aurais un peu de temps. :-)
>> Ne serait-ce pas le gars juste derrière moi qui a ragé après C++, puis qui a trollé avec php, puis qui a trollé le classement en ne finissant pas dernier ? :P
Tu fais allusion à qui, là, en fait ?
>> Forkons !
Ce n'est pas mieux de poursuivre sur le dépôt actuel ?
@hl037 : c'est plus après mon incapacité à faire quelque chose en C++ que sur le C++ que j'ai ragé, mais autrement, ça correspond plutôt bien à ce qu'il s'est passé :)
Merci pour les liens emersion. J'avais déjà vu comment faire un plugin nodejs en C++, ce qui est plutôt simple
puisqu'assez bien documenté.
Par contre, si je me trompe pas, ce n'est pas suffisant pour faire fonctionne un champion. Le champion que l'on rend
est un .so qui doit implémenter un certain nombre de fonctions qui vont être appelés par jeu et en retour, le jeu fourni
à notre champion un certain nombre de fonction.
Autrement, je suis tombé là-dessus : http://www.stumpy.fr/nodejs-ecriture-dun-plugin-en-c/
Il explique comment mettre en place des callback dans un module nodejs écrit en C++. Donc si on est capable dans un
même code de créer un module et d'appeler nodejs, ça devrait être suffisant pour pouvoir créer un champion.
D'ailleurs, est-ce qu'il y a une bonne raison à l'utilisation d'un .so pour l'interface entre jeu et IA plutôt qu'une simple API sur TCP?
> D'ailleurs, est-ce qu'il y a une bonne raison à l'utilisation d'un .so pour l'interface entre jeu et IA plutôt qu'une simple API sur TCP?
Oui, la vitesse. Si on prend l'exemple d'une IA en C++, l'appel à une fonction de l'API vide (aka. qui ne fait rien), si on passait par un truc basé sur TCP prendrait 1-5ms (il faut pas mal d'appels systèmes, puis il faut que le serveur se fasse schedule quand il reçoit le message, puis que le champion se refasse schedule quand il reçoit la réponse). Dans le cas actuel on est plus de l'ordre de 100ns (appel de fonction direct), donc un facteur 10000.
Après, en pratique, pour des langages comme Python il y a de l'overhead de (dé)sérialisation pour la conversion des valeurs C++ (côté règles) en valeurs Python (côté champion). Il y a aussi le fait que les fonctions de l'API ne font pas rien, donc le facteur est moins gros. Ça reste toujours au moins 100-1000x plus lent.
J'ai un peu étudié la question, il semble qu'utiliser directement Node.js ne soit pas simple (pas de moyen direct de démarrer Node.js depuis CPP et surtout d'accéder aux variables). Je pense qu'il serait donc plus facile d'utiliser v8 directement (https://developers.google.com/v8/get_started), qui permet de gérer proprement le contexte d'exécution. Si il y a besoin d'avoir accès aux libs de Node.js, il sera toujours possible de combler le fossé en utilisant qqchose comme Browserify par exemple.
Je vais donc expérimenter quelques trucs avec v8.