Est-ce que Little Endian a gagné?

34

Récemment, alors qu’il enseignait la bataille Big vs Little Endian, un étudiant a demandé si elle était réglée et j’ai réalisé que je ne le savais pas. En regardant l'article de Wikipedia , il semble que les paires d'OS / d'architecture les plus populaires actuelles utilisent Little Endian, mais que le protocole Internet spécifie Big Endian pour le transfert de valeurs numériques dans les en-têtes de paquets. Serait-ce un bon résumé de l'état actuel? Est-ce que les cartes réseau ou les processeurs actuels prennent en charge le matériel pour changer l'ordre des octets?

Ellen Spertus
la source

Réponses:

25

Je dirais que ce n'est pas tant gagné que d'avoir cessé d'avoir de l'importance. ARM, qui constitue pratiquement tout le marché de la téléphonie mobile, est bi-endian (oh, l'hérésie!). Dans le sens où x86 a essentiellement "gagné" le marché des ordinateurs de bureau, je suppose que l’on pourrait dire que le petit endian a gagné mais je pense que compte tenu de la profondeur globale du code (peu profonde) et des abstractions (beaucoup) de nombreuses applications actuelles, c’est beaucoup moins un problème c'était l'habitude. Je ne me souviens pas que l’endianisme ait vraiment été abordé dans mon cours d’architecture informatique.

Je suppose que beaucoup de développeurs ne sont même pas conscients de l’endianisme ou de son importance. Parce que pour la grande majorité (et la vaste majorité), cela n’a absolument aucun rapport avec leur environnement de travail quotidien. C'était différent il y a 30 ans, lorsque tout le monde codait de manière beaucoup plus proche du métal, par opposition à la manipulation de fichiers texte sur un écran de manière fantaisiste et dramatique.

Je soupçonne généralement que la programmation orientée objet était le début de la fin de la gestion de l’endianisme puisque les couches d’accès et d’abstraction dans un bon système OO masquent les détails d’implémentation de l’utilisateur. Comme la mise en œuvre inclut l’endianisme, les gens s’y sont habitués, ce n’est pas un facteur explicite.

Addendum: zxcdw a mentionné que la portabilité était une préoccupation. Cependant, qu'est-ce qui a surgi avec vengeance au cours des 20 dernières années? Langages de programmation construits sur des machines virtuelles. Bien que l’endianité de la machine virtuelle puisse avoir de l’importance, elle peut toutefois être très cohérente pour cette seule langue au point qu’il s’agisse essentiellement d’un problème. Seuls les développeurs de machines virtuelles devraient même se soucier de l’endianisme du point de vue de la portabilité.

Ingénieur du monde
la source
2
Cela reste important dans de nombreux domaines très pertinents, par exemple lors de l’écriture de toute forme de code portable. Enfait, là où cela n’a probablement pas d’importance, c’est lors de l’écriture de code non portable lié à une plateforme.
Zxcdw
@zxcdw qui nous mène directement à l'armée des langages de machine virtuelle ... je n'y avais pas pensé.
Ingénieur mondial
Votre addendum n'est pas tout à fait vrai (et je ne suis pas non plus d'accord avec @zxcdw): la finalité ne joue que dans la traduction entre des entiers multioctets et des flux d'octets. Elle devient un problème implicite et varie d'une plate-forme à l'autre. La plupart des langages modernes (qu’ils soient basés sur une machine virtuelle ou non) atteignent la portabilité en le faisant rarement (avec des entiers en tant que type de données opaque), puis ont une finalité spécifiée indépendamment de la plate-forme ou explicitement choisie par le programmeur.
Michael Borgwardt
2
@MichaelBorgwardt ARM fait arium.com/pdf/Endianness.pdf
World Engineer
2
@zxcdw - même en assembleur, vous n'avez pas toujours besoin de connaître l'ordre final. Les constantes, par exemple, n'ont pas besoin d'être spécifiées octet à la fois. La situation est quelque peu similaire à un certain style de sérialisation en C - x & 0xFFvous donne toujours l'octet le moins significatif, quel que soit le classement final (en supposant que vos octets sont de 8 bits chacun) car vous avez spécifié les bits qui vous intéressent par leur valeur, pas leur position relative dans la mémoire.
Steve314
4

Endians ne compte vraiment que lorsque vous transférez des systèmes de données binaires.

Avec l’avancement de la vitesse du processeur (et le coût de stockage beaucoup plus bas), les interfaces de données binaires deviennent de plus en plus rares, vous ne les remarquerez donc plus au niveau de la couche application. Vous utilisez un format de transfert textuel (XML / JSON) ou une abstraction de couche de données prenant en charge la traduction pour vous (pour que vous ne remarquiez même pas qu'il existe une traduction).

Mais lorsque vous codez au niveau de la couche de données binaires, vous remarquez que c'est très important. Par exemple, lorsque je travaillais chez VERITAS (Symantec maintenant), je construisais un logiciel qui était construit sur 25 plates-formes matérielles différentes (il n’ya pas que les grands / petits endians, il en existe d’autres).

Martin York
la source
Mes étudiants ont également développé des technologies pour les téléphones mobiles et le cloud computing. Ils savent donc que le monde n’est pas un PC ni un Mac.
Ellen Spertus
@Loki - Il est possible de sérialiser et de désérialiser sans connaître le numéro final de la machine. Vous avez seulement besoin de connaître l'ordre des octets dans les fichiers / flux / peu importe. Par exemple, (char) (x & 0xFF)en C vous donne l'octet le moins significatif indépendamment des problèmes finaux, en supposant que l'octet est de 8 bits. J'ai conçu des formats de fichiers binaires sans connaître les machines sur lesquelles le logiciel serait exécuté - j'ai essentiellement choisi un ordre final pour le format de fichier sans me soucier du matériel.
Steve314
@ Espertus: Bien sûr possible.
Martin York
1
@ Steve314: Oui bien sûr, vous pouvez. Lorsque vous travaillez sur la "couche de données binaires", vous pouvez concevoir le schéma de votre choix pour sérialiser vos données. Il n'est pas difficile de concevoir des schémas portables. Personnellement, je ne prendrais pas la peine de réinventer une roue construite et testée depuis les années 60. Regarde ` h2nl et sa famille. cette famille de fonctions fournit une méthode portable (standard) optimale pour votre plate-forme.
Martin York
4

Non, personne n'a gagné. En tant qu'espèce, nous n'avons pas réussi à normaliser l'ordre dans lequel nous stockons nos octets, ainsi que la direction que nous écrivons et le côté de la rue où nous conduisons.

Par conséquent, quiconque souhaite transférer des données entre deux systèmes différents sur un réseau ou dans un fichier n'a que 50% de chances que la version initiale raisonnable de son code de sauvegarde des données soit correcte dans son environnement, et même si cela fonctionne. , a 50% de chances de travailler chez leurs clients.

Pour gérer cela, vous devez rechercher des fonctions spécifiques à la plate-forme portant des noms tels que "htonl" dans des en-têtes dont les noms remontent évidemment aux années 70, telles que "arpa / inet.h", car la situation ne s’est pas améliorée depuis et ne le sera probablement jamais. .

Andrew Wagner
la source
10
s’avère que nous avons standardisé - au lieu d’envoyer 4 octets pour représenter un entier, nous envoyons un bloc de texte formaté avec un texte d’en-tête spécial, des crochets, des mots-clés et une représentation ASCII de ces 4 octets. Le destinataire analyse ensuite le formatage pour obtenir le texte entier et le reconvertit en 4 octets. Cela s'appelle le progrès, on me dit :-)
gbjbaanb
$ aptitude search xml | wc -l 677
Andrew Wagner
1

Il n'y a toujours pas de consensus:

  • La majorité des grands systèmes informatiques (serveur / ordinateur de bureau / ordinateur portable) utilisent actuellement des architectures little-endian
  • La majorité des ordinateurs plus petits (tablettes / téléphones) utilisent une architecture de processeur indépendante de l'environnement, mais exécutent des systèmes d'exploitation utilisant un ordre little-endian.

Donc, au niveau du matériel, LE est beaucoup plus commun. Mais:

  • La plupart des communications entre ordinateurs sont effectuées à l'aide de protocoles spécifiant l'ordre big-endian
  • Une très grande partie des logiciels du monde s'exécutent sur une plate-forme virtuelle dont la commande par défaut est big-endian lorsque les données sont écrites sur un stockage externe.

Les deux commandes seront avec nous dans un avenir prévisible.

Jules
la source
La majorité des systèmes les plus importants (c.-à-d. Le "gros fer") est généralement big-endian. Autrement dit, les systèmes dits mini ou mainframe (qui représentent une part énorme du traitement de l’arrière-plan, la plupart d’entre nous n’y
@jdv Mais la plupart des systèmes informatiques les plus importants sont de petites machines Endian x86-64, et là, la performance compte.
user877329
Je ne pense pas que quiconque puisse affirmer de manière convaincante que l’endianisme est plus que la commodité des concepteurs d’architecture (quel que soit leur objectif). À l'époque où j'ai fait cet ancien commentaire, le gros fer était BE. Mais ce n'est pas parce que c'est BE, mais parce que l'architecture se trouve de cette façon.