2015年04月01日の日記です


ビッグエンディアンとリトルエンディアン(1980)  2015-04-01 11:14:14  コンピュータ 今日は何の日

今日は何の日、なのになんだかよくわからないタイトルになっています。


長いから短くしたのだけど、今日は


「ビッグエンディアンとリトルエンディアン、という言葉が、コンピューターのデータ格納順の意味で初めて使われた日」


です。




毎年、4月1日には「ジョークRFC」と呼ばれるものが発行されています。

RFCっていうのは、インターネット技術の標準を決める文章…ってよく言われるし、実際そうなのだけど、もともとは Request For Comment の意味。


「なんか意見ある?」ってだけで、標準を定めるとか、難しい意味は無い。

ただ、技術提案がだんだん「リファレンス」の意味を持ってきて、今では標準としての権威を持つようになっただけ。


権威を持っているので、文章の発行には(いまでは)ややこしい手順を踏む必要があります。


そして、その手順をちゃんと踏んだうえで、一見技術文章に見えるような手の込んだ「ジョーク」を作り上げるのがジョークRFC。

出来の悪いものも多いのですが、出来が良いものはちゃんと技術文章になっているし、技術者じゃないと意味がわからないし、それでいて笑い出すほどバカバカしい。


まぁ、技術者の遊び心を競うイベント、とでも言いましょうか。

技術者ってまじめすぎる人が多くて、ギャグの解説書いちゃったりして興ざめの物もありますが。




インターネットは「小さなネットワークを結びつける技術」として生まれました。

上にRFCを「インターネット技術の標準」と書きましたが、もともとはRFCは「ARPANETの」標準を定めるものでした。小さなネットワークの中の標準に過ぎなかった。


ネット同士を接続する際の技術文章としては、IEN(internet experiment note)というものが別途発行されていたのですが、現在ではIENに書いていたような内容もRFCで発行するような形に統合されています。


IENで話し合う内容は、ネットワークの基礎が違う場合に何が起こるか、コンピューターの互換性が無いと何が起こるか、それらの問題を解決するにはどうすればよいか…というようなものでした。


さて、話が長くなりましたが、1980年の4月1日、IEN 番号 137 の技術文書が発行されます。

タイトルと書き出しは以下のようなものです。


 ON HOLY WARS AND A PLEA FOR PEACE

 This is an attempt to stop a war. I hope it is not too late and that somehow, magically perhaps, peace will prevail again.



訳せばこんな感じ



 聖戦における、平和の嘆願書

 これは、戦争終結への試みです。この試みが手遅れではなく、願わくば平和が戻りますように。



一体何の技術文書なんだ?

と思われるかもしれません。


この嘆願書に書かれている内容は、「ガリバー旅行記」に書かれている、リリパット国(小人国)と、その隣のブレフスキュ国の戦争を止めようというものです。




ガリバー旅行記は有名なお話ですが、確認のためにあらすじを紹介しましょう。


英国の船乗りであったガリバーは、船が難破して不思議な国に漂着します。

その国の住人は全て小人で、ガリバーが気づくと囚われの身でした。


しかし、小人が縄でガリバーを縛ろうとも、ちょっと力を入れれば簡単に縄が切れます。

ガリバーが小人に危害を加えるつもりが無いと伝えると、国王に歓待されます。


小人の国では、隣の国(こちらも小人の国)と戦争をしていました。

ガリバーは、隣の国の船が沖に停泊しているところまで歩いて行って、全部縛って捕虜にし、引っ張ってきました。


これで戦争が終わり平和になるかと思えば、国王は「ガリバーの力」を手に入れたことに気が大きくなり、次々他の国に戦争を仕掛けようとします。

その方法に反論するガリバーは、ついに命を狙われ、小人国を脱出します。



さて、問題は、小人国と隣国が戦争していた原因です。


もともと、小人国では半熟卵を食べるときは、卵の大きなとがった端から殻を剥いて食べる習慣がありました。

しかし、2代前の王様が子供の頃に、卵の殻を剥いていて、指を切ってしまったのです。


その父である3代前の王様が、これは卵の大きい端から剥いたために起きた悲劇であると考え、卵は小さな端から剥かなくてはならない、という命令を出します。


これに、一部市民が反発しました。卵を大きい端から剥くのは、祖先から受け継いだ大事な習慣である。

卵を小さな端から剥くくらいなら、死んだ方がましだと。


彼らは、レジスタンス活動を開始します。

国王軍に何度も戦闘を仕掛け、双方に多くの犠牲者が出ます。


一部の者は亡命し、隣国がこれを支援します。そして、2国間の戦争が始まりました。


この戦争は、卵を小さい端から剥くか、大きい端から剥くか、2者択一の主義を巡る戦争です。

「中庸」ということはありえず、長く続くことになります。



ところで、小さい端は英語で Little-end 、大きい端は Big-end です。

2語を合成して作った造語ですが、これ以上小さな意味に分けると意味が変わってしまうため、分解してはなりません。


これを主義主張とするものは、 Little-endian と Big-endian です。

これも、「リトルエンディアン」「ビッグエンディアン」で一語で、分解して「エンディアン」などと言ってはなりません。




さて、いよいよ話が混とんとしてきました。

ガリバー旅行記の中に出てくる戦争に、なんで技術文章で「平和のための嘆願書」が出されなくてはならないのか。


IEN 137 では、ちゃんと技術的な話が行われています。


元々、コンピューターは情報の最小単位である「bit」を寄せ集め、「word」として扱います。

コンピューターごとに、何bit が 1word となるかはバラバラでした。


また、word とは別に byte という単位もあります。通常は、word はコンピューターの扱いやすい単位で、byte はそれよりも小さく、文字を扱いやすい単位です。

byte も、6bit 、7bit 、8bit などコンピューターにより異なります。


しかし、1980年ごろには、8bit が byte で、1word が 16bit 、というような構成が一般的になりつつありました。

混乱していた情報の単位は統一されつつあったのです。


ところが、ここに新たな混乱が生じていました。


16bit の 1word を、byte 単位で情報を記録できる「半導体メモリ」にアクセスする際に、どのようにアクセスするかが機種ごとに違ったのです。


16進数4桁(16bit)で、 1234 という数値があったとしましょう。

これを、8bit 2つにわけると、 12 と 34 に分かれます。


12 は、1234 という数字の時には「上の桁」でした。これを、上位の桁と呼ぶことにします。34は下位の桁です。


そして、この 12 と 34 を記録するのですが、どちらを「下位アドレスのメモリ」に記録するかが、メーカーにより異なります。




さて、次の話をする前に、ちょっと取り決めをしておきましょう。


コンピューターでは、プログラムをメモリに納めています。

そして、いまプログラムのどこを実行しているかを、「プログラムカウンタ」というレジスタ(変数)で記憶しています。


プログラムカウンタ(以下PC)は、プログラムデータの読み取りを行った後、値を1増加します。

つまり、次の命令を読む準備をするのですが、ここで「1増加」なことに注意してください。


メモリアドレスが小さいほう(下位アドレス)が先に読まれ、大きい方は後で読まれることになるのです。



今読んでいる文章は、横書きで、左から右に読むようになっています。

そこで、横に並べて数値を書くときは、左側が先に読まれる「下位アドレス」、右側が「上位アドレス」ということにします。




用語が混乱しないように、再確認


「上位の桁」と「下位の桁」…これは、1234 という数字を別けた時の位置関係です。12 が上位。

「上位アドレス」と「下位アドレス」…これは、メモリの並び順です。下位が先に読まれる。



では、16bit の数値 1234 を、8bit づつ 2byte に区切って書きます。


12 34


あぁ、真ん中で切っただけね。なんか普通に見えます。

下位アドレスに上位の桁を置いて、上位アドレスに下位の桁を置いています。


…あれ、言葉で説明するとなんか不自然に感じる。


もう一つ書きます。


34 12


なんか、逆転していて不自然に見える。


でも、下位アドレスに下位の桁を置いて、上位アドレスに上位の桁を置いています。

説明だけみると、非常に自然。


どちらも、それなりの根拠があってやっているのですが、全く正反対の結果となっています。

そして、この主張には「中庸」という落としどころはありません。




IEN 137では、上の形式…下位アドレスに、上位の桁を入れる方法は、Big-endian と呼んでいます。

メモリからデータを「取り込む」、つまりは「食う」のが、大きな端(上位)が先になるからね。


下の形式は、逆なので Little-endian です。


…やっと、混乱していた話がまとまりました。



コンピューターの値の格納には2つの形式があるけど、これは小人の国の戦争のようなもの。

中庸の意見などなく、どちらが正しいわけでもない。


でも、IEN は「インターネット接続のための」技術文章です。

戦争を終わらせるために、お互いを理解する努力を…データの並び順に常に注意を払い、相互接続できるようにしようではありませんか、という趣旨のものです。


そういう意味では、4月1日に発行されているけど、「ジョーク」ではない。

ちゃんと重要な提案を行っているのです。


まぁ、ガリバー旅行記の戦争になぞらえたのは、エイプリルフールネタを意識していたと思いますけどね。



これ以前、こうしたデータ並び順は「バイトオーダー」と呼ばれていました。


でも、これ以降、バイトオーダーを示す用語として「ビッグエンディアン」「リトルエンディアン」が使われるようになり、さらに現在は「エンディアン」がバイトオーダーの意味で使われています。


先に書いたとおり、「ビッグエンディアン」「リトルエンディアン」でそれぞれ1語で、「エンディアン」だけにすると意味を持たないはずなのだけど、現在では当たり前に「エンディアン」という言い回しが使われている。


#日本では、ではなく、英語圏でもそうなっています。


まぁ、言葉は時代と共に変わる物なので、この事に問題はありません。

大切なのは、こうした違いがあることを認識し、データが読めない、というような問題を回避するための努力です。


ほんと、ファイルシステムがエンディアンの影響受けるとか、シャレにならないからね…




同じテーマの日記(最近の一覧)

コンピュータ

今日は何の日

関連ページ

Landiskと格闘中【日記 15/01/31】

別年同日の日記

04年 呪われているのか?

09年 春眠暁を覚えず

14年 おかしな言語仕様

16年 卒園


申し訳ありませんが、現在意見投稿をできない状態にしています


戻る
トップページへ

-- share --

72000

-- follow --




- Reverse Link -