Obscur

2003.04.01

Whitespace

Pour des raisons d’interoperabilité, un navigateur web n’affiche pas les caractères de retour-chariot d’un document, ni les caractères de tabulation, et ignore tous les espaces au delà d’une. La raison de cette ignorance est tout simple : le chiffre correspondant au retour-chariot sur une plateforme — UNIX, par exemple — n’est pas le même pour une autre plateforme, comme Windows. Il n’y a pas de secret que pour un ordinateur, tout est représenté par un chiffre. Il en va du même pour les caractères d’écriture, où à chacun des caractères est attribué un chiffre spécifique. Dans l’encodage ASCII par exemple, la lettre ’A’ est représenté par le chiffre 65. Le ’a’, en contrepartie, est représenté par le chiffre 97. Mais selon qu’on soit une machine UNIX, Windows, Mac Classic, ou Mac OS X, le chiffre 12 sera interprété soit comme un retour-chariot, soit comme rien du tout et donc à ignorer. Car certaines plateformes représente le retour-chariot avec un chiffre 12, d’autres avec un 13, et d’autres par un chiffre tout autre. Complexifiant encore plus l’affaire, arrive le fait que sur certaines plateformes il y a une différence entre le caractère pour descendre une ligne mais rester horizontalement à la même position sur la feuille, et le retour-chariot où l’on descend une ligne et revient sur la position totalement à gauche (ou à droite si on écrit en langue arabe). Il existe même un caractère pour revenir au début de la ligne sans descendre à une nouvelle ligne — un retour du chariot sans avancement du rouleau; cette fonction est très pratique pour les interfaces à base de texte qui aimeraient économiser l’espace réstreint, et minimaliste, du terminal (on voit souvent cet effet dans des films comme Wargames quand l’ordinateur affiche le temps réstant avant la déstruction du monde). Pour toutes ces raisons, et bien d’autres encore (ne parlons pas de la tabulation, par exemple), Tim-Berners Lee a jugé bon d’ignorer tout espace au delà d’une, tout caractère de tabulation, et tout caractère représentant un retour chariot. Comme de toute façon le standard HTML exige que l’on explicite la structure sémantique du texte sans s’occuper de sa présentation, cela a encore plus de sens que ces caractères soit ignorés par le navigateur.

Il en va du même pour plusieurs langages de programmation. Le plus célèbre étant le langage C, qui a introduit l’idée que la fin d’une ligne n’est pas définie par un retour-chariot, ni même par un point, mais par un point virgule. De cette façon, un programmeur peut visuellement formatter à peu près comme il veut son programme, mettant tout le programme sur une seule ligne s’il le veut, ou en ajoutant plein de retour-chariots et tabulations, y compris à l’intérieur d’une déclaration, pour rendre plus lisible son code. Dans le langage Objective-C, par exemple, qui s’écrit en quelque sorte à l’intérieur langage C, on peut facilement écrire des commandes comme celles-ci :

{{color = (NSColor colorWithCalibratedHue:0.10 saturation:0.82 brightness:0.89 alpha:1.00);}}

…que beaucoup de programmeurs coupent en plusieures lignes, comme ceci :

{{color = [NSColor colorWithCalibratedHue: 0.10
saturation: 0.82
brightness: 0.89
alpha: 1.00];}}

Le rôle de chacun des paramètres (saturation, brightness, etc.) est plus facile si nous utilisons des retour-chariots et des tabulations pour formatter notre code. Mais l’effet pour l’ordinateur est le même : au moment de la compilation il ignore tous les espaces, toutes les tabulations, et tous les retour-chariot. Il ne voit que les mots, les signes de ponctuation, et les valeurs. Ceci peut sembler hautement obscur pour quelqu’un qui n’aurait jamais écrit une ligne de code informatique, mais elle est très astucieuse pour ceux qui en font tous les jours.

C’est dans ce contexte obscurantiste qu’est née le langage de programmation Whitespace. Pour tout dire, il s’agit d’un langage de programmation où tous les caractères invisibles sont fonctionnels, et tous les caractères visibles ignorés. Exactemment l’inverse alors des situations que nous venons de décrire. Les espaces, les retour-chariot, et surtout les tabulations, sont tous fonctionnels dans le language Whitespace, alors que les signes que vous lisez ici sont totalement ignorés par la machine lors de l’execution.

Selon les concepteurs du language, il y aurait deux avantages de leur dispositif. La première serait que le prommeur puisse intégrer son code directement dans le mode d’emploi de ce même code. Pour tout ce que vous savez, il pourrait y avoir par exemple du code Whitespace inclus dans les lignes que vous lisez ici. Comme le navigateur n’imprime pas au-delà d’un espace et ignore les tabulations et retour-chariot, vous serez alors obligé de passer cette page dans un interprétateur Whitespace pour en être sûr. Ce qui nous amène au deuxième avantage de Whitespace, la possibilité de jouer des effets cryptographiques de la machine. Un espion, voire un terroriste, peut faire transiter un message codé en plein milieu des pages sur l’éducation civique ou familiale, passant ainsi sous le radar de tous les systèmes Carnivore du FBI, à moins que ceux-ci soit déjà au courrant du subterfuge.

Il existe donc trois caractères fonctionnels dans le language Whitespace et qui correspondent à trois valeurs spécifiques sur le tableau ascii. Il utilise l’espace (= ASCII 32), la tabulation (= ASCII 9), et un retour à la ligne particulier, appelé « line feed » en anglais, c’est-à-dire l’avancement du rouleau sans retour-chariot (= ASCII 10). L’idée d’utiliser le « line feed » et non pas le retour-chariot classique était un choix de conception fait pour éviter des problèmes liées aux plateformes variées évoqués plus haut.

Dans l’usage, Whitespace est très proche du language Assembler, et donc du redistributeur/suceur de cailloux Malloy de Samuel Beckett. Dans Malloy, Assembler et Whitespace, la machine sert d’un emplacement temporaire, la pile, ou « stack » en anglais, c’est-à-dire un endroit où l’on peut placer des valeurs, des calculi, des cailloux, avant de le redistribuer dans les poches, la mémoire ou régistres de la machine. On ne peut qu’affecter un nombre limité de calculi dans le stock, et on ne peut que traiter les calculi les uns après les autres. Pour « pousser » alors une valeur sur la pile dans Whitespace, on utilise la combinaison [ESPACE][ESPACE] et suivi par le nombre d’[ESPACE] que l’on souhaite affecter. Par exemple [ESPACE][ESPACE][ESPACE][ESPACE][ESPACE] affecte la valeur trois sur la pile. Si deux valeurs sont ensuite sur la pile, l’une sur l’autre, on peut les additionner en écrivant [TABULATION][ESPACE][ESPACE][ESPACE], ou les miltiplier en écrivant [TABULATION][ESPACE][ESPACE][LINEFEED]. Le résultat est ensuite placé en haut de la même pile, que l’on puisse ensuite afficher à l’utilisateur en écrivant [TABULATION][LINEFEED][ESPACE][ESPACE]; et ainsi de suite. Par exemple, le programme suivant additionnerait deux valeurs et afficherait le résultat à l’utilisateur (j’écris, comme en haut, toutes les signes invisibles pour plus de lisibilité) :

{{Voici un programme pour calculer le resultat de la multiplication de la valeur
[ESPACE][ESPACE][ESPACE][ESPACE][ESPACE][ESPACE][ESPACE][ESPACE][ESPACE][ESPACE]8
et la valeur
[ESPACE][ESPACE][ESPACE][ESPACE][ESPACE][ESPACE]4.

Le résultat est[TABULATION][ESPACE][ESPACE][LINEFEED][TABULATION][LINEFEED][ESPACE][ESPACE].}}

Évidemment, si je lisais les codes sources de ce programme sans les signes [ESPACE] ou [TAB] comme je viens de les écrire, je ne verrai que le programme suivant :

{{Voici un programme pour calculer le résultat de la multiplication de la valeur
8
et la valeur
4.

Le résultat est .}}

Notez que la dernière phrase du programme est incomplet, « Ce résultat est . », car il n’a pas encore été executé et donc pas encore calculé par la machine. Rien n’est écrit à cet endroit car il s’agit d’un programme, et un programme doit fonctionner pour afficher des résultats.

Par contre, si je passe ce code dans l’interprétateur Whitespace, mon programme est executé et le texte alors complété :

{{Voici un programme pour calculer le résultat de la multiplication de la valeur
8
et la valeur
4.

Le résultat est 42.}}

La machine a fait rentrer la valeur 32 sur la pile, ensuite la valeur 10, puis, lors de la dernière ligne, elle a calculé le résultat des deux valeurs, placé ce résultat en haut de la pile, puis affiché cette valeur actuellement en haut de la pile à l’utilisateur. Puisque cette partie du code était glissé juste avant le point de la phrase, elle a écrit le résultat à cet endroit là, en términant alors la phrase avec le résultat du calcul suivi par le point.

Si tout cela vous semble assez obscur, cela fait partie du jeu. Écrire des programmes les plus obscurs, les plus illisibles, ou les plus difficiles à compiler fait parti de la tradition des hackers depuis au moins 50 ans, c’est-à-dire depuis le tout début de l’informatique.

Mais il y a deux autres intérêts pour nous qui réfléchissons sur les rapports entre code et art, autrement dit le CODE|ART, à savoir le rapport entre fonctionalité et visibilité, couplé avec la question de l’art et de l’abstraction, autrement dit de l’art comme moyen d’abstraire.

Sur l’aspect de la visibilité, Whitespace le joue très fort. Renversant à une couche encore plus supplémentaire ce que JODI renversait déjà avec une force certaine via wwwwwwwww.jodi.org, Whitespace rajoute même un commentaire sur le rôle des marges dans l’écriture digne d’une analyse de Derrida. L’espace que Whitespace occupe n’est pas dicible, il est, comme tout éspace blanc d’écriture visuelle sans être visible, une ponctuation rythmique qui nous ramène aux traits musicaux de la machine.

Espaçons. L’art de ce texte, c’est l’air qu’il fait circuler entre ses paravents. Les enchaînements sont invisibles, tout paraît improvisé ou juxtaposé. Il induit en agglutinant plutôt qu’en démontrant, en accolant et en décollant plotôt qu’en exhibant la nécessité continue et analogique, enseignante, étouffante, d’une rhétorique discursive.
– Jacques Derrida ; Glas ; 1974 ; pp. 88

Whitespace joue le trait inénarrable, pareil au Carbon (cf. zigzag) de Servovalve, à l’intérieur de la programmation elle-même. La machine pousse le jeu de la programmation jusqu’à la parodie, en redoublant son illisibilité intrinsèque comme un trait figuratif, comme figure même de ce qui est à l’œuvre.

Du coup l’effet critique de ce language vis-à-vis des languages informatiques, le rôle qu’il joue de parodie, de répétition, introduit une lecture ironique du language informatique en général. Il s’agit d’une lecture abstraite du système d’écriture informatique, d’une lecture récursive du dispositif. Si le jeu de la récursion, du meta, c’est-à-dire le jeu d’abstraire des effets des systèmes et des dispositifs — si ce jeu du meta faisait partie intégrante de la création artistique, alors Whitespace serait en haut de la pile.