Hat Little Endian gewonnen?

34

Als ich kürzlich über die Schlacht zwischen Big und Little Endian unterrichtete, fragte ein Student, ob sie beigelegt worden sei, und mir wurde klar, dass ich es nicht wusste. Betrachtet man den Wikipedia-Artikel , so scheint es, dass die gängigsten aktuellen Paare von Betriebssystemen und Architekturen Little Endian verwenden, das Internet Protocol jedoch Big Endian für die Übertragung numerischer Werte in Paketheadern festlegt. Wäre das eine gute Zusammenfassung des aktuellen Status? Bieten aktuelle Netzwerkkarten oder CPUs Hardwareunterstützung für das Umschalten der Bytereihenfolge?

Ellen Spertus
quelle

Antworten:

25

Ich würde argumentieren, dass es nicht so sehr gewonnen als aufgehört hat, wichtig zu sein. ARM, das im Grunde genommen den gesamten Mobilfunkmarkt ausmacht, ist Bi-Endian (oh, die Häresie!). In dem Sinne, dass x86 im Grunde genommen den Desktop-Markt "gewonnen" hat, könnte man sagen, dass Little Endian gewonnen hat, aber ich denke, angesichts der allgemeinen Codetiefe (flach) und Abstraktion (viele) vieler heutiger Anwendungen ist dies weitaus weniger ein Problem als ich war. Ich kann mich nicht erinnern, dass Endianness in meiner Klasse für Computerarchitektur wirklich aufgetaucht ist.

Ich vermute, dass sich viele Entwickler nicht einmal der Endianness bewusst sind oder warum es wichtig ist. Denn für die große (und ich meine die große ) Mehrheit ist es für ihr tägliches Arbeitsumfeld völlig irrelevant. Dies war vor 30 Jahren anders, als jeder viel näher am Metall programmierte, als Textdateien auf einem Bildschirm auf ausgefallene und dramatische Weise zu manipulieren.

Mein allgemeiner Verdacht ist, dass die objektorientierte Programmierung der Anfang vom Ende der Sorge um Endianness war, da die Ebenen des Zugriffs und der Abstraktion in einem guten OO-System Implementierungsdetails vor dem Benutzer verbergen. Da die Implementierung Endianness beinhaltet, haben sich die Leute daran gewöhnt, dass dies kein expliziter Faktor ist.

Nachtrag: zxcdw erwähnte, dass die Portabilität Anlass zur Sorge gibt. Was ist jedoch in den letzten 20 Jahren mit aller Macht geschehen? Programmiersprachen, die auf virtuellen Maschinen basieren. Sicher, die Endianität der virtuellen Maschine ist wichtig, aber sie kann für diese eine Sprache bis zu einem Punkt sehr konsistent gemacht werden, an dem es im Grunde genommen kein Problem gibt. Lediglich die VM-Implementierer müssten sich vom Standpunkt der Portabilität aus um die Endianness kümmern.

Weltingenieur
quelle
2
Es gibt noch viele sehr relevante Bereiche , in denen es wichtig ist , zum Beispiel beim Schreiben jede Form von portablen Code. Tatsächlich spielt es wahrscheinlich keine Rolle, wenn Sie nicht portablen Code schreiben , der an eine Plattform gebunden ist.
ZXCDW
@zxcdw, das uns direkt zur Armee der Sprachen virtueller Maschinen führt ... Daran hatte ich nicht gedacht.
Weltingenieur
Ihr Nachtrag ist nicht ganz wahr (und ich stimme auch nicht mit @zxcdw überein): Endianness ist nur bei der Übersetzung zwischen Multibyte-Ganzzahlen und Byte-Streams von Bedeutung und wird zu einem Problem, wenn dies implizit erfolgt und plattformabhängig ist. Die meisten modernen Sprachen (unabhängig davon, ob sie auf VMs basieren oder nicht) sind portabel, wenn Sie dies nur selten tun (mit Ganzzahlen als undurchsichtigem Datentyp) und dann entweder plattformunabhängig oder explizit vom Programmierer ausgewähltes Endianness verwenden.
Michael Borgwardt
2
@MichaelBorgwardt ARM macht arium.com/pdf/Endianness.pdf
World Engineer
2
@zxcdw - Selbst in Assembler müssen Sie die Endian-Reihenfolge nicht immer kennen. Konstanten müssen beispielsweise nicht byteweise angegeben werden. Die Situation ähnelt einer bestimmten Art der Serialisierung in C - x & 0xFFgibt Ihnen unabhängig von der Endian-Reihenfolge immer das niedrigstwertige Byte (vorausgesetzt, Ihre Bytes haben jeweils 8 Bits), da Sie die gewünschten Bits anhand ihres Werts angegeben haben. nicht ihre relative Position im Gedächtnis.
Steve314
4

Endianer sind nur dann wirklich wichtig, wenn Sie Binärdatensysteme übertragen.

Mit zunehmender Prozessorgeschwindigkeit (und viel geringeren Speicherkosten) werden binäre Datenschnittstellen immer seltener, sodass Sie sie auf der Anwendungsebene nicht bemerken. Sie verwenden entweder ein Textübertragungsformat (XML / JSON) oder Sie verwenden eine Datenebenenabstraktion, die die Übersetzung für Sie übernimmt (sodass Sie nicht einmal bemerken, dass es eine Übersetzung gibt).

Aber wenn Sie auf der Ebene der Binärdaten codieren, bemerken Sie dies und es ist sehr wichtig. Als ich zum Beispiel bei VERITAS (jetzt Symantec) gearbeitet habe, habe ich Software entwickelt, die auf 25 verschiedenen Hardwareplattformen basiert (es gibt nicht nur Big / Little Endian, sondern auch andere Typen).

Martin York
quelle
Meine Schüler haben auch für Mobiltelefone entwickelt und Cloud-Computing verwendet, sodass sie wissen, dass die Welt nicht aus PCs und Macs besteht.
Ellen Spertus
@Loki - Serialisieren und De-Serialisieren ist möglich, ohne den Endian der Maschine zu kennen. Sie müssen nur wirklich die Bytereihenfolge der Daten in den Dateien / Streams / was auch immer kennen. (char) (x & 0xFF)In C erhalten Sie beispielsweise unabhängig von Endian-Problemen das niedrigstwertige Byte, vorausgesetzt, ein Byte besteht nur aus 8 Bits. Ich habe binäre Dateiformate entworfen, ohne die Maschinen zu kennen, auf denen die Software ausgeführt werden würde. Ich habe mich grundsätzlich für eine Endian-Bestellung für das Dateiformat entschieden, ohne mich um die Hardware zu kümmern.
Steve314
@espertus: Sicher möglich.
Martin York
1
@ Steve314: Ja natürlich kannst du. Wenn Sie am "Binary Data Layer" arbeiten, können Sie jedes Schema entwerfen, mit dem Sie Ihre Daten serialisieren möchten, und es ist nicht schwer, tragbare Schemata zu entwerfen. Ich persönlich würde mir nicht die Mühe machen, ein Rad neu zu erfinden, das seit den 60er Jahren gebaut und getestet wurde. Schauen Sie nach ` h2nl und Familie. Diese Funktionsfamilie bietet eine tragbare (Standard-) Möglichkeit, Dinge zu erledigen, die für Ihre Plattform optimal sind.
Martin York
4

Nein, niemand hat gewonnen. Wir als Spezies haben es nicht geschafft, die Reihenfolge, in der wir unsere Bytes speichern, zusammen mit der Richtung, in die wir schreiben, und der Straßenseite, auf der wir fahren, zu vereinheitlichen.

Infolgedessen hat jeder, der Daten zwischen zwei verschiedenen Systemen über ein Netzwerk oder in einer Datei übertragen möchte, nur eine 50-prozentige Chance, dass die vernünftige Erstversion seines Data-Dumping-Codes in seiner Umgebung korrekt ist, und selbst wenn dies funktioniert hat eine 50% ige Chance, bei ihren Kunden zu arbeiten.

Um dies zu bewältigen, müssen Sie plattformspezifische Funktionen mit Namen wie "htonl" in Headern nachschlagen, deren Namen offensichtlich auf die 70er Jahre zurückgehen, wie "arpa / inet.h", da sich die Situation seitdem nicht verbessert hat und dies wahrscheinlich nie mehr tun wird .

Andrew Wagner
quelle
10
Es hat sich herausgestellt, dass wir standardisiert haben - anstatt 4 Bytes zu senden, um eine Ganzzahl darzustellen, senden wir einen Textblock, der mit speziellem Header-Text, spitzen Klammern, Schlüsselwörtern und einer ASCII-Darstellung dieser 4 Bytes formatiert ist. Das empfangende Ende analysiert dann die Formatierung, um den ganzzahligen Text zu erhalten, und konvertiert ihn zurück in 4 Bytes. Dies nennt man Fortschritt, wie mir gesagt wurde :-)
gbjbaanb
$ aptitude search xml | wc -l 677
Andrew Wagner
1

Es besteht noch kein Konsens:

  • Die meisten größeren Computersysteme (Server / Desktop / Laptop) verwenden derzeit Little-Endian-Architekturen
  • Die Mehrheit der kleineren Computer (Tablets / Telefone) verwendet eine von Endianess unabhängige Prozessorarchitektur, aber Betriebssysteme, die Little-Endian-Reihenfolge verwenden

Auf Hardwareebene ist LE also weitaus häufiger. Aber:

  • Die meiste Kommunikation zwischen Computern wird unter Verwendung von Protokollen ausgeführt, die die Big-Endian-Reihenfolge spezifizieren
  • Ein sehr großer Teil der Software der Welt läuft auf einer virtuellen Plattform, die standardmäßig in der Big-Endian-Reihenfolge ausgeführt wird, wenn Daten auf einen externen Speicher geschrieben werden.

Beide Aufträge werden auf absehbare Zeit bei uns sein.

Jules
quelle
Die Mehrheit der größten Systeme (dh "Big Iron") ist typischerweise Big-Endian. Das heißt, sogenannte Mini-oder Mainframe-Systeme (die einen großen Teil der Backend-Verarbeitung ausmachen, die die meisten von uns nicht interessieren.)
@jdv Aber die meisten der größten Computersysteme sind Little-Endian-x86-64-Maschinen, und dort spielt die Leistung eine Rolle.
user877329
Ich glaube nicht, dass irgendjemand behaupten kann, Endianness sei mehr als Bequemlichkeit seitens der Architekturdesigner (für alles, was sie erreichen wollen). Zu der Zeit, als ich diesen alten Kommentar machte, war großes Eisen BE. Aber das liegt nicht daran, dass es BE ist, sondern daran, dass die Architektur zufällig so ist.