Connaissez-vous le BrainFuck ? C'est un langage de compilation qui, il faut l'avouer, ne sert à rien d'autre qu'à se détruire les méninges. Le concept est simple : 8 opérateurs "<", ">", "+", "-", ".", ",", "[", "]", et ... c'est tout. Un langage très simple donc, ce qui donne des petits programmes sympathiques, à écrire d'une part, et à maintenir d'autant plus.

Par exemple, le programme habituel Hello World devient :

 ++++++++++[>++++++\+>++++++++++>++\+>+<<<<-]>++.>+.++++++\+..++\+.>++.<<++++++++++++++\+.>.+++.------.--------.>+.>.

Vous trouverez plus d'informations sur brainfuck sur Wikipedia

Le proto que je vous propose aujourd'hui est un compilateur / interpréteur BrainFuck .NET

Il propose plusieurs modes :

  • Compilation en utilisant CodeDom : un arbre DOM du code C# équivalent au BF en entrée est créé, puis est compilé en utilisant les outils de compilation du framework. C'est un bon exemple de l'utilisation de la techno CodeDOM
  • Compilation en utilisant Reflection.Emit : Le code généré est directement de l'assembleur MSIL
  • Interprétation brtuale : le code BF est lu et exécuté directement à la volée
  • Interprétation précompilée : le code BF est compilé en mémoire en utilisant Reflection.Emit, puis est exécuté directement.

Télécharger BFC-rev3

Au final, je pense que ce proto peut être un bon exemple pour apprendre un peu Reflection.Emit. N'oubliez-pas d'utilliser également Reflector, cet outil génial qui permet de désassembler du code .Net (de façon plus sympathique qu'avec ILDASM).

Par contre, j'ai été très déçu par CodeDom. L'arbre DOM ne couvre pas l'ensemble de la grammaire de C#, du coup, impossible de faire le code que l'on veut. CodeDOM serait à priori plus utile pour générer du code (qui sera ensuite affiché / prettyprinté) que pour générer du code exécutable (qui est ce que je désirais faire ici). Mais même dans ce cas, on est vite limités par les abscences de certains tokens du langage (en particulier dansles boucles).