リトルエンディアンは勝ちましたか?


34

最近ビッグエンディアンとリトルエンディアンの戦いについて教えているときに、学生はそれが解決したかどうかを尋ねましたが、私は知らないことに気付きました。ウィキペディアの記事を見ると、現在最も人気のあるOS /アーキテクチャペアはリトルエンディアンを使用しているようですが、インターネットプロトコルはパケットヘッダーの数値を転送するためにビッグエンディアンを指定しています。それは現在の状況の良い要約でしょうか?現在のネットワークカードまたはCPUは、バイトオーダーの切り替えをハードウェアでサポートしていますか?

回答:


25

私は、それが問題になったほど勝ったわけではないと主張します。基本的にすべてのモバイル市場を構成するARMはバイエンディアンです(ああ、異端です!)。x86がデスクトップ市場で基本的に「勝った」という意味では、リトルエンディアンが勝ったと言えると思いますが、今日の多くのアプリケーションの全体的なコード深度(浅い)と抽象化(たくさん)を考えると、それは問題ではありません。それは従来。私のコンピュータアーキテクチャクラスでエンディアンが実際に浮かび上がったことは思い出せません。

私は、多くの開発者がエンディアンを認識していないか、それがなぜ重要なのかを疑っています。そのため、膨大な(とI平均のために広大な)多数それは日常の作業環境に全く無関係です。これは30年前とは異なり、画面上のテキストファイルを派手で劇的な方法で操作するのとは対照的に、誰もが金属にずっと近いところでコーディングしていました。

私の一般的な疑いは、オブジェクト指向プログラミングがエンディアンネスを気にする終わりの始まりだったということです。なぜなら、優れたオブジェクト指向システムのアクセスと抽象化の層は実装の詳細をユーザーから隠すからです。実装にはエンディアンが含まれるため、人々は明示的な要素ではないことに慣れました。

補遺:zxcdwは移植性が懸念されると述べました。しかし、過去20年間に復して何が起こったのでしょうか?仮想マシン上に構築されたプログラミング言語。確かに仮想マシンのエンディアンは重要かもしれませんが、その1つの言語について、基本的に問題にならない程度まで一貫性を保つことができます。VMの実装者だけが、移植性の観点からエンディアンを心配する必要さえあります。


2
例えば、何らかの形の移植可能なコードを書くときなど、それが重要な非常に関連性の高いドメインがまだたくさんあります。事実、おそらく問題にならないのは、プラットフォームに関連付けられた移植性のないコードを書くときです。
zxcdw

@zxcdwを使用すると、仮想マシン言語の軍隊に直接アクセスできます...私はそれを考えていませんでした。
世界エンジニア

あなたの補遺は完全に真実ではありません(また、@ zxcdwにも同意しません):エンディアンは、マルチバイト整数とバイトストリーム間で変換する場合にのみ問題となり、暗黙的に行われプラットフォーム間で異なる場合に問題になります。ほとんどの最新の言語(VMベースかどうかに関係なく)はめったに(不透明なデータ型として整数を使用して)移植性を実現し、プラットフォームに依存しないか、プログラマーによって明示的に選択されたエンディアンを持ちます。
マイケルボルグワード


2
@zxcdw-アセンブラーであっても、必ずしもエンディアンの順序を知る必要はありません。たとえば、定数は一度に1バイトずつ指定する必要はありません。状況はCの特定のスタイルのシリアル化にいくらか似ていx & 0xFFます- 値で関心のあるビットを指定しているため、エンディアンの順序に関係なく常に最下位バイトを提供します(バイトはそれぞれ8ビットと仮定)メモリ内の相対的な位置ではありません。
Steve314

4

エンディアンは、バイナリデータシステムを転送する場合にのみ重要です。

プロセッサ速度の向上(およびストレージの大幅な低コスト化)に伴い、バイナリデータインターフェイスが希少になりつつあるため、アプリケーション層で気付かないようになっています。テキスト転送形式(XML / JSON)を使用しているか、翻訳を処理するデータレイヤー抽象化を使用しています(翻訳があることに気付かないように)。

しかし、バイナリデータレイヤーでコーディングしているときは気づきます。これは非常に重要です。たとえば、VERITAS(現在はシマンテック)で働いていたとき、25種類のハードウェアプラットフォーム(ビッグエンディアンだけでなく、他のタイプもあります)で構築されていたソフトウェアを構築していました。


私の学生も携帯電話向けに開発し、クラウドコンピューティングを使用しているため、世界はPCやMacではないことを知っています。
エレンスペルタス

@Loki-マシンのエンディアンを知らなくても、シリアライズおよびデシリアライズできます。本当に必要なのは、ファイル/ストリーム/その他のデータのバイト順を知ることだけです。たとえば(char) (x & 0xFF)、Cでは、バイトが8ビットのみであると仮定して、エンディアンの問題に関係なく最下位バイトを提供します。ソフトウェアが実行されるマシンを知らずにバイナリファイル形式を設計しました。基本的に、ハードウェアを気にせずにファイル形式のエンディアン順序を選択しました。
Steve314

@espertus:もちろん可能です。
マーティンヨーク

1
@ Steve314:もちろんできます。「バイナリデータレイヤー」で作業しているときは、データをシリアル化するスキームを考案できます。移植可能なスキームを考案することは難しくありません。個人的には、60年代から構築され、十分にテストされたホイールを再発明することはありません。` h2nlとファミリーを検索します。この一連の関数は、プラットフォームに最適なポータブル(標準)の方法を提供します。
マーティンヨーク

4

いいえ、誰も勝ちません。私たちは種として、バイトを保存する順序を標準化することに失敗しました。これは、書く方向と運転する通りの側面に沿っています。

結果として、ネットワークまたはファイルを介して2つの異なるシステム間でデータを転送する場合、環境内でデータダンプコードの妥当な初期バージョンが正しく動作する可能性は約50%です。 、顧客で働く可能性が50%あります。

これに対処するには、ヘッダーに「htonl」のような名前のプラットフォーム固有の関数を検索する必要があります。名前は明らかに「arpa / inet.h」のような70年代に遡ります。 。


10
標準化されていることがわかります-整数を表すために4バイトを送信する代わりに、特別なヘッダーテキスト、山括弧、キーワード、およびそれら4バイトのASCII表現でフォーマットされたテキストブロックを送信します。次に、受信側はフォーマットを解析して整数テキストを取得し、4バイトに変換し直します。これは進行と呼ばれます、私は言われます:
gbjbaanb

$ aptitude search xml | wc -l 677
アンドリューワーグナー

1

コンセンサスはまだありません:

  • 大規模なコンピューターシステム(サーバー/デスクトップ/ラップトップ)の大部分は、現在リトルエンディアンアーキテクチャを使用しています
  • 小型コンピューター(タブレット/電話)の大部分は、エンディアンネスに依存しないプロセッサーアーキテクチャを使用しますが、リトルエンディアンの順序を使用するオペレーティングシステムを実行します

したがって、ハードウェアレベルでは、LEの方がはるかに一般的です。しかし:

  • ほとんどのコンピューター間通信は、ビッグエンディアンの順序を指定するプロトコルを使用して実行されます
  • 世界のソフトウェアの大部分は、データが外部ストレージに書き込まれるたびにデフォルトでビッグエンディアンの順序になる仮想プラットフォームで実行されます。

両方の命令は、近い将来に私たちと一緒になるでしょう。


最大のシステムの大部分(つまり、「ビッグアイアン」)は通常、ビッグエンディアンです。つまり、いわゆるミニまたはメインフレームシステム(私たちのほとんどが気にしないバックエンド処理の膨大な量を構成します。)

@jdvしかし、ほとんどの最大の コンピューティングシステムはリトルエンディアンのx86-64マシンであり、パフォーマンスが重要です。
ユーザー877329

エンディアンは、(設計者が何を達成したいとしても)アーキテクチャ設計者の利便性以外の何物でもないという強い主張は誰もできないと思います。私がその古代のコメントをしたとき、大きな鉄はBEでした。しかし、これはBEであるためではなく、アーキテクチャが偶然そのようになっているためです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.