XMAKYNA Blog

EngineeringFoundations

コンピュータは0と1をどうやって文字や画像に変えるのか

Language: Japanese
Dark schematic of an integrated circuit representing binary information and the path from zeros and ones to meaningful output.

何も書かれていない文書に、大文字の X を入力してみてください。すぐに画面に現れます。見慣れた文字ですし、何かの単語の最初の一文字かもしれません。でも、キーボードが小さな X の絵をコンピュータの中へ送ったわけではありません。指先から画面に届くまでの間に、電気的な動きが情報に変わり、その情報が解釈され、コンピュータは私たちに分かる形を描くよう指示されたのです。

前の記事「コンピュータはどう動くのか:ファインマンの超高速書類整理係」では、リチャード・ファインマンが考えた、指示に従って番号付きの引き出しから数値を取り出す書類整理係のモデルを紹介しました。簡単な操作を順に重ねることで、コンピュータが複雑な仕事をこなせることを説明するモデルです。今度は、その引き出しの中身は何か、電子回路はその中身をどう役立てるのかを詳しく見ていきます。話は二つの記号、0 と 1 から始まります。

スイッチ一つで1ビットを表せる

電灯のスイッチを思い浮かべてください。ここでは、オフとオンの二つの位置があると考えます。呼び方は何でも構いませんが、0 と 1 が便利です。二つの可能性のどちらかを表すものが一つのビットで、二進数字を意味する英語 binary digit を縮めた言葉です。1ビットで二つの状態を区別できますが、それだけで人の名前を伝えたり、写真を説明したりはできません。

コンピュータの内部では、ごく小さな電子部品がスイッチのように働きます。二つの状態を持つスイッチを多数組み合わせることで、オンとオフ以上のさまざまな情報を表せるようになります。

4ビットあれば数を数えられる

四つのスイッチを横一列に並べてみましょう。左から順に 8、4、2、1 という値を割り当てます。オンならその値を足し、オフなら何も足しません。0 1 0 1、つまりオフ、オン、オフ、オンに設定します。二番目の値は 4、四番目の値は 1 なので、4 + 1 = 5 です。

ビットを試してみよう数字を押すと、0 と 1 が切り替わります。
十進数の結果5
4 + 1 = 5
すべてのビットを 1 にしてみましょう。
図1. 8、4、2、1 の値を持つ四つの二進数の桁を使うと、0 から 15 までの数を表せます。初期状態の 0101 は 5 を表します。

別の組み合わせも試してみてください。0111 は 7、1111 は 15 です。これが二進数です。0 と 1 だけで数を書き表します。普段使う十進数と考え方は似ていますが、左の桁へ進むごとに位の値が十倍ではなく二倍になります。

各ビットには 0 と 1 の二つの状態があるので、4ビットでは 2 × 2 × 2 × 2 = 16 通りの並びができます。8ビットは通常一つのバイトにまとめられ、256 通りになります。ビットを増やせば、電子部品に新しい種類の状態を判別させなくても、もっと大きな数を表せます。数を数えるのは、こうした並びの用途の一つにすぎません。

数字が文字を表すこともある

画面の X に戻りましょう。文字を保存するには、数字と文字を結びつける規則が必要です。初期の文字規格である ASCII は分かりやすい例です。大文字の X に 88 という数を割り当てています。

88 は二進数で 01011000 と書けます。先頭の 0 は、7ビットの ASCII コードを8桁で表示するために付け足したものです。1 があるのは 64、16、8 の位で、足すと 88 になります。プログラムがこのビット列を数値として扱えば、値は 88 です。ASCII の規則で解釈すれば、文字 X を意味します。

一つのパターン、二つの意味ビットを押すか、別の文字を試してみてください。
数値として88十進数
ASCII としてX文字としての解釈

同じビット列を ASCII に従って解釈しています。

図2. 01011000 を普通の二進数として読むと数値の 88、ASCII に従って読むと文字の X を表します。

このビット列の形は X の形に少しも似ていません。両者を結びつけているのは、どう読むかについて取り決めた規則なのです。

現代のコンピュータは、ASCII だけでは扱いきれない多くの文字を表す必要があります。世界各地の文字体系や絵文字なども含まれます。そこで Unicode のような、より広い範囲を扱う規格や、文字をバイト列に変換するさまざまな符号化方式を使います。細かな仕組みは異なっても、保存された値に意味を与えるのは取り決められた規則である、という点は同じです。単語は、この方法で表された文字の並びです。プログラムは B、O、X のコードを順に保存して読み出せます。BOX という単語のための特別なハードウェアは必要ありません。

色にも同じ原理が当てはまります。画面の1ピクセルを、赤、緑、青の光の量を表す三つの数値で記述する方法があります。各色を8ビットで表す一般的な例では、(255, 0, 0) は赤です。赤の値が最大で、緑と青はゼロです。別の決まりを使えば、同じ数値の組にも別の意味が生まれます。文字と画像は同じ基本的な電子回路を使って保存できますが、同じ種類の情報ではありません。

これで、ファインマンの書類整理係が引き出しの中で見つけるものが分かってきました。それは、現在の仕事でどう解釈するかによって意味が決まる値です。ただし、値を保存しただけでは何も処理したことにはなりません。そこで命令が必要になります。

電子回路はどう仕事をするのか

メモリには、実行中のプログラムに必要な情報が入っています。ファインマンのモデルに登場する引き出しのようなものです。中央処理装置(CPU)は命令を実行し、計算や比較を行い、次に何をするかを決める手助けをします。現代のコンピュータでは多くの電子回路が仕事を分担していますが、値を取り出し、処理し、結果を記録するという基本的な捉え方は今も役立ちます。

コンピュータは二進数で足し算ができます。例えば 0101 は 5、0001 は 1 です。この二つを足すと 0110、つまり 6 になります。

ビットを足してみよう二つの二進数を変えて、和を確かめましょう。
一つ目の数
5十進数
+
二つ目の数
1十進数
二進数の合計
6十進数
5 + 1 = 6(十進数)
繰り上がり2s の位へ繰り上がります。
7 + 1、または 15 + 1 で5桁目を試してみてください。
図3. 四つのビットからなる二つの入力のどちらかを変え、値を足して結果を確認できます。合計は常に位置のそろった5桁で表示されるので、必要になったときの追加の桁も用意されています。

命令もまた 0 と 1 で表されます。あるビットはプロセッサに実行すべき動作を伝え、別のビットは使う値やその場所を示します。例えばレジスタは、プロセッサの内部にある小さな記憶領域です。こうした動作には短い名前があります。MOVE は値をコピーし、ADD は数を足し、COMPARE は値を比較し、JUMP は別の命令へ処理を移します。CALL は別の命令のまとまりを実行し、RETURN はその後で元の処理へ戻します。プロセッサは、ときには手順を繰り返したり進む先を変えたりしながら、こうした命令をたどってプログラムを実行します。

ここでソフトウェアとハードウェアがつながります。命令が電子回路に仕事を与えるのです。

ファインマンの書類整理係をもう一度思い浮かべてください。整理係は指示に従って正しい番号の引き出しを見つけ、中身を扱い、ときには次の手順ではなく別の手順へ移ります。プロセッサも同じ基本的な考え方で、単純な操作を順に行ってプログラムを実行します。

この例では、プロセッサが内部の作業領域をどう整理するか、多数の処理をどう協調させるかなど、多くの工学的な詳細を省いています。しかし、基本的な関係を理解するのにそれらは必要ありません。コンピュータは情報の表現を保存し、命令に従って処理し、結果を新たな表現として記録します。

文字 X はどう画面に現れるのか

では、この文字が現れるまでを最初からたどってみましょう。キーを押すと、キーボードのハードウェアが入力を機器に通知します。OS とアプリケーションは、キーボード配列や修飾キーなどを使って入力を解釈します。その結果、入力したかった文字を判断し、その文字を表すデータを文書に保存できます。

文字を表示するには、アプリケーションは文字の数値コードだけでは足りません。どんな形で描くかも知る必要があります。そこで使うものの一つがフォントです。文字を描画するソフトウェアは選ばれたフォントをもとに形と位置を決め、画面上のどのピクセルを何色で表示するかを計算します。ディスプレイが発する光によって、目に見える X ができあがります。

フォントを変えれば、X の見た目は大きく変わるかもしれません。でも文字そのものは変わっていません。変わったのは描画に使う情報と指示です。同様に、88 を表すビットがどこかに保存されているだけで、勝手に X が画面に現れるわけではありません。プログラムがそれを文字として解釈し、表示するように手配しなければなりません。

こう考えると、混同しやすい役割の違いが見えてきます。電気的な状態によって、コンピュータはビットの並びを確実に保存し、操作できます。符号化規則はその並びが何を表すかをプログラムに伝えます。命令はそれをどう使うかを決めます。そして画面が結果を見える形にします。文書に現れた文字は、そのすべての過程の結果なのです。

画像と音も基本は同じ

写真では、キー入力の代わりに光が出発点になります。カメラのセンサーは多くの小さな領域に届く光を測り、機器は測定結果をデジタルな値に変えます。例えば、暗い部分は小さい数、明るい部分は大きい数として記録することができます。画像処理ソフトウェアはこれらの値から画像を組み立てます。画像ファイルでは、必要な容量を減らすために情報を圧縮する場合もあります。表示するときはソフトウェアがファイル形式を解釈し、画面に必要なピクセル情報を渡します。

0 黒128 灰色255 白
グレースケールの例。一般的な8ビットのグレースケール画像では、0 が黒、128 が灰色、255 が白を表し、その間にもさまざまな濃淡があります。

音も別の例です。マイクは空気の圧力の変化に反応し、電子回路が変化する信号の測定結果をデジタルのサンプル値に変えます。一般的な録音方式の一つでは、ゼロに近い値は小さな気圧変化、ゼロから正または負の方向に大きく離れた値は大きな変化を表します。小さな音では通常振れ幅が小さく、大きな音では振れ幅が大きくなります。ソフトウェアはそのサンプルを保存、編集、送信できます。向こう側のスピーカーは電気信号を空気中の新たな振動に変えます。元の音の波を折り畳んでメモリにしまったわけではありません。音を記述する情報を表現し、処理して、再び音を作るために使ったのです。

音が数値になる仕組み

時間とともに変わる空気圧の測定値

音の波形の例。各点は一回の測定を示します。ゼロの上下への振れ幅が大きいほど、空気の圧力の変化も大きいことを表します。

これらの例では、測るものも規則も装置も異なります。それでも、共通する基本的な能力があります。コンピュータは情報をパターンとして表し、命令に従って処理し、物理的な装置で結果を生み出せます。これで、チップの中の二つの状態を持つ回路と、日常の文字、写真、音楽とがつながります。

うまくいかないとき

ここまでの例は、分かりやすくするために意図的に単純化しています。実際のアプリケーションは、複雑なファイルを解釈し、予想外の情報を扱い、多くの判断をしなければなりません。例えば写真を表示するには、まずファイルの内容を理解してから画像に変える必要があります。間違いがあると、結果が誤ったり、アプリがクラッシュしたりします。プログラムが使用を許されていないメモリにアクセスしようとすると、コンピュータのハードウェアとOSが検出して止められる場合もあります。しかし、すべての間違いにこうした保護が働くわけではありません。アクセスを許されたメモリを誤って扱ったり、単に判断を間違えたりして、目立った警告もなく動き続けることがあります。

クラッシュより深刻な間違いもあります。アプリが誤った結果を返したり、情報を失ったり、本来ある行動を止めるはずだったチェックを飛ばしたりすることもあります。ファインマンの書類整理係を思い出してください。指示に完璧に従っても、その指示が間違った引き出しを指していれば、結果も間違うことがあります。プロセッサは、命令がプログラマーの意図どおりの結果を生むかどうかを知らずに実行します。アプリが外部からの情報を誤って扱うと、その間違いが予想もしなかった形で判断や動作に影響し、セキュリティ上の問題につながることもあります。

今後の記事では、こうした不具合がなぜ起こるのか、技術者がどう予防し、あるいは影響を抑えようとするのかを見ていきます。

要するに

一つのビットは二つの可能性のどちらか、0 または 1 を記録します。複数のビットを使うと数を表せます。その数をどう解釈するかという共通の規則があれば、文字や色、音の測定値も表せます。プロセッサは命令に従って保存された情報を処理し、入力装置と出力装置は電子システムを外の世界と結びつけます。

文書に X が現れるところを、もう一度考えてみてください。どの文字かを決めるのは文字コード、見た目を決めるのはフォントと描画ソフトウェア、目に見える光を生み出すのはディスプレイです。どの段階でも、情報を確実に表現して操作する能力が欠かせません。コンピュータの中に小さな文字や画像がそのまま入っていると考えるよりも、この一連の流れを理解するほうが役に立ちます。