Boutisme

Un article de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 6 octobre 2005 à 22:30 et modifiée en dernier par Merlin8282 (discuter | contributions). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.


En informatique, quand un entier ou toute autre donnée est représenté sur plusieurs octets, il y a plusieurs manières d'ordonner ces octets en mémoire ou dans une communication ; cet ordre est déterminé par des conventions arbitraires.

Il en est de même dans l'écriture des langages humains : certains s'écrivent de gauche à droite, alors que d'autres s'écrivent de droite à gauche (sans parler de ceux qui s'écrivent à la verticale). Cette convention en informatique est appelée endianness et a deux alternatives majeures nommées big-endian et little-endian, qui sont parfois traduites en gros-boutiste et petit-boutiste. On entend parler aussi de byte order, d'ordre des octets ou de byte sex. Il faut noter que cela ne concerne pas les séquences d'octets simples comme les chaînes de caractères codées en ASCII, et autres codes de même genre où un octet correspond à un caractère. Les chaînes de caractères Unicode, codées en UTF-16 ou UTF-32, quant à elles, sont concernées parce que, dans ce cas, c'est un ensemble de 2 ou 4 octets qui représente un caractère.

Dans les ordinateurs

Quand certains ordinateurs enregistrent un entier sur 32 bits en mémoire, par exemple 0xA0B70708 en notation hexadécimale, ils l'enregistrent dans des octets dans l'ordre qui suit : A0 B7 07 08. Ainsi, l'octet de poids le plus fort (ici A0) est enregistré à l'adresse mémoire la plus petite, l'octet de poids inférieur (ici B7) est enregistré à l'adresse mémoire suivante et ainsi de suite.

Les architectures qui respectent cette règle sont dites big-endian ou gros-boutistes, par exemple les processeurs Motorola 68000, les SPARC (Sun Microsystems) ou encore les System/370 (IBM).

Les autres ordinateurs enregistrent 0xA0B70708 dans l'ordre suivant : 08 07 B7 A0, c'est-à-dire avec l'octet de poids le plus faible en premier. De telles architectures sont dites little-endian ou petit-boutistes. Par exemple, les processeurs x86, qui se trouvent dans les PC ont une architecture petit-boutiste.

Certaines architectures supportent les deux règles, par exemple les architectures PowerPC (IBM), ARM, DEC Alpha, MIPS, PA-RISC (HP) et IA-64 (Intel). On les appelle bytesexual, bi-endian ou, plus rarement, biboutistes. Le choix du mode peut se faire au niveau logiciel, au niveau matériel ou aux deux.

Certaines autres architectures, appelées middle-endian, ont un ordonnancement plus complexe, par exemple 0xA0B70708 est enregistré ainsi : 07 08 A0 B7. Il est plus difficile de travailler avec des tels processeurs, les PDP par exemple.

La numérotation des bits dans une architecture big-endian est ainsi : les bits sont numérotés de la gauche, donc le bit 0 a le poids le plus fort, et le bit 7 étant celui de poids le plus faible dans un octet. Il semble plus intuitif de numéroter les bits à la manière little-endian si un octet doit représenter un entier, car dans ce cas, le numéro du bit correspond à l'exposant. Cependant, si l'octet doit représenter une fraction binaire, alors, la convention big-endian convient mieux.

Un moyen mnémotechnique pour ne pas se mélanger les idées, il suffit de remplacer « endian » par « head ». Ce qui nous donne : "big head" pour les bits de poids « fort en tête » "small head" pour les bits de poids « faible en tête »

Dans les communications

On appelle cela le problème NUXI, en effet si on veut envoyer la chaîne « UNIX » en regroupant deux octets par mot entier de 16 bits sur une machine de convention différente, alors on obtient NUXI. Ce problème a été découvert en voulant porter une des premières versions d'Unix d'un PDP-11 little-endian sur une architecture IBM big-endian.

Le protocole IP définit un standard, le network byte order (soit ordre des octets du réseau). Dans ce protocole, les informations binaires sont en général codées en paquets, et envoyées sur le réseau, l'octet de poids le plus fort en premier, c'est-à-dire selon le mode big-endian et cela quel que soit l'endianness naturel du processeur hôte.

Les périphériques doivent aussi respecter une convention afin d'assurer la cohérence du système. Tout cela est fixé par le modèle OSI.

Logiciels et portabilité

On a bien compris que ces conventions posent des problèmes dans le portage des logiciels. Par exemple, en lisant des données binaires, selon l'architecture, on ne va pas obtenir la même donnée après lecture si on ne soucie pas de la convention.

Bien sur le choix de big-endian ou little-endian est toujours arbitraire, ce qui soulève des débats intensifs, car il y a nombre d'arguments en faveur de l'un et de l'autre. Les langues par exemple, selon la linguistique germanique, anglaise, ou autre, on n'a pas la même perception.

Écriture des nombres dans les langues humaines

Le problème du choix du sens d'écriture se pose aussi pour l'écriture des nombres en notation positionnelle dans les langues humaines.

Dans les langues utilisant l'alphabet latin, qui se lisent de gauche à droite, les nombres s'écrivent en commençant par les chiffres de poids le plus forts. C'est donc une convention big-endian. En arabe, c'est l'inverse: on écrit — cette fois de droite à gauche — d'abord les unités, puis les dizaines, etc. C'est une convention little-endian... relativement au sens d'écriture ordinaire de cette langue. (Il est amusant de constater que ces deux conventions opposées donnent le même résultat, du point de vue gauche-droite : les unités à droite...)

Étymologie

Les termes big-endian et little-endian ont été empruntés aux Voyages de Gulliver de Jonathan Swift, dans lequel ces deux clans de Lilliputiens se font la guerre à cause de la manière différente qu'ils ont de casser les œufs à la coque : par le gros ou le petit bout.