1.コンピュータ概論
(ハードウェアとソフトウェアの基礎、数体系)
1-1.情報とは
最近の自然科学の発展の様子を見ると、個々の分野での技術の進歩もさることながら、それを助けるコンピュータ(computer)の性能の向上によるところが大きい。特に精密な計測機器には、殆どといって良いほどコンピュータが付属するようになり、測定の自動化や高速なデータ処理、統計処理が手軽にできるようになった。著者が学生時代に、2,3日徹夜してやっていたようなことが、ほとんど苦労なしに2,3時間で終わるようになったものも珍しくない。
また、近年の産業界の発展においてもコンピュータの影響力は、計り知れないものがある。商取引などでも、コンピュータが使われるのが普通になってきた。コンピュータがネットワークと密接に結びつきながら発達してきた結果として、このようなことが可能になってきた。ネットワークも今や、インターネットとして世界中を高速に結ぶことができるようにまでなった。
さて、このように現代社会にとって必須のコンピュータについて、もっと詳しい説明をしていくことにする。ここで言っているコンピュータとは、正確には、デジタル・コンピュータ(digital computer)のことで、通常のコンピュータが扱うデータの形式は、1と0のみからなる数字の列のみである。要するに、機械が判別できるのは、スイッチのONとOFFだけで、それを1と0に対応させているのである。このようなものをデジタル・データ(digital data)と呼んでいる。コンピュータ中では、これを用いて計算するので、2進法による計算となる。ここでデータというのは、情報あるいは、情報を蓄積したもののことである。つまりコンピュータとは、情報を高速に処理できる装置であり、情報という概念が重要になってくる。情報(information)とは、そもそも何であろうか? そのような概念を計算機で扱うことはできるのであろうか? そして、科学として成り立っていくためにはどんなことが必要なのだろうか?
情報について説明するためにまず、昆虫について考えてみよう。蟻や蜂の場合、最初の一匹が食物のありかを見つけると、たくさんの個体が、次々と食物のところに集まってくるようになる。最初に見つけたものが、何らかの方法で食物のありかを仲間に伝えているのだ。この時に伝えられているのが、「情報」である。岩波国語辞典で見てみると、情報とは (1) ある物事の事情についての知らせ、(2)
それを通して何らかの知識が得られるようなもの、とある。動物や昆虫の場合、情報の伝達に使われる媒体は、音であったり、踊りのような行動であったり、何か化学物質であったりするが、いずれにしても、これらの情報はコンピュータで扱うのには、ちょっと大変なものであろうことは容易に推察される。コンピュータで扱えるようにする方法は、自然科学的に扱えるようにするということと殆ど同じことであり、例えば以下のようなものである。すなわち、情報の量なり性質なりを、四則演算可能な数値で表現できるようにし、その単位を適切に決めてやるという方法である。これによって、情報は、実証可能な自然科学の世界で実験的に取り扱うことが可能となる。具体的には以下のようなものが用いられている。
コンピュータでは1か0かしか表せないので、情報量の基本単位は、1か0かの値のみを取り得るものとなる。この基本単位のことを、コンピュータの世界では、ビット(bitあるいはbinary digit)と呼んでいる。つまり、(食物が)有る、無い、といった情報は、1ビットの情報量で表すこともできるのである。もっと厳密な書き方をすると、
情報量(H0)は以下の式で表される、
H0 = log2W0 ビット (1)
ここで、W0は「メッセージが取りうる可能な状態の数」である。
1か0かしか取りうる可能な状態がない場合には、状態の数は2ということになる。すなわちこの場合、
情報量は1式より、
H0 = log22 = 1 ビット と計算できる。
コンピュータ内部では、さらに情報を8ビットづつまとめて扱うことが多いので、これを1バイト(byteまたはB)という単位で表す。1バイトの1024倍(=210)をKB(キロバイト)と呼び、1バイトの1048576倍(=220)をMB(メガバイト)と呼ぶ。例えば、フロッピーディスクに記憶できる情報の量は1MBほど、CD-ROMの場合は600MBほどになる。
(補足)
本来、単位は、首尾一貫した矛盾の無い国際単位系であるSI単位で表さねばならない。SI単位の例としては、皆さんがいつもTVやラジオで聞いている、天気予報での気圧の単位などが好例である。昔は、「気圧XXXミリバール」と言っていたところが、現在では、SI単位に従って、「気圧XXXXヘクトパスカル」といっているのをご存知だと思う。
しかし、コンピュータの世界においてはこれが遅れているようだ。キロというのは、SI単位の接頭語で1000倍を表す補助単位で、小文字のkで表す。何故なら、大文字のKは、絶対温度を表すケルビンを表す単位だからである。こんなところから言っても、バイトはSI単位とは言えない。一部の良識有る人たちは、kBを1000 Bの意味で使っているが、殆ど普及していないので、かえって単位の定義が2つあるような状態になっているようである。他にもSI単位とは違うものが多数あるが、ここではこのくらいにする。また以下の本文中では、このような理由から、コンピュータで使われる単位に対しては、SI単位であるような取り扱いはしないことにする。
情報を表す量としてもう一つ著名なものが有るので、簡単に紹介しておく。それは、エントロピー(entropy)、あるいは熱力学のエントロピーと区別して、情報エントロピーと呼ばれるものである。
エントロピーHは、自由度Wを用いて、以下のように表される。
H = logeW 情報単位
このエントロピーは、無知の程度(情報が欠如している程度)を表す量であり、情報を得ることによって、エントロピーは減少する。つまり、食物が有る、無い、が分からない時のエントロピーは、自由度が2であるのでloge2である。しかし、食物があるということが仲間の蜂によってもたらされれば、エントロピーはloge1
= 0 に減少する。
このようにして定義された情報を元に、情報を2進法で表すと、数値計算が容易にできるようになる。次にコンピュータでよく用いられる2進数と16進数について解説する。
1-2. 2進法と16進法
通常、我々が一般的に用いているものは10進法(decimal notation)である。0, 1, 2, 3, 4, 5, 6, 7, 8, 9 と来て、次に桁上がりして11, 12…という具合になっている。一般式で書くと、
x0・100 + x1・101 + x2・102 + x3・103 + x4・104 + ・・・ (2)
ここで、xは、0以上9以下の整数である。
10進法以外のものというと、秒・分は一種の60進法だし、時間は一種の12進法(あるいは24進法)、といった具合である。
これが2進法(binary notation)になると、0, 1と来て、すぐ次に桁上がりして10, 11と続く。さらに、次はまたまた桁上がりで、100, 101, 110, 111…と続く。とても桁上がりがせわしくて人間には向かないものだが、計算機にとっては重要なものなのである。一般式で書くと、
x0・20 + x1・21 + x2・22 + x3・23 + x4・24 + ・・・ (3)
ここで、xは、0または1である。
すると、賢明な読者には16進法(hexadecimal notation)の一般式が、
x0・160 + x1・161 + x2・162 + x3・163 + x4・164 + ・・・ (4)
であることは、容易に想像がつくであろう。ここで、xは、0以上15以下の整数である。しかし、数字は、0から9までしかないのに、16進法で10以上の数を表すには、どのような文字を用いているのであろうか? これは簡単なルールで解決されている。0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, Fと来て、次に桁上がりして、10になるのである。これが人間にとっては、すこぶる便利である。2進数で、1111000010101000などと表すと、人間にはお手上げであるが、16進数ではこれをF0A8と表せるのでより直感的にとらえられる。ここで、先ほどの2進数を 1111 0000 1010 1000の様に、4つの数字で区切ってみよう。そして、それぞれを別々に16進数に変換すると、F 0 A 8になる。これは、通常に16進数に変換したのと同等である。実は、2進数の4桁は、16進数の1桁に対応しているのである。
例として、コンピュータで文字を表すときのコードを見ていく。
アルファベットの「A」は、ASCIIコード(アスキーコード)で41と表される。これは、16進数での表現で、2進数で表すと01000001となり、情報量は8ビットとなる。文字を表す8ビットという情報量を、バイトと呼ぶ。通常の半角英数字は、1バイトで表されるので、1バイト文字と呼ばれることがある。
では、日本語の漢字ではどうか。漢字を表すコードは主に3種類あって、パソコンではシフトJISコード、UNIXワークステーションではEUCコードが標準的に用いられている。また、JISコードというものもあり、例えば、電子メールをメールサーバが取り扱う際に用いられている。例として、漢字を表すときのシフトJISコードを見てみよう。
「愛」という漢字は、16進コードでは88A4とシンプルだが、2進法で表すと1000100010100100と大変である。このように、漢字を表すには、通常16ビットの情報量が必要である。このような文字を、2バイト文字と呼んでいる。
1-3. 0と1を用いた様々な表現方法
さらに、2進数では論理演算(logic operation)を容易に扱うことができる点も、利点の一つである。即ち、偽を0、真を1と表すのである。こうすることによって、AND、OR、EORなどの論理演算が可能となる。
例えば、プログラミングにおいて、以下のような式があったとする。条件式が検討され、真なら1が、偽なら0がセットされる。その結果、1の場合は処理1が実行され、0の場合は処理2が実行されることになる。
if(条件式)then(処理1)
else (処理2);
データベースなどで検索する機会も増えてきていると思うが、この場合にも、論理演算は多用されている。情報関連の法律を検索する際には、「情報」かつ「法律」というキーワードで検索することになろうが、この場合には、
情報 AND 法律
という論理演算の結果で検索される。AND(論理積)の結果は、情報と法律の両方が真の時のみ真であり、それ以外は偽である。これを表しているのが真理値表である。
(補足)
スペースがあれば、ASCIIコード表、代表的な論理演算の真理値表を載せる予定。
意外とこのようなデータを見るために、大昔の教科書を開くことがあります。
それではグラフィック・データは、どのように表されているのだろうか。例えば、下の図で、
黒の部分を1、白の部分を0で表現すれば簡単に1と0で表すことが可能となる。この例では、8×8で表しているので、情報量は64ビットということになる。もし、カラーのグラフィックであるならば、さらに色の情報を数値で表せば良い。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1-4. ハードウェアの基礎
パソコン(personal computer)のハードウェアの構成は、主にCPU(中央演算処理装置; central processing unit)、主記憶装置(main memory)、補助記憶装置(auxiliary memory)、入出力装置(input-output equipment)からなる。
CPUとは、制御と演算を行う中枢部分であり、演算性能はバス幅で表される。最近のパソコンの主流は、32ビットのバス幅を持つが、これは同時に32ビットのデータを伝送できることを意味する。通常、パソコンでの処理は、命令を1つ1つ実行していく逐次処理であり、ノイマン型(von Neumann-type computer)と呼ばれている。ここが人間の脳との大きな違いであり、脳では複数の命令が、数多くの神経細胞(neuron)の間で、並列に処理されている。
処理に用いられるプログラム等は、必ず主記憶装置に読み込まれてから実行される。主記憶装置は、アドレスと呼ばれる数値で管理されており、それに対応してデータが格納されている。一般に主記憶装置は、揮発性メモリ(volatile memory)からなり、電源を切ると内容が失われてしまう。
これに対して、アクセス速度は小さくとも、大容量の記憶を可能にしたものが、補助記憶装置で、ハードディスク、フロッピーディスク、DAT、MO、ZIP、CD、DVDなどがこれに相当する。これらは、一般には不揮発性メモリからなり、電源を切っても記憶内容は失われない。
一方、パソコンは、人間とのやり取りができなくては、何の役にも立たない。人間とのインタフェースを受け持っているのが、入出力装置である。例えば、標準的には出力はディスプレイに出るし、入力はキーボードから行う。このため通常は、標準出力(standard output)はディスプレイに、標準入力はキーボードに設定されている。この他に最近では、マウスが入力に欠かせなくなってきているし、音はサウンド出力を通してスピーカ等に送られる仕組みになっている。この他、インターネット等の発達により、ネットワークを通じた入出力も重要になってきている。
1-5. ソフトウェアの基礎
コンピュータにもっとも近い言語は、機械語(machine language)である。機械語は、0と1からなる2進数からなる。機械に依存するので、機械が変われば互換性(compatibility)はないのが普通である。プログラミングしにくいので、特殊な用途以外にはあまり用いられない。これに対してアセンブラ言語(assembler language)は、人間が理解しやすい形態をとっている。アセンブラ言語で書かれたプログラムは、実行前にアセンブラを使って、機械語に翻訳し、実行形式のファイルに変換する。機械語の命令とほぼ1対1に対応しており、機械語に近いため、プログラムの実行速度は速い。ただし、機械語と同様、互換性(compatibility)は低い。
UNIXの世界の主流は、C言語(C language)である。1995年に米国AT&Tベル研究所のデニス・リッチーらが開発したもので、UNIXの基本的な部分は、C言語で書かれている。実行前にコンパイラ(compiler)を使って、機械語に翻訳し、実行形式のファイルに変換する。機械が変わっても、コンパイラが違いを吸収するので、互換性(compatibility)は高い。C言語は、人間に分かり易い構造を持っているにもかかわらず、低レベルのプログラミングも可能であり、実行速度も極めて速いため、広く用いられるようになってきた。現在では、VC++の様にWindowsのGUI(Graphic User Interface)環境の記述にも用いられており、現代のプログラミング言語の主役といっても良いであろう。機械語やアセンブラ言語に比べると、プログラムサイズが大きくなるのが欠点である。
コンピュータを動かし、プロセスやリソースを制御しているプログラムはOS(Operating System)と呼ばれる。ユーザの作った、ユーザ・アプリケーション・プログラムは、OSの上で稼動するのが普通である。C言語はOSを記述するのにも使われている。現在では、OSの主流は、Macintoshが始めたようなGUI環境を持つもので、よりユーザの立場に立ったものになってきている。
PASCALは、1970年にNicklaus Wirthによって開発された教育用の言語。PASCALでは、プログラムはより人間に理解しやすい形態となり、実行前にコンパイラ(compiler)を使って、機械語に翻訳し、実行形式のファイルに変換する。機械が変わっても、コンパイラが違いを吸収するので、互換性(compatibility)は高い。要するに、機械が変わっても、ソースコードさえあれば、新しい機械上でコンパイルしなおすことで、プログラムが動くようになる。Macintoshのプログラムの大部分は、伝統的にPASCALで書かれて来た。現在では、DELPHIなどのオブジェクト指向PASCALが開発されている。DELPHIはWindows環境でのGUIプログラミングや、データベースプログラミング等が容易にできるとともに、実行速度もVB(ビジュアルベーシック)の10倍以上と速いため、米国では数々の賞を受賞し、脚光を浴びている。
BASICは、1964年に米国ダートマス大学のJ.G.ケメニーとT.E.カーツによって開発された教育用の言語である。実行前にコンパイル等は行わないので、専門的操作が不要であるし、人間に分かり易い文法構造を持っているため、広く普及している。実行時にはインタプリタ(interpreter)が1行ずつ中間コードに変換し、それに対応する機械語コードが呼び出されて実行される。ただし、このため、実行速度は遅いのが欠点である。現在では、コンパイルできるものも出てきたため、実行速度は若干改善されている。また、VBのようにWindows環境でプログラミングが可能なものも出てきており、一般ユーザ向けの言語として注目を浴びている。
FORTRANは、1956年に米国IBM社のJ.Backusらによって開発され、科学技術計算のための言語として誕生した。プログラムは科学技術計算に適した形態で、実行前にコンパイラ(compiler)を使って、機械語に翻訳し、実行形式のファイルに変換する。互換性(compatibility)も高い。ライブラリ等は最適化されているので、科学技術計算に関しては、C言語で記述したものよりも実行速度が速いことが多い。
JAVAは、米国サンマイクロシステムズ社が開発した言語。WWWで動くアプレットを作成することができ、基本的には機種に依存しない。C言語と似たオブジェクト指向言語であるが、ポインタなどは使えない。
この他にも、COBOL、PL/1、APL、LISP、perlなど様々なプログラミング言語が存在するが、ここでは述べない。