エンディアン嘘つかない


素粒子物理学で用いられる「クォーク」がジェームズ・ジョイスの「フィネガンズ・ウェイク」の一節からとられたというのは有名な話ですが、コンピューティングの分野にも同様な用語があります。たとえば、readmeという言葉は、ルイス・キャロルの「不思議な国のアリス」の冒頭に出てくる"Eat me", "Drink me"というエピソードの匂いがぷんぷんします。
バイト列を長語にパックする用語である"Endian"は、どうやらスイフトの「ガリバー旅行記」が元ネタのようです。小人国では、卵を割るときに大きな方から割るか小さな方から割るかで戦争がおきており、Big-Endianとは大きな方から卵を割る派閥を指す言葉です。
ガリバー旅行記におけるEndian戦争がどれほど不毛かは言うまでもありませんが、コンピューティングの世界のEndian論争も同じくらい不毛です。ある種の人々はほぼ決着がついたこの話について、今でもTwitterやブログで悪口を投げ合っています。

Big Endianとその得失

Big Endianは、マルチバイト・ワードをメモリに配置するときにMSB側のバイトを下位アドレスに配置するという物です。この、言葉で表すと非常に理不尽に聞こえる方式には、大きく分けて二つのメリットがあります。
一つはメモリ・ダンプの可読性です。Big Endianでは、ワードをHexadecimalで記述して紙に書いたときの表記と、バイト列をHexadecimalで表示したときの表記が同じになります。つまり、0x1234という2バイトワードは、メモリ上では低位から順に 0x12 0x34 となります。このため、メモリダンプを好むタイプの技術者からは歓迎されます。
もう一つ、あまり知られていませんが1.0を上限とする固定小数点数との相性の良さがあります。たとえばあるアドレスに2バイトワードの固定小数点数を置いたとします。同じアドレスから1バイト取り出すと、その値は元の数に対する8ビットによる近似になっています。言い換えると精度が落ちるだけです。
逆に整数との相性の悪さはかなり不愉快な結果を起こします。ある番地においた2バイトワードを、同じ番地から1バイトだけ読むと、それは意味のない値になっています。これは、多バイト整数の下位1バイトを取り出すような場合、いったんアドレス計算をする負担があると言うことです。
さらに問題なのは、ビットストリングとの相性の悪さです。モトローラワークステーションbitblt命令が流行ったときに、MC68020にbit string型データを持ち込みました。ところが、これはかなり悲惨なことになりました。bit string型の操作には、起点からのビットオフセットを使います。ところが、そのオフセットは上位アドレスに向かって大きくなっていくのです。これは明らかに合理的な構造ですが、Big Endianアーキテクチャにおいたときの効果ときたら破滅的でした。

Little Endianとその得失

Little Endianの得失はBig Endianの得失の裏返しです。この方式は整数との相性が良く、bit stringとの整合性も抜群です。固定小数点数との相性はよくありませんが、これはコンパイラが負担すればよい話ですし、そもそも高級言語のうち固定小数点数を使える物などわずかです。
一番大きな欠点はメモリのバイト・ダンプ結果がワード型データの値の読み取りに使えないことです。ところが、今時のIDEはダンプなどしなくてもデバッガのウィンドウ上で変数を始めから正しい型およびサイズで読むことが出来ます。
結局、21世紀の最初の10年を過ぎた今、Big Endianには積極的に採用する理由がほとんどありません。

まとめ

Endian論争は不毛です。ユーザー視点であれこれ言われるほとんどのことはコンパイラに任せれば済みます。しかし効率を考えるならば、新たなプロセッサを開発するときにはLittle Endianにすべきです。