1バイトの都市伝説
1バイトは何ビットか?
「1バイトは何ビットでしょうか?」
こう尋ねると多くの方が「1バイトは8ビットに決まっている」と答えます。
でも「どうしてそう思うのですか?」と更に尋ねると、「だって、みんなそう言っているじゃないですか」という曖昧な答しか返ってきません。
もしかすると「1バイトは8ビット」というのは、多くの技術者が「何となく信じている都市伝説」なのではないでしょうか?
画像は研究社の英語語源辞典の「byte」の項。これを見る限りでは8bitの様ですが…
そこで「1バイトの都市伝説」と題して、真相を探ってみることにしました。
「都市伝説シリーズ」は「教科書」ではありません。勿論「学術論文」でもありません。「Wikipedia」でもなければ、「貴方のレポートを手助けするボランティア」でもありません。「出典を明示せよ」とか「証拠を示せ」などという野暮な事を言うのは御遠慮下さい。信じる信じないは貴方自身の自己判断でお願いします。
ビットとバイトト
まずはビットの語源から
ビット(bit)の英語としての本来の意味は、「噛む事」とか「刃物の刃」という意味ですす。そこから「ちいさなかけら」という意味も加わりました。例えば a bit of bread なら「ひとかじりのパン」という意味になります。
またこの bit は「ほんの少しの」とか「わずかな」という形容詞でもあります。
例えば、1桁の整数を4ビットで表現したならば、この4ビットは bits of information(わずかな情報量)と呼ぶことができます。
つまりbitと言う単語は誰かが「発明」したのではなく、「わずかな情報」を表すのに広く使われていた bits of information の先頭の語にすぎなかったです。もちろんbit(あるいは複数形のbits)がどれくらいの情報を意味するのかは曖昧なものでした。
このbitと言う単語が「再定義」されたのは1946年、ベル研究所のジョン・テューキ(John Wilder Tukey)によってです。
厳密には「再定義」というよりも binaly digit
を略すと前述のbitと同じ綴りになることを「発見」し、それを広く世に伝えた人、と言った方がより近いと思います。
いずれにせよ彼が「bit は binaly digit の略である」と言い、それがを広く世に受け入れられたため、それまで曖昧だったbitの持つ情報量は、現代のbitと同じ情報量、すなわち、2つしかない事象を一方に確定させる為の情報量となったのです。
「bit」 と 「bit(bits of information)」の混同
情報量としての bit の意味が統一されたのは喜ばしい事なのですが、困ったことが起きました。それまで「幾つかのビット」で「数字」や「文字」を表現していた人達が、「幾つかのビット」と言う意味の bits of information をそれまでの様に略して bit と呼べなくなってしまったのです。
bit ではなく bitsと複数形にすれば区別はできますが、bit自身も名詞として複数形になりえた(単位としてのbitはbitsとはならない)ので、やはり混乱が起きてしまいます。
そこで1956年、IBMの ホルスト・ブッフホルツ(Werner Buchholz)氏が、それまでの「bits of information」に代る言葉として byteを提案したのです。なぜbyteなのかと言う理由には後述しますが、本頁の冒頭で紹介した binary-digit-eight (8つのbit)であるという説は明らかに間違いです。当時のbits of informationは4〜7bit程度の情報量を表す言葉であり、その言葉を代替する言葉として「8」という固定値を入れる理由が無いからです。
ワーナー氏の周辺(つまりIBMの人達)は「Binary Yoked Transfer Element の略ということにしたらどうか?」と提案したようですが、いかにも「後づけ」かつ「こじつけ」であり、現代では「そんな提案があった」程度の扱いになっています。
「鳩」(一説では「雀」)
ことの真相は氏がパンくず(bit of bread)を5〜6回つつく鳩(雀という説もあり)を見て、パンチカードの穿孔機が、カードに孔をあける様子と似ていると思った事からきている様です。(パンチカードに穴をあける刃物も英語だとbitです)
また、カードの穴あけ機の動きが鳩と似ているだけではなく、鳩が5〜6回パンくずをつついて飲み込む様子が、「カード読み取り機」が5〜6箇所のbitを読み込んで1つの情報として咀嚼する仕組みとそっくりだったため、 bite(つつく)を『幾つかのビット』の意味とする」という考え方は瞬く間に広がりました。
但し、bite のスペルは bit やbitsと似ているため、手書きだと誤読される危険があります。氏はその点も考慮してわざとbyteと綴っています。この辺りの感覚は米国人ならではです。日本では同様な事を提案しても「綴りが間違っている」(日本流に言うならば「漢字が間違えている」)の一言で却下されたことでしょう。
再考、1バイトは何ビットか?
以上の考察により明らかですが…
バイトはパンチカードの一列分、より正確に言うならば「ある種の文字集合の中から1つの文字を特定するための情報量」というのが元来の意味です。
但しこの「ある種の文字集合」というのが厄介です。
参考までに当時(1956年時点での)文字セットを一覧にしてみました。
5bitで表現できる文字セット : A〜Z、もしくはそれにカンマやピリオド等の幾つかの記号を加えた物
6bitで表現できる文字セット : 0〜9とA〜Z、及びそれに、一般的な記号や特殊文字を加えた物
7bitで表現できる文字セット : 0〜9とA〜Z、a〜z、及びそれに、一般的な記号や特殊文字を加えた物
上記の他にも様々な文字セット(日本固有ですとカタカナを加えた物など)がありますが割愛しています。また、数字のみの文字セットであっても、1つの数字をパンチカードの1つの穴に対応させて実質10bit分を使うものもありました。
いすれにせよ、上記の全てが「bits of information」であり「byte」であったのです。
計算機の歴史はメモリ開発の歴史
いまでこそギガバイトの主メモリやテラバイトのハードディスクも珍しくありませんが、昔のメモリは大変高価であり、1bitでも使用量を減らすというのがコンピュータ屋の常識でした。7bitや6bitで記憶可能な情報に8bit分の主メモリを与えるなんて無駄以外の何物でもありませんでした。
やがて主メモリが安価に製造できる様になると、多少情報の記憶の仕方に無駄があっても、色々な情報を同じサイズで扱える様にした方が良いと言う考え方が現れました。
これはソフト屋にとっても変数の管理が楽になる話ですし、ハード屋にとっても内部の配線を共通化できるというオイシイ話であり、瞬く間に主流の考え方になりました。
しかし、情報サイズ(情報を格納するビット数)を統一すると言っても、数ビットで間に合う情報もあれば、何十ビットも必要な情報もあります。いくら主メモリの価格が安価になったとはいえ、全ての情報を巨大なbit数(例えば100bit)に統一して記憶するのは非効率です。
「基本的なビット数」
そこで、基本的なビット数を決めて、そのビット数で間に合う情報はそのビット数で、そのビット数では表現できない情報は、基本的なビット数の倍のビット数で表現するという考え方が広まりました。(倍にしても足りない場合は更にその倍のbit数で表現します)
ここで問題となるのは、「基本的なビット数をいくつにするか?」です。
当然、誰が考えても前述した文字の集合体としてのビット長(=バイト)を基本とするという考え方に落ち着きます。
しかし残念ながら、当時(1960年頃)は1バイトのビット数は固定ではありませんので、理論的には以下に示す様々な「基本的なビット数」の系列が現れることになります。
6を基本的なビット数として、6 → 12 → 24 → 48
7を基本的なビット数として、7 → 14 → 28 → 56
8を基本的なビット数として、8 → 16 → 32 → 64
9を基本的なビット数として、9 → 18 → 36 → 72
上記の系列は9が基本的なビット数の最大と言うわけではなく、10、11、12…と無限に続くのですが、10を基本にするのは5を基本にするのと同じ系列になりますし、11以上の大きな数を基本としても意味はありませんので10以上は省略しています。
また最低でもA〜Zの26種類は基本ビット数で区別できることが望ましいので、4ビット以下も省略しています。
また基本的なビット数が奇数だと、それを丁度半分ずつに分けて使うことができません。このため基本的なビット数を奇数にする事はは嫌われ6か8を基本単位にするという考え方が「消去法」で残ることになりました。
このほかにも、18を基本数として、英数字を格納する時は18ビット3つに分けて、6ビットの3文字ずつ格納し、小さな整数を記憶する時は18ビットの領域を2つに分け、9ビットの2つの変数として使うなどの変形方式等もありました。
結局、本来は5〜9程度のbit数を表す言葉だった byte が、計算機システム内のメモリアクセス方法の進化に伴い、6もしくは8のどちらかのbit数を表す言葉に変っていったのです。
その後、IBMが1964年に発表した8を基本的なビット数とした計算機(System360)が大ヒットしたのに対し、6を基本的なビット数とした計算機は1966年のDEC PDP-10程度だったため、徐々に「1バイトが8ビット以外の計算機」を知らない者が増えたのです。
更に1974年、インテルが発表した8080が大ヒットした事も加わり、いつの間にか8を基本的なビット数とした計算機だらけとなり、いつの間にか下記の様な「三段論法」が出来上がってしまいました。
計算機の基本的な処理単位のビット数は8だ。
よって byte は8ビットだ。
統一への動き
残念ながら8bit以外の計算機も多々ありました
この時点(1970年代半ば)で、「1バイトは8bitとしましょう」と決めてしまえば良かったのですが、当時はまだ時期早尚だったようです。
例えばNECのACOS600(1974年発表)は36ビットコンピュータで、文字の格納は文字セットを6ビットで表現し、それを6つ並べて36ビットとしています。他にも(計算機の設計者自身がそれをバイトと呼んだかどうかは別として)基本的な処理単位のビット数が8ではない計算機はまだまだ少なくありませんでした。
もしその当時、「1バイトは8bitとしましょう」と提案しても、多くの反対者がいて『否決』されたことでしょう。結果として「1バイトは事実上8ビットだ」と主張する者と、「いや6ビットや9ビットもある」と言う者が混在してしまい、わざわざ純粋に8bitを表す言葉として「オクテット(octet)なる言葉までもが使われる様になりました。
流石にこれ以上の混乱はまずいので…
ISO(国際標準化機構)やIEC(国際電気標準会議)が「1バイトは8bitとしましょう」という意見を採択したのは2008年です。
最初の混乱から30年以上経過し、8bit以外を1バイトと呼んでいる計算機が事実上なくなった事がその背景にあります。
「なぜ、もっと早く決めてくれなかったの?」という意見もあるとは思いますが、とりあえずはメデタシメデタシです。
というわけで、21世紀になってから生まれた方は「1バイトは8ビットです」と堂々と言って良いと思います。但しここまでに述べた「歴史」も多少は知って欲しく思います。
そのほかの誤解
バイト=CPUの内部バス幅、という誤解
バイトのビット数と、コンピュータの内部バスのビット数を混同している方がおります。
コンピュータの内部バス(一般にはメモリデータバス)は、8、16、32、64などが代表的ですが、4,9,12,18等のバス幅を持つ物が存在するのは事実です。
これを根拠に「1バイトが4,9,12,18の計算機も存在する」という方です。
しかし「1バイトのビット数」と「内部バス幅が何ビットか」は全く別次元の話です。
7bitや9bitのマイコンもあります、という誤解
「1バイトが7ビットや9ビットであった時代がある」とう事実を、「昔は7ビットや9ビットのマイコンもあった」と言い換える方もいます。しかし、これも言葉の定義の順序が逆です。
ビットスライスに関する誤解(古いビットスライス)
ICの集積密度が低かった頃(ICは発明されたが、まだマイコンが現れる前)は、16ビットとか32ビットの様な「大きな数」を扱うICを1つのパッケージに収めるのは極めて困難でした。そのため4ビットを扱うICを作り、それを4つ並べて16ビット(あるいは8つ並べて32ビット)の計算をする回路設計が一般的でした。
この手法をビットスライスと言いますが、スライス幅(小分けにする幅)は3でも5でも構いません。この事から「昔は3bitのCPUがあった」とか「1バイトは5bitだ」と言う方もおりますが、これも明らかに誤りです。
ビットスライスに関する誤解(新しいビットスライス)
前述のビットスライスとは別に「新しいビットスライス」とも言える計算機アーキテクチャがあります。扱うデータを全て1ビットのストリーム(簡単に言えばシリアルデータ)として、処理するアーキテクチャです。
このアーキテクチャを用いると理論的には1bitのデータも128bitのデータもハード的には等しく扱えると言うメリットがあります。もちろん7ビット単位でのデータも処理できます。しかしこれは「可変長ビット計算機」であって、「7ビット計算機」ではありません。
もちろん1バイトが7ビットの計算機でもありません。
終わりに
つまらないことでも、少し気合をいれて調べてみると意外な事実がわかり楽しいものです。WWWの進歩のおかげで、世界中の歴史的資料を自室で読むことが可能になったことも喜ばしいことです。
今回この頁に書いたことは、筆者個人の推測も多々混じっています。すべてが真実だと言い張るつもりは毛頭ありませんので、新たな見解や、明らかな誤解などがあれば、お声がけ頂ければ幸いです。
(2015年5月 初出)