Les langages exotiques : le brainfuck et ses dérivés
Connaissez-vous le langage ésotérique par excellence qu'est le Brainfuck ?
Marc : Oui, sur l'exercice 3 : quel est le langage et qu'est censé afficher :
« ++++++++++[>++++++++>+++++++++++<<-]>-.>-.+.-----.+++.+++.--------.++.----. » ? Je patauge.
Vous : ?
Si vous n'avez rien compris à ce que dit Marc, pas de souci, c'est simplement que vous ne connaissez pas le Brainfuck. Le Brainfuck (littéralement « branlette intellectuelle », parfois appelé de façon plus prude Brainf*ck) est un langage de programmation développé en 1993, dont le but était d'être facile à compiler. Pour ce faire, le Brainfuck n'utilise que huit instructions, tous les autres caractères étant ignorés. Voyons cela plus en détail : au début du programme, un tableau de 30 000 cellules est créé, et toutes ces cellules sont des variables d'un octet initialisés à 0. Le programmeur dispose d'un pointeur, qui se déplace sur les différentes cellules, et de huit instructions.
- « < » et « > » permettent de se déplacer dans le tableau. « > » déplace le pointeur vers la cellule suivant la cellule pointée, et « < » la cellule précédant celle-ci(1).
- « + » et « - » servent à modifier la valeur de la cellule (i.e. de l'octet) pointée. « + » augmente sa valeur de 1, « - » la diminue de 1(2).
- « [ » permet d'ignorer toutes les instructions jusqu'au prochain « ] » si l'octet pointé vaut 0. De même, « ] » permet de faire retourner le pointeur au premier « [ » précédant si l'octet pointé est différent de 0. Ainsi, « [ » et « ] » permettent de générer des boucles.
- Enfin, « . » permet d'afficher le caractère ASCII qui correspond à la valeur de l'octet pointé, et « , » permet de demander à l'utilisateur un caractère ASCII dont la valeur sera entrée dans l'octet pointé(3).
Avec ces seules huit instructions, le Brainfuck possède cependant la faculté d'être Turing-complet, ce qui signifie que vous pouvez en théorie créer n'importe quel programme avec ce langage. En pratique…
Si le Brainfuck vous répugne par son aspect illisible et incompréhensible, sachez qu'il existe des dérivés de ce langage, dont en voici deux amusants :
- le Ook, qui est censé être compréhensible par… les orangs-outans. Voyez plutôt : les huit instructions ressemblent toutes à « Ook. Ook ! », « Ook ! Ook ? » et autres ;
- le GWAAAAAAAH, qui, comme son nom l'indique, est quant à lui fait pour les lapins crétins. Et, comme tous les caractères qui ne sont pas des instructions sont ignorés, vous pouvez en rajouter à votre guise pour obtenir un vrai langage de lapin crétin : AAAAAAAAAARGAAAAAWOMGAAHOOH est certes plus court, mais ô combien moins poétique que daaAAAAAAaah ! gadahaha ! BLABLABLABLA. Radoaaahbll, GAAAAAWOM ! GAAHhhh : doooooooooooOOH !
Bien sûr, le Brainfuck n'est pas unique en son genre : citons par exemple le Malbolge, langage si compliqué qu'il fallut deux ans pour en créer le premier programme, le Whitespace, qui n'utilise que les espaces, les tabulations et les retours à la ligne pour obtenir un code source invisible, le Piet, dont les codes source ressemblent à une peinture d'art moderne…
Cependant, avec tout cela, vous êtes maintenant en mesure de répondre à Marc.
Vous : Tiens, du Brainfuck ! Donne-moi une feuille, je vais le décoder. Alors, je mets 10 dans la première cellule, puis comme cet octet est non nul je lis les instructions suivantes : je mets 5 dans la seconde cellule, puis [… ].
Ça y est ! Ah, ton prof est quelqu'un de bien : ce code signifie « Omnilogie » !
- (1) ↑ Et si on souhaite passer de la première cellule à la dernière, plutôt que de s'amuser à écrire 30 000 « > », un seul « < » suffira.
- (2) ↑ De plus, chaque octet peut prendre sa valeur entre 0 et 255. Et comme avec « > » et « < », plutôt que d'écrire 255 « + » pour passer de 0 à 255, préférez un unique « - ».
- (3) ↑ Je remercie Manutaust pour les précisions qu'il m'a apportées sur ces instructions.