Gnochon : le plan (2)

8 février 2017
alice-kent-stoddard-the-chess-game

Alice Kent Stoddard – The Chess Game

1-L’objectif

Comme je l’ai expliqué prédemment, je me lance dans la création d’un programme d’échecs en Smalltalk. J’y pensais depuis longtemps et m’y voici, finalement.  Je tâcherai d’atteindre deux buts : faire un programme d’échecs qui atteindra au moins 2000 Elo et ne consulter aucun code source pour m’inspirer des algorithmes des autres.  Autre défi de taille, essayer de trouver du contenu en français pour vous aiguiller si vous avez besoin d’un coup de pouce supplémentaire!

2-Pourquoi Smalltalk?

Pourquoi Smalltalk, un langage interprété? Tout d’abord, parce que c’est de loin le langage de programmation que je connais le plus comme je l’utilise depuis plus de 22 ans.  Ensuite, parce l’environnement Smalltalk offre une facilité de débogage, une panoplie d’outils et une rapidité de dévelopement inégalés.  Par ailleurs, Smalltalk est pourvu d’une riche et mature librairie de code et d’une multitude de classes de base par défault. Finalement, j’ai aussi choisi Smalltalk parce que c’est un des meilleurs exemples de « write once, run anywhere« .  Pharo et Squeak sont disponibles sur mac (macOS, OS X), Windows (x32, x64) et GNU/Linux (x86 et ARM).

3-Les prérequis

Dans la mesure où vous seriez tentés de suivre ce blogue et cette aventure en essayant vous aussi de coder un programme d’échecs, il vous faudra quelques prérequis pour suivre mes développements.  Premièment, une connaissance de Smalltalk est grandement souhaitable (quoique la syntaxe du langage et le code sont si simples que vous devriez tous être en mesure de comprendre).

Ensuite, une connaissance minimale des règles du jeu d’échecs est nécessaire : cela inclut le déplacement des pièces, la prise en passant, le roque, la promotion du pion, la règle des cinquante coups, la règle de répétition de position, le mat, le pat, les cas de parties nulles (e.g. matériel insuffisant pour mater), la notation algébrique, etc.  Idéalement, vous seriez un joueur d’échecs vous-même quoique cela n’est pas absolument nécessaire comme l’a déjà prouvé Claude Jarry [1]!

Claude Jarry attendant la réponse de son programme d’échecs « L’Excentrique »

4-Les outils

Évidemment, vous aurez besoin de Squeak et/ou Pharo!

Je ne compte utiliser que des solutions open source pour ce projet alors ne craignez pas de dépenser un seul sou! Alors si vous désirez me suivre pas à pas, j’utiliserai Squeak au début puis je migrerai ensuite mon programme sur Pharo.

ampoule48x48

Comme Pharo a comme ancêtre Squeak, vous pourrez utiliser l’un des deux environnements sans distinction ni problème. S’il y a des différences rencontrées en cours de chemin, je me ferai un devoir de vous les souligner et de vous les expliquer!

Il vous faudra aussi un éditeur de texte convenable (je n’ai que de bons mots pour Notepad++).  Puis un logiciel de comparaison de fichier pourra aussi s’avérer très utile (je ne jure que par WinMerge). Ensuite, un logiciel de base de données de parties d’échecs (pour pouvoir construire une bibliothèque d’ouverture, lire et sauvegarder des parties et des positions, imprimer des diagrammes, etc comme SCID vs PC ou SCID) est un outil incontournable et vital pour ce projet. Finalement, un logiciel de compression de données et d’archivage comme 7-Zip (j’utilise principalement les formats zip, gz et 7z).

Dès que le programme sera en mesure de jouer une partie complète, il nous faudra un logiciel d’appariement (comme Arena ou CuteChess) pour automatiser les tests et le faire jouer contre d’autres programmes d’échecs : il nous faudra alors utiliser un des protocoles de communication disponibles  (Xboard ou UCI). Aussi, un autre incontournable, le programme d’extraction PGN-Extract pour les parties d’échecs en format PGN.

Finalement, si votre esprit s’égare parfois d’une idée à l’autre comme moi, la technique Pomodoro (et un minuteur Pomodoro approprié) sont plus que bénéfiques!

5-Les ressources

Pour apprendre à jouer aux échecs : l’article dans Wikipedia, les leçons d’échecs pour débutants en ligne, le WikiLivre Apprendre à jouer aux échecs.

Pour apprendre Squeak : le livre Squeak par l’exemple.

Pour apprendre Pharo : le livre Pharo par l’exemple.

Pour de l’aide en programmation (général) : developpez.net

Pour de l’aide en Squeak ou Pharo : sachez que les listes de diffusion (toutes en anglais) de Pharo et Squeak sont toujours très efficaces et rapides à répondre aux questions.  Qui plus est, un grand nombre d’utilisateurs de Squeak et Pharo sont situés en Europe et parlent français!  Évidemment nétiquette oblige, posez vos questions en anglais en premier lieu!

Pour toute autre aide pour ce projet : bien que les salons de discussions sur IRC (sur irc.freenode.net) soient habituellement en anglais, sachez que vous me trouverez toujours sur ##chessprogramming, #pharo ainsi que #squeak sous l’alias lamneth (et un peu partout sur IRC dans tous les salons reliés à Smalltalk de près ou de loin)!

6-Pourquoi le nom Gnochon?

En québécois, un gnochon désigne une personne idiote, stupide, imbécile.  C’est probablement ce dont aura l’air mon programme d’échecs au début!

7-Les étapes

Voici une liste assez complète de tout ce dont j’ai l’intention d’équiper mon programme.  J’ai divisé le projet en sept jalons afin de ne pas perde de vue l’objectif final ni de céder au découragement ou à l’éparpillement des efforts!

a) Avoir un programme qui génère tous les coups valides d’une position

Définir les classes de base : l’échiquier et les coups.
Définir le générateur de coups
Arriver à lire/écrire des fichiers EPD
Tester le générateur de coups avec perft
Définir un évaluateur de position de base (matériel seulement)
Définir un mécanisme de tri des coups (move ordering)

b) Avoir un programme capable de faire une recherche de plusieurs niveaux

Définir les tables de piece-square et bitmasks nécessaires/manquants
Définir la recherche alpha-beta (ou équivalent)
Définir le iterative deepening

c) Avoir un programme capable de jouer une partie complète

Définir un gestionnaire de temps de réflexion (pour respecter les cadences)
Gérer le protocole de communication utilisé (XBoard ou UCI, à décider)
Définir une fonction d’évaluation positionnelle
Arriver à lire/écrire des fichiers PGN

d) Raffiner l’élagage de l’arbre et accélérer la recherche

Implémenter le null move
Implémenter le concept de aspiration window
Implémenter le static exchange evaluator
Arriver à lire une bibliothèque d’ouverture (opening book)

e) Permettre au programme de chercher à une plus grande profondeur

Implémenter le futility pruning
Implémenter le late move reduction
Implémenter la quiescence search
Implémenter une table de killer move

f) Accélérer l’évaluation et permettre un meilleur jeu en finales

Ajouter le support pour les tables de fin de partie (tablebases)
Implémenter une table de transposition avec le Zobrist hashing
Implémenter une table de hachage pour la structure de pions
Implémenter le late move reduction

g) Mieux gérer les débuts et les fins de partie

Implémenter un évaluateur de fin de partie
Générer ma propre bibliothèque d’ouvertures avec les parties du CGR
Ajouter des algorithmes de gestion de fin de partie pour certaines finales

8-Et après?

Il y aura toujours d’autres fonctionalités et algorithmes qu’on pourra ajouter à n’importe quel programme d’échecs.  Que ce soit le contempt factor, le desperate move, la recherche en parallèle, le pondering, etc.  Tellement de trucs ont été essayés, tellement de papiers ont été écrits sur le sujet, tellement d’algorithmes et de structures de données ont été expressément développées dans le cadre des jeux d’échecs par ordinateur que c’est une inépuisable spirale qui bouffera tous vos temps libres si vous n’y faites pas attention!

L’important est d’y aller lentement, pas à pas.  Et surtout de tester.  De retester.  De tester encore. Et d’encore tester! À chaque étape, à chaque changement!

Parce que comme Ken Thompson l’a déjà dit, écrire un programme d’échecs a été une des choses les plus difficiles qu’il a faite.

ken-joe

Ken Thompson (à droite) et Joe Condon

Quand on sait que le gars a inventé des fontes d’échecs, qu’il a inventé le langage B et participé à l’élaboration du langage C, qu’il a développé Unix, qu’il a développé le système d’exploitation Plan 9, qu’il a généré les toutes premières tables de finales de parties d’échecs, qu’il a écrit Belle (programme d’échecs champion en 1978, 1980, 1981, 1982 et 1986), qu’il a co-inventé le langage Go, qu’il a élaboré les expressions régulières, implémenté les éditeurs de texte QED et Ed, qu’il a participé à la définition du standard du codage UTF-8, bien on se dit que si Ken Thompson a trouvé qu’écrire un programme d’échecs c’était difficle, c’est que ça doit l’être!

kenthompsonchessfonts

Les fontes d’échecs inventées par Ken Thompson

Note: pour une liste encore plus longue de tous les accomplissements de Ken Thompson, la page wikipedia en anglais en encore plus complète.  La liste des choses que ce génie de l’informatique a réalisé est tout simplement hallucinante!

 

 

Publicités

Smalltalk en vrac (19)

19 décembre 2015

Smalltalk

Smalltalk Digest, édition d’octobre 2015.

Smalltalk Digest, édition de novembre 2015.

Smalltalk Digest, édition de décembre 2015.

Pharo

Trantor : un nouveau framework de pair à pair (P2P, peer to peer) annoncé ici.

Un pilote PhaROS pour Robulab ici.

CalipeL : un outil de benchmarking pour Pharo et Smalltalk/X !

Macro Recorder : un outil pour automatiser des transformations de code! Une démo ici.

Command Availability : un petit utilitaire pour déterminer si une commande est définie sur Unix.

TinyBlog : un tutoriel pour vous expliquer comment bâtir une application web avec Pharo… et encore plus!

Un tutoriel sur Magritte en format PDF!

Hourra!  Spur approche!  L’annonce ici.

Pharo et Unicode : récentes observations et commentaires.

Automata : un microservice d’automation basé sur une state machine.  Plus facile à lire en anglais qu’à expliquer en français!

Un autre vidéo montrant Roassal2 à l’oeuvre.

Pour avoir un avant-goût de Brick (le remplacement éventuel de Morphic), l’annonce est ici.

Un vidéo montrant Mondrian en action.

ChronosManager : un outil de gestion de temps.

QuickAccess : un outil de gestion de scripts (similaire au célèbre Script Manager)

Un très court vidéo qui montre Smarter Critics à l’oeuvre.

Vidéo montrant un guichet automatique écrit en Pharo!

Un package qui implémente Material Design Lite dans Seaside.

Logoot : un outil de collaborative editing basé sur Trantor.

Twisty : un nouveau framework pour gérer le texte!

TwitterAPI : Twitter à votre portée!

Un package pour générer du code Latex pour les mathématiques.

Annonce de la version 2.0 de RenoirSt, un outil de gestion de CSS. Les slides de la conférence Smalltalk 2015 sont ici.

Le projet GeekO : ou comment visualiser les tweets.

Quality Assistant : un survol.

VDM-SL traduit en code Smalltalk, c’est possible!

Pharo et les raccourcis-clavier : un bref vidéo sur les derniers développements.

PharoCloud OS : comment construire une application Pharo bootable ISO.

Squeak

Aida 6.6 est maintenant disponible pour Squeak 5.

VisualWorks

Un autre vidéo de Roassal2 sur Visualworks.

La version 8.1 est disponible!

SqueakJS

Nostalgique ou seulement curieux? Vous pouvez maintenant vous amuser avec une implémentation de Smalltalk-78 dans votre fureteur.  La documentation est ici!

GemStone/S

La version 3.2.10 (64 bits) est arrivée!

ObjectStudio

La version 8.7 est disponible!

VA Smalltalk

La version 8.6.2 est disponible!


Smalltalk en vrac (3)

13 janvier 2015

Smalltalk

Inspiré de Smalltalk, Maria est un framework MVC pour JavaScript.  Un article d’introduction présente le framework de Peter Michaux.  Un autre article présente Maria ici.

Un article intitulé Smalltalk in business, Italian-style.

Une compilation de projets développés en Smalltalk sur Twitter.

Présentation du Smalltalk Renaissance Program.

Un article sur les méthode-signets (marker methods).

Un essai intitulé Smalltalk: Yesterday, Today, and Tomorrow.

 

Pharo

Une suite d’outils pour le traitement automatique du langage naturel (Natural Language Processing), NLP Smalltalk.

Mini démo de Jun4Pharo avec Woden.

Les plates-formes Ubuntu et Unix (en plus de OS X et Windows) sont maintenant disponibles pour le Pharo OS Project.

Un Event Recorder (quelqu’un a une traduction à suggérer?) pour Pharo basé sur Spec vous permettant d’enregistrer (et de rejouer) des événements UI.  Idéal pour une démo et pour tester les GUI!  L’annonce a été faite ici.

Un nouvel outil pour surveiller la mémoire (Memory Monitor).

Port de CORMAS (Common-pool Resources and Multiagent Systems) pour Pharo (nécessitant Moose).  À l’origine développé par le CIRAD Green Team en VisualWorks, le framework multi-agents est maintenant disponible ici. Plus de détails sur la liste de distribution et dans l’annonce.  Un tutoriel est disponible ici et de nombreuses autres ressources (tutoriels, exemples, démos) peuvent être trouvés sur le site de CORMAS.

Annonce d’une nouvelle version du MemoryMonitor (l’ancien) de Pharo.

Exemple de visualisation sur le web via Roassal.

Pharo dans le nuage : PharoCloud.

Pharo dans le nuage : Docker.

 

Amber

Entrevue de Philippe Back avec Sébastien Sastre au sujet de Amber.

S8 est une version de Smalltalk pour la plate-forme U8 (plate-forme de développement pour médias sociaux) unissant Clamato et Amber Smalltalk (anciennement JTalk).  Vous pouvez constater ce que cet environnement de développement peut faire en essayant le workspace à distance (remote S8 workspace).

ProfStef est maintenant disponible pour Amber sous le nom TrySmalltalk.

 

Redline

Un article sur Redline dans InfoWorld.

 

GemStone

La version PUM 2.2.23 est maintenant disponible.

 


Humour (4)

6 mai 2014

Les arguments (nombreux!) de la ligne de commande de tar ici!

tar