今日は何の日、なのになんだかよくわからないタイトルになっています。
長いから短くしたのだけど、今日は
「ビッグエンディアンとリトルエンディアン、という言葉が、コンピューターのデータ格納順の意味で初めて使われた日」
です。
毎年、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語で、「エンディアン」だけにすると意味を持たないはずなのだけど、現在では当たり前に「エンディアン」という言い回しが使われている。
#日本では、ではなく、英語圏でもそうなっています。
まぁ、言葉は時代と共に変わる物なので、この事に問題はありません。
大切なのは、こうした違いがあることを認識し、データが読めない、というような問題を回避するための努力です。
ほんと、ファイルシステムがエンディアンの影響受けるとか、シャレにならないからね…
同じテーマの日記(最近の一覧)
関連ページ
別年同日の日記
申し訳ありませんが、現在意見投稿をできない状態にしています。 |