Le Plaisir (et la Folie) des Langages de programmation Ésotériques

Un langage de programmation ésotérique est un langage de programmation conçu pour défier les normes de la conception du langage. C’est un langage conçu pour faire valoir un point. Le but pourrait être n’importe quoi: le défi lui-même de créer quelque chose d’inhabituel, de faire une blague élaborée, de créer un langage comme expression artistique, de tester des idées prometteuses pour la programmation, etc.

Cela devrait indiquer clairement qu’il n’existe pas de moyen facile de catégoriser ou d’organiser correctement tous les différents langages de programmation ésotériques, car par définition ils défient les règles. Mais nous pourrions utiliser certains concepts et principes d’organisation pour mieux comprendre la communauté qui les entoure. Pour que nous puissions comprendre à quoi les gens les utilisent, ou pour utiliser ces informations comme source d’inspiration pour créer votre propre langage ésotérique.

Quelques concepts utiles

Turing Tarpit

Un Turing tarpit est un langage de programmation Turing-complet, mais pratiquement inutilisable. Un langage Turing-complete peut simuler n’importe quelle machine de Turing. En termes pratiques, vous pouvez écrire n’importe quel programme avec. Donc, en théorie, tous ces langages sont tout aussi puissants, mais ceux qui sont aussi une bâche de Turing rendent incroyablement difficile l’écriture de tout type de programme. Une façon courante de le faire est de réduire le nombre de symboles disponibles: essayez d’écrire même un programme Hello World avec seulement 8 caractères.

Quine

Une quine est un programme qui produit en sortie une copie de son code source. Le programme ne peut pas être le programme vide, même si le programme vide est un programme valide dans la langue spécifique. La lecture du code source à partir du disque ou de la mémoire est également considérée comme une tricherie. Le nom « quine » a été inventé par Douglas Hofstadter, dans son livre Gödel, Escher, Bach: Une tresse d’or éternelle, en l’honneur du philosophe Willard Van Orman Quine. Ainsi, le concept de quine n’est pas unique aux langages de programmation ésotériques, mais constitue néanmoins un premier défi typique à surmonter lors de l’écriture d’un.

Code Golf

Un code golf est un type de compétition dans lequel l’objectif est d’écrire le programme le plus court possible qui met en œuvre un certain algorithme. Dans ce contexte, le plus court signifie avoir le code source le plus court. Cela ne signifie pas avoir la plus petite taille du code exécutable binaire. Jouer au golf de code est appelé « script de golf ». Il existe également tous les autres types de compétitions liées à la programmation, qui, compte tenu du public, encouragent souvent la tricherie créative. De manière générale, un défi est un facteur de motivation pour de nombreux langages de programmation ésotériques.

Obscurcissement

Le concept d’obscurcissement, c’est-à-dire de masquer le sens réel d’un message, n’est évidemment pas exclusif aux langages de programmation ésotériques ou même à la programmation en général. Mais il a une grande pertinence dans de nombreux langages de programmation ésotériques. Surtout si vous l’avez l’intention dans le sens général plus large de tromper ou de confondre le destinataire. Vous ne cachez pas le message parce que le message lui-même est important, mais parce que la forme cachée est, en soi, l’objectif. Une façon typique d’y parvenir consiste à minimiser le nombre de symboles du langage, mais vous pouvez également camoufler un langage de programmation dans ce qui ressemble à du texte normal ou à une image.

Non-déterminisme

Dans ce sens plus large de tromper ou de confondre le public, le non-déterminisme peut également être utilisé pour atteindre le même objectif. Un langage non déterministe est un langage pour lequel, compte tenu de l’état actuel d’un programme, l’état suivant ne peut pas toujours être prédit. Le concept a une certaine utilité dans les langages de programmation normaux, essentiellement en raison de conditions imprévisibles au moment de l’exécution. Mais il est poussé à l’extrême par certains langages de programmation ésotériques, en randomisant des variables ou même en randomisant les instructions elles-mêmes.

Groupes de Langages de Programmation Ésotériques

Comme nous l’avons déjà dit, nous ne pouvons pas fournir un moyen exhaustif d’organiser tous les langages de programmation ésotériques. Et même si quelqu’un pouvait le trouver, bientôt quelqu’un d’autre inventerait un nouveau langage de programmation ésotérique juste pour le rendre invalide. Donc, ce que nous essayons de faire est simplement de proposer à certains groupes, ou catégories, de mieux comprendre et d’explorer le monde des langages de programmation ésotériques.

  • Langues avec une valeur objective, bien que cette valeur ne soit pas nécessairement extrinsèque ou typique. Un exemple de base est un langage conçu pour gagner une compétition de golf de code: sa valeur peut être mesurée, mais il n’a aucune signification en dehors de la communauté des langages de programmation ésotériques. Mais les types les plus utiles sont ceux conçus pour atteindre un objectif inhabituel, comme contourner les mesures de sécurité (voir JSFuck) ou définir des langages de type 0 de la hiérarchie Chomsky (voir Thue).
  • Langues inutilisables. Ce sont des langues qui sont très difficiles à utiliser. Cela peut être un objectif explicite du concepteur ou simplement un accident de la conception elle-même. Un utilisateur peut même trouver amusant de les utiliser pendant un certain temps. Un moyen typique d’obtenir un langage inutilisable, à la fois par conception et par accident, est le minimalisme (voir Brainfuck). Mais si vous voulez quelque chose de presque impossible à utiliser, vous avez besoin de quelque chose comme un langage qui utilise un système ternaire et qui s’auto-modifie délibérément, entre autres choses (voir Malbolge).
  • Langues pour tester une idée ou prouver quelque chose. Ce sont des langages qui peuvent ne pas être directement utiles, mais ils sont un bon terrain d’essai pour un nouveau concept ou pour prouver quelque chose. Par exemple, un langage dans lequel les programmes sont disposés dans une grille bidimensionnelle (voir Befunge) ou un langage fonctionnel presque pur (voir Unlambda)
  • Langages artistiques. Ce sont des langages conçus dans l’idée d’avoir une certaine valeur artistique. Vous pourriez soutenir qu’ils font effectivement partie du groupe des langages de test ou de ceux ayant une valeur objective. Nous les mettons dans une catégorie différente, car ils ne ressemblent pas à de la programmation, mais ils ont tendance à paraître intéressants, même si vous ne souhaitez peut-être pas les utiliser. Par exemple, ils ressemblent à de l’art abstrait (voir Piet) ou à une pièce de Shakesperean (voir Shakespeare).
  • Langues de blagues. Ce sont des langues inventées avec des gens avec un sens de l’humour bizarre. Comme une personne qui dit: « voulez-vous entendre une blague? – puis il lit Guerre Et Paix, avant de conclure – Toute notre vie est une blague! ». Un exemple est une langue satirique, où même le manuel de référence est une blague (voir INTERCAL)

Quelques langages ésotériques notables

Bien sûr, il ne s’agit pas d’une liste exhaustive de langages de programmation ésotériques notables, mais plus modestement d’une liste de quelques-uns remarquables par leur succès ou leur particularité.

Befunge

La principale caractéristique ésotérique de Befunge est que les programmes sont disposés dans une grille bidimensionnelle. C’est aussi un langage basé sur une pile et un langage réfléchissant, ce qui permet à un programme de se modifier. L’objectif principal était de concevoir un langage pour lequel il était aussi difficile que possible de créer un compilateur.

La version originale, maintenant appelée Befunge-93, n’est pas Turing complète, car elle limite la taille de la grille à 80×25. Mais une nouvelle version, appelée Befunge-98, supprime cette limite et elle devrait être Turing complète. Befunge a engendré toute une classe de langages multidimensionnels, appelés Fungeoid.

Befunge a des commandes qui contrôlent la direction haut, bas, gauche, droite et peuvent donc également créer un cycle, ainsi que des commandes plus traditionnelles pour la sortie, les opérations binaires, etc.

Un programme Hello Word ressemble à ceci.

> vv ,,,,,"Hello"<>48*, vv,,,,,,"World!"<>25*,@

Brainfuck

Probablement le plus célèbre de tous les langages de programmation ésotériques, il se distingue par son extrême minimalisme. Tant dans le nombre de commandes disponibles que dans le fait d’avoir un très petit compilateur. En fait, la deuxième condition est la raison de la première, car l’auteur voulait créer un langage avec le plus petit compilateur possible. L’auteur a créé un compilateur qui n’utilisait que 240 octets. Parfois, plus tard, quelqu’un d’autre en a créé un avec seulement 100 octets. Une conséquence naturelle de cet objectif est que le langage est difficile à utiliser, bien qu’il soit Turing complet. En bref, c’est une bâche de Turing.

Il est parfois appelé avec une orthographe censurée, telle que Brainf * ck ou de nombreuses autres variantes.

Le langage se compose de huit commandes différentes qui manipulent un pointeur de données et deux flux d’octets pour l’entrée et la sortie. Il prend également en charge les boucles. Les autres caractères, en plus de ceux représentant les commandes, sont considérés comme des commentaires et ignorés par le compilateur.

Ceci est un exemple du fonctionnement du langage (tiré du wiki Esolangs).

Code: Pseudo code:>> Move the pointer to cell2 Set cell2 to 0 << Move the pointer back to cell0 End while

Un programme Hello World ressemble à ceci.

++++++++>+>+>->>+<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

Si vous souhaitez en savoir plus, vous pouvez le voir sur la page Wikipedia correspondante ou sur la page Esolangs.

INTERCAL

INTERCAL n’a peut-être pas été le premier langage de programmation ésotérique, mais c’est certainement le premier célèbre. Quel âge a-t-il ? Il a été créé en 1972 et la première implémentation a été faite avec des cartes perforées. Le langage était conçu comme une parodie, mais aussi pour faire quelque chose de complètement nouveau, un étranger au monde de la programmation. Le nom n’est pas un acronyme, selon les auteurs:

Le nom complet du compilateur est « Langage du compilateur Sans acronyme prononçable », qui est, pour des raisons évidentes, abrégé « INTERCAL. »

Le reste du Manuel de référence INTERCAL (format PS) regorge également de déclarations absurdes ou humoristiques. C’est à la fois pour la langue qu’ils décrivent et pour la façon dont ils le font. Par exemple, il s’agit d’une section sur les variables

INTERCAL n’autorise que 2 types différents de variables, l’entier 16 bits et l’entier 32 bits. Ces
sont représentés par un point (. ) ou à deux points (:), respectivement, suivis d’un nombre quelconque compris entre 1 et 65535,
inclus. Ces variables ne peuvent contenir que des nombres non négatifs ; elles ont donc les plages respectives de
valeurs: 0 à 65535 et 0 à 4294967295. Note: .123 et : 123 sont deux variables distinctes. D’autre part,
.1 et.0001 sont identiques. De plus, ce dernier ne peut pas être écrit comme 1E-3.

Le langage permet également l’utilisation d’un modificateur PLEASE. Cependant, cela nécessite également l’utilisation de la quantité appropriée de ce mot-clé. Il ne peut pas être utilisé trop peu ou trop, c’est-à-dire que vous devez faire preuve de la bonne politesse. La partie vraiment peu drôle est qu’il s’agissait d’une fonctionnalité non documentée dans le manuel d’origine. Un manuel de blague pour un manuel de blague peut être correct, mais celui qu’il soit incomplet est inacceptable.

Il s’agit d’un Hello World dans une version d’INTERCAL implémentée avec C: C-INTERCAL.

DO ,1 <- #13PLEASE DO ,1 SUB #1 <- #238DO ,1 SUB #2 <- #108DO ,1 SUB #3 <- #112DO ,1 SUB #4 <- #0DO ,1 SUB #5 <- #64DO ,1 SUB #6 <- #194DO ,1 SUB #7 <- #48PLEASE DO ,1 SUB #8 <- #22DO ,1 SUB #9 <- #248DO ,1 SUB #10 <- #168DO ,1 SUB #11 <- #24DO ,1 SUB #12 <- #16DO ,1 SUB #13 <- #162PLEASE READ OUT ,1PLEASE GIVE UP

En bref, INTERCAL est une blague très élaborée. Le genre de blague qui peut vous amener à admirer son créateur pour sa persévérance ou à douter de sa santé mentale, ou peut-être les deux.

JSFuck

Le succès de Brainfuck a stimulé la création de nombreux langages dérivés, trop nombreux pour tous les mentionner. Mais le plus notable est JSFuck.

JSFuck n’est pas un langage approprié, mais c’est plus un style de programmation ésotérique de Javascript qui nécessite d’utiliser seulement 6 caractères. Les programmes résultants sont des programmes JavaScript valides et en fait, ils ont été inventés pour contourner les techniques de sécurité telles que la détection de logiciels malveillants. Ses propriétés le rendaient également utile pour l’obscurcissement du code.

Cela fonctionne car vous pouvez évaluer n’importe quelle expression en Javascript comme n’importe quel type. Donc, représente et un tableau vide, mais en le ajoutant à un +, vous pouvez le forcer à évaluer comme le nombre 0. Pour obtenir une lettre comme a, vous pouvez manipuler la valeur false, etc. Le résultat final est un langage extrêmement verbeux: l’équivalent de alert("Hello World!") fait 22948 caractères.

Malbolge

Malbolge est un langage spécialement conçu pour être presque impossible à utiliser:

via une « opération folle » contre-intuitive, une arithmétique de base trois et un code auto-altérant

selon les mots de son propre créateur.

En fait, même l’auteur n’a jamais écrit de programme de travail avec lui. Le premier programme a été généré par un autre programme qui a implémenté un algorithme de recherche heuristique. La langue n’est pas Turing complète et elle est également basée sur une faute d’orthographe de Malebolge, le huit cercle de l’enfer dans l’Enfer de Dante Alighieri. Donc, il n’a vraiment aucune qualité rédemptrice.

Je n’essaierai pas de le décrire car le tout est explicitement un exercice de frustration. Cependant, il existe une « opération folle » notable qui mérite d’être mentionnée: le cryptage. Le langage est censé fonctionner sur une machine virtuelle ternaire et possède trois registres, dont l’un contient un pointeur vers l’instruction en cours et est appelé . Une fois l’instruction exécutée, le modulo 94 de la valeur en remplace ce qui se trouve en puis le résultat est chiffré selon une table de chiffrement. Bienvenue en enfer, en effet.

Une âme courageuse a créé un programme Hello World.

(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc

Piet

Piet est un langage dans lequel les programmes sont représentés comme des peintures d’art abstrait, dans le style de Piet Mondrian. Il est basé sur une pile et Turing complet.

Il y a 18 couleurs ordonnées en fonction de la teinte et de la luminosité, plus le noir et le blanc. Ces deux derniers ont une signification particulière et sont utilisés pour le flux de contrôle. L’exécution du programme repose sur deux « pointeurs » : un Pointeur de Direction et un Sélecteur de blocs de couleurs. Le DP peut pointer vers le haut, le bas, la gauche et la droite, tandis que le CC ne peut pointer que vers la gauche et la droite. La combinaison de ces deux pointeurs régit l’exécution du programme: essentiellement quel bloc de couleur est exécuté ensuite. La taille d’un bloc de couleur représente un entier. Lorsque le programme fait la transition entre différents blocs de couleur, leur différence de teinte et de luminosité détermine le type de commande exécutée. Les commandes sont les commandes habituelles, comme la sortie d’une valeur, la multiplication, etc.

Le programme Hello World a une certaine beauté.

Bonjour le monde dans Piet par Thomas Schoch

Shakespeare

Shakespeare est un langage conçu pour avoir: « un beau code source qui ressemblait à des pièces de Shakespeare ». Le langage a peu de commandes et il est fonctionnellement similaire au langage d’assemblage, mais il est sans surprise assez verbeux.

Les variables doivent être déclarées dans une section initiale et leurs noms doivent être des caractères shakespeariens valides, tels que Roméo ou Juliette. Ces variables sont des piles sur lesquelles seront exécutées ultérieurement des opérations telles que pop, push et input/output. Le nom des actes et des scènes fonctionne comme des étiquettes goto et la destination de certaines instructions conditionnelles. Les personnages, c’est-à-dire les variables, doivent être appelés sur scène pour être manipulés et il ne peut y en avoir que deux à la fois sur scène.

Les lignes représentent généralement des constantes numériques: certains noms et adjectifs sont convertis en valeurs numériques.

Hamlet: You lying stupid fatherless big smelly half-witted coward!Juliet: You are as villainous as the square root of Romeo!

Des mots spéciaux, comme « Souviens-toi », ou des combinaisons de ceux-ci, comme « Parle ton esprit », exécutent des commandes. Ce sont des commandes normales telles que pousser des valeurs sur le caractère de pile, sortir la valeur de la variable actuelle ou le caractère ASCII correspondant.

Une instruction conditionnelle est représentée par une question d’un caractère et une réponse de l’autre caractère qui détermine où aller, si la condition de la question est vraie.

Juliet: Am I better than you?Hamlet: If so, let us proceed to scene III.

Le Hello World est aussi long et productif qu’une pièce shakespearienne.

The Infamous Hello World Program.Romeo, a young man with a remarkable patience.Juliet, a likewise young woman of remarkable grace.Ophelia, a remarkable woman much in dispute with Hamlet.Hamlet, the flatterer of Andersen Insulting A/S. Act I: Hamlet's insults and flattery. Scene I: The insulting of Romeo.Hamlet: You lying stupid fatherless big smelly half-witted coward! You are as stupid as the difference between a handsome rich brave hero and thyself! Speak your mind! You are as brave as the sum of your fat little stuffed misused dusty old rotten codpiece and a beautiful fair warm peaceful sunny summer's day. You are as healthy as the difference between the sum of the sweetest reddest rose and my father and yourself! Speak your mind! You are as cowardly as the sum of yourself and the difference between a big mighty proud kingdom and a horse. Speak your mind. Speak your mind! Scene II: The praising of Juliet.Hamlet: Thou art as sweet as the sum of the sum of Romeo and his horse and his black cat! Speak thy mind! Scene III: The praising of Ophelia.Hamlet: Thou art as lovely as the product of a large rural town and my amazing bottomless embroidered purse. Speak thy mind! Thou art as loving as the product of the bluest clearest sweetest sky and the sum of a squirrel and a white horse. Thou art as beautiful as the difference between Juliet and thyself. Speak thy mind! Act II: Behind Hamlet's back. Scene I: Romeo and Juliet's conversation.Romeo: Speak your mind. You are as worried as the sum of yourself and the difference between my small smooth hamster and my nose. Speak your mind!Juliet: Speak YOUR mind! You are as bad as Hamlet! You are as small as the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece. Speak your mind! Scene II: Juliet and Ophelia's conversation.Juliet: Thou art as good as the quotient between Romeo and the sum of a small furry animal and a leech. Speak your mind!Ophelia: Thou art as disgusting as the quotient between Romeo and twice the difference between a mistletoe and an oozing infected blister! Speak your mind!

Thue

Thue est un langage de programmation basé sur un système de réécriture de chaînes, appelé système semi-Thue. Il est non déterministe et suit le paradigme de la programmation par contraintes. Ce qui signifie que les variables sont définies en termes de contrainte (ex. quelque chose est vrai ou faux). C’est une bâche de Turing.

Dans le cas de Thue, les coûts sont représentés par une liste de règles de substitution sous la forme:

<string>::=<replacement>

Les formats spéciaux de ce formulaire représentent l’entrée, la sortie ou la fin de la liste des règles.

La nature non déterministe du langage peut être montrée en indiquant deux remplacements possibles pour la même chaîne. Exemple:

  • vous écrivez une règle qui dit que la chaîne a peut être remplacée par stupid
  • vous écrivez également une règle qui dit que la chaîne a peut être remplacée par you are

Lorsqu’un programme est exécuté, la chaîne a peut être remplacée par l’une des deux options.

La liste des règles est suivie d’une chaîne qui représente l’état initial.

Bien qu’écrire un programme utile puisse être difficile, le Hello World typique est assez facile et compréhensible, du moins par la norme des langages de programmation ésotériques.

a::=~Hello World!::=a

Unlambda

Unlambda est un langage fonctionnel (presque) pur conçu pour montrer un langage purement fonctionnel (et probablement à quel point cela serait peu pratique). Il est basé sur une logique combinatoire. C’est Turing complet et la première bâche de Turing fonctionnelle. Il s’appuie sur quelques fonctions, un opérateur apply ` (le caractère backquote) et prend également en charge les entrées / sorties. Techniquement, cela ne fonctionne que sur les fonctions avec un seul argument, mais les fonctions multi-arguments peuvent être traduites en une séquence de fonctions.

Un programme Hello World semble presque lisible.

`r```````````.H.e.l.l.o. .w.o.r.l.di

Autres langages Ésotériques intéressants

Fugue est un langage qui utilise des fichiers MIDI comme code source. Les intervalles entre chaque note sont traduits en commandes traditionnelles spécifiques, telles que l’entrée/sortie ou l’addition.

Beatnik est un langage basé sur une pile qui consiste en une série de mots anglais; les espaces et la ponctuation sont ignorés. Les mots sont convertis en commandes traditionnelles en fonction de leur valeur dans le jeu Scrabble.

Les espaces sont un langage de plaisanterie dans lequel seuls les caractères d’espace, tels que les tabulations et les espaces, sont valides et tout autre caractère est ignoré. C’est, bien sûr, l’inverse du comportement habituel des compilateurs qui ignorent les espaces. Compte tenu de ces caractéristiques, il peut être utilisé dans un programme Polyglotte, c’est-à-dire un programme valable pour plusieurs langues. Tant que l’autre langage n’est pas Python, ou n’importe quel langage où les espaces sont importants.

GolfScript est un langage de programmation concaténatif conçu pour gagner des compétitions de code-golf, qui est également Turing complet.

Snowflake est un langage auto-modifiable réversible dans lequel l’interpréteur et le programme sont modifiés à chaque exécution.

FRACTRAN est un langage dans lequel les programmes sont une liste de fractions et un nombre initial. Je ne sais pas ce qu’il fait, mais il fait quelque chose, car il a une page Wikipedia.

Iota et Jot sont deux langages formels, chacun conçu pour être le système formel le plus simple. De par leur nature, ils peuvent également être considérés comme des langages de programmation tout aussi minimalistes, Turing tarpit. Les deux n’utilisent que deux symboles et effectuent deux opérations. Un successeur, appelé Zot, prend également en charge les entrées / sorties.

Entropy est un langage de programmation très bien nommé conçu pour accepter l’idée d’abandonner le contrôle. Toute sortie du programme sera approximée et chaque fois que les données sont accédées, elles sont modifiées de manière aléatoire. Le langage ne modifie pas le programme d’origine, donc à chaque exécution, la sortie sera différente, mais l’état initial sera conservé. Un effet secondaire curieux de la randomisation des données est Drunk Eliza, une version Web du programme Eliza classique dans laquelle le thérapeute semble être ivre.

Monicelli est un langage de plaisanterie basé sur le film comique Mes amis. Un programme typique ressemble à une série de phrases italiennes absurdes. Étonnamment, cela a du sens puisque le film utilisé comme inspiration comporte également des phrases absurdes. C’est le cercle de la folie.

Résumé

Le monde du langage de programmation ésotérique est aussi excitant qu’affolant: il n’y a pas de règles, mais beaucoup de choses intéressantes. J’espère vous avoir donné une fenêtre un peu saine d’esprit sur ce à quoi vous pouviez vous attendre.

Si vous voulez en savoir plus ou participer à cette communauté, je vous suggère de regarder les Esolangs. Ce site Web, avec Wikipedia, est la source de la plupart des exemples présentés dans cet article. Vous pouvez également y trouver de l’inspiration dans une liste d’idées pour un langage de programmation ésotérique.

Vous trouverez peut-être aussi intéressant le blog de Marc C. Chu-Carroll dans ses nombreuses incarnations au cours des années. Comme le nom Good Math, Bad Math l’indique, il est principalement dédié aux mathématiques. Néanmoins, il contient également de nombreuses analyses des langages de programmation ésotériques dans une série appelée Programmation pathologique (Langage). Vous pouvez en voir, par exemple, un dédié au plus petit langage de programmation.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.

Previous post Roues d’Agrumes Séchées Maison
Next post Sang et Chocolat (2007)