「コンピューターの構成の基礎知識」1と0の極限を目指す機械

コンピュータの操作

コンピューターは計算機

 『コンピューター(computer)』とは凄い性能の計算機の事。

 もし子供に「数学なんて何の役に立つのか?」と聞かれたなら、こう答えていいかもしれない。
幾何学なぜ数学を学ぶのか?「エウクレイデスと原論の謎」 「数学を完璧にマスターしたなら、コンピューターと同じ事ができるよ」と。
 これは別に嘘ではない。
実際にはちょっと嘘だけど。
けどどちらかという真実である。

 コンピューターでインターネットを見る時、グラフィックを描く時、ゲームをする時に、その裏側で起きているのは、ただ計算。
それだけである。
 コンピューターの裏側で起きている事は『プログラム(program)』という事も出来る。

 プログラムとは「命令とデータの集合体」であり、それらの『命令(order)』や『データ(data)』のさらに裏側には、やはり数値の計算があるのだ。

ハードウェアとソフトウェアの違い

 コンピューターは基本的に『ハードウェア(hardware)』と『ソフトウェア(software)』の組み合わせ。

 ハードウェアは、『ディスプレイ(display)』や『キーボード(Keyboard)』のような、物理的に目に見える装置。
 普通、ハードウェアは『集積回路(Integrated Circuit)』で構成される。
たいてい集積回路は『IC』と呼ばれる。
 個々のICには『ピン(Pin)』がいくつもついている。
ピンとは『端子(Terminal)』の事で、つまり他の部品との接続部である。
 究極的には、ハードウェアに可能な動きは、情報(データ)の『入力(input)』。
入力した情報の『演算(Calculation)』。
情報の演算結果の『出力(output)』。
それらくらいである。

 ソフトウェアはプログラムのような、データ上の存在。
プログラムの中には命令が含まれる。
命令とは、ハードウェアに対する命令。
 どのデータを入力し、どのように演算し、どの演算結果を出力するのかを指示するもの。

プログラムとは何か?

ソフトウェアの階層

 プログラムを作る作業をプログラミングと言う。
それはつまりコンピューターの動作を決める作業に等しい。
 
 ところで人型ロボットはコンピューターだろうか。
あれも人型ボディなどのハードウェア、内部プログラムというソフトウェアから構成されるので、コンピューターと言っても問題ない(コラム1)

 例えば「手を上げろ」と言えば、手を上げるロボットがあるとする。
 ロボットの内部では、命令の上に命令があり、さらにその上に命令があるはずである。
そうした階層状に積み重なる中で、最上層の命令こそが「手を上げろ」という音声による命令となるのだ。
人工知能の基礎「人工知能の基礎知識」ロボットとの違い。基礎理論。思考プロセスの問題点まで  では最下層の命令はどうなっているか?
最下層でなくとも、プログラムと呼ばれる階層での命令は、まず間違いなく「手を上げろ」というひとつの命令ではない。
 そこにあるのは、手をどの角度で、どんな速度で、どんな高さに上げるか。
声をどう判断するか、手を上げた後、どうするか。
そういうあらゆる命令が一塊となっているはず。
 そういう何らかの複雑な動作の為の、一塊の命令群には『副プログラム(sub program)』、『関数(function)』、『サブルーチン(subroutine)』、『メソッド (method)』、『ステートメント(statement)』など様々な呼び名がある。
これらの呼び名をどのように使い分けるかは、『プログラミング言語(Programming language)』や、プログラマー自身の流儀により異なる。

 また、プログラム内の一部の命令群でなく、あるひとつのプログラム自体をまとめた意味の言葉に『ファイル(file)』がある。

(コラム1)生命体はコンピューター

 お気づきかもしれないが、人もコンピューターかもしれない

我々の体はハードウェア。
脳とか神経系はソフトウェアだ。
宇宙のアンテナ「アンテナの基礎知識」種類ごとの用途。個々の特徴 制御工学「制御とは何か」コントロールの工学技術の基礎

プログラミング言語

 データとは何らかの情報を表す、文字や数字や絵などの、記号である。
最下層の命令で利用されるデータは、必ず『2進法(binary)』における数字、つまり0と1のみで構成される。

 プログラミング言語とは、プログラミングを行う為の言語だが、これも最下層ソフトウェア(0と1のみの命令)と最上層ソフトウェア(そのコンピューターの外部との直接的な関わり)の、間のどこかに設けられた階層みたいなものだ。
 ある階層(あるプログラミング言語)では、命令に『10進数(decimal number)』といくつかの英単語データを使う。
また別の階層(また別のプログラミング言語)では、数字と英単語に加え、図形データも使う。

 プログラミング言語とは、いわばソフトウェア最下層の難しい命令やデータを、よりわかりやすい言語に翻訳した領域である。
そこではまた、より下層のプログラムのサブルーチンなどの簡略化もなされる。

 その時点でのソフトウェア内の全変数の値を記録する為に、それら全てを不変の固定値に置き換えるとする。
ソフトウェアの下層で、
「1=m1、2=m2、3=m3……」
となっているような長いサブルーチンを、あるプログラミング言語(より上層)にて、単に、
「save」
という短い関数で表したりするのである。

 プログラマーに人気のプログラミング言語は、下層の命令群の簡略化を上手くやっている言語と見て間違いない。

データ

 ソフトウェア(プログラム)の命令に従い、ハードウェアに入力され、演算され、出力されるデータを『変数(variable)』と言う。
 変数はデータを区別する為の識別子(固有の名前みたいなもの)だが、個々の変数はさらに、『変数名(variable name)』によって区別される。

 ある変数の、入力時や出力時などのデータの状態(特定の数とか単語とか)を、その時点での『値(value)』と言う。

機械語

 プログラムは基本的に記号の羅列になるが、その記号群を『コード(code)』と言う。
 コードは、ファイルに若干近いが微妙に、しかし明確に異なる。
 コードは、特定のプログラム言語(命令とデータ)の羅列。
 ファイルは、情報のまとまり。
言うなれば、特定のプログラミング言語が存在する領域全体を指す言葉である。

 何らかのプログラミング言語のコードを『ソースコード(source code)』。
ソフトウェア最下層(あるいは最下層と直接繋がる階層)のコードを『ネイティブコード(native code)』、あるいは『機械語(machine language)』と言う。

 ハードウェアにおいて、実際にコードを扱うのはICであり、このICが理解可能なのはネイティブコードのみ。
だから、どんなソースコードでも、普通はCPUへと伝わる前に、ソースコードからネイティブコードへの変換が行われる。

 ソースコードからネイティブコードへの変換を『コンパイル(compile)』。
コンパイルするソフトウェアの階層(プログラム)を、『コンパイラ(compiler)』と言う。

ユーザーインターフェースとは何か?

 コンピューターを扱う人が、扱える最も簡単なソフトウェアの階層、あるいはメインとする階層(普通は最上層)を『ユーザーインターフェース(User Interface)』、または略して『UI』と言う。
 
 現在、標準のUIと言えば『GUI(Graphical User Interface)。
どこの誰にでもわかりやすいように、画像とか、アイコンとかを駆使して、視覚的な理解が可能な作りを目指しているUIである。

 UIから、データの管理や、効率的なプロセスなど、総合的な操作環境のソフトウェアとして『OS(Operating System)』がある。
WINDOWSやAndroidなどがその代表である。
「OSとは何か」直感的なGUI、仮想の領域。アプリケーションの裏で起きてること  コンピューターの開発環境がプログラミング言語。
操作環境がUIやOSである。

 おそらくOSの目指す究極の理想は、完全にユーザーの思考通り動く、心機一体型の『ユーザー体験(user experience)』である。

ネットとは何か?

 コンピューターはプログラムに従い動く。
どういうプログラミング言語が使えるかは、もちろんそれに対応したソフトウェアが、そのコンピューターに搭載されてるかどうかで決まる。

 仮に『C言語(C language)』というプログラミング言語で作った「TS」というパズルゲームのファイルがあったとする。
『電波通信(radio communication)』などで繋がった別のコンピューターに、そのTSのファイルを送る。
電波「電波」電磁波との違い。なぜ波長が長く、周波数が低いか もしその接続先のコンピューターにC言語を理解するソフトウェアが組み込まれてたなら、そのコンピューターでTSをプレイする事が出来る。

 『ネットワーク(network)』とは、このような複数のコンピューター間のソフトウェアの共有である。
ネットワークのイメージ「ネットワークの仕組みの基礎知識」OSI参照モデル、IPアドレスとは何か  もちろん、C言語を理解出来ないコンピューターでも、C言語を理解し、さらに別のプログラミング言語に変換出来る別のコンピューターを通せば、TSがプレイ出来る事になる。
レンダリング中「ブラウザの仕組み」レンダリングはいかにして行われるか?

コンピューターの内部。回路設計

CPUとメモリー

 ハードウェアを構成する主たる部品であるICには、いくつか種類、あるいは機能がある。
 
 最も重要なのは「中央処理装置」などと訳される『CPU(Central Processing Unit)』である。
CPUは、コンピューターの頭脳と言えるもので、演算を行う部品である。
特に複雑な処理は、CPUの性能次第で速度にかなり違いが出てくる。
CPUの進化によってコンピューターは高速化してきたのである。

 命令やデータは『メモリー(memory)』に記憶される。
場合によって、その記憶は一時的だったり、半永続的だったりする。
 『CPUメモリー(CPU memory)』と呼ばれる一時的なメモリーは、いうなればCPUの計算作業スペースである。
複雑な計算には、いくつもの途中の答が伴う。
その途中の答を記録しておくのがCPUメモリーである。
CPUメモリーの容量は、処理出来るデータ量のリミットとも言えるので、CPU同様コンピューターの速度と深い関わりがある。
 一方で『HDD(hard disk drive)』のような半永続的なメモリーは、特定のデータやファイルを保存しておく為の装置である。
 

I/Oポート

 ICには、キーボードやマウスやディスプレイなどの周辺機器と繋がる為の端子である『I/Oポート(Input/Output Port)』も欠かせない。

 我々がキーボードで、モニター上のメモ帳に文章を書く時の事を想像しよう。

 まず我々が打ったキーの入力パターンが、I/Oポートを介してICに送られる。
 ICはCPUとメモリーを駆使して、キーの入力パターンから、
適切な文字データを導く。
この時もちろんICが扱っているデータは、機械語(数字)になっている。
 そしてその演算後のデータは、再びI/Oポートを介し、今度はディスプレイへと送られる。
ディスプレイは移送されてきたデータに応じた適切な文字を表示する。
言うまでもなく、その表示される文字は、キーボードのキー設定に対応した文字。

 コンピューターは、こういう仕組みで動作しているという訳だ。

なぜ2進数なのか?

 普通、コンピューターにおいて、繋がりあうハードウェアを行き来し、ソフトウェアによってデータ(ネイティブコード)として解釈されてるのは、『電気信号(signal)』である。

 なぜネイティブコードは2進数が基本なのかというと、それはICが、シグナル(電気信号)の有無を、ふたつの数字(0と1)として解釈するからである。
「あるか、ないか」というのを基準に数字を示す場合に、10進数や3進数や1000進数は、実用的とは言い難い。
だから2進数なのだ。

 また、普通、コンピューターがやりとりする情報の最小単位『ビット(bit)』とは、「2進数における最小単位(binary digit)」の略である。
1ビット「ビットとは何か」情報量の原子は本質的にも原子であるのか 最も根本的な演算処理に2進数をつかうのだから、コンピューターの情報の最小がビットなのは当然であろう。

アドレスとは何か?

 コンピューターの記録する全ての情報は、0か1というビットの組み合わせである。
そこで個々のビットが0なのか1なのかを記憶しておく為の回路として、『フリップフロップ(flip-flop)』がある。
これはまた『レジスタ(register)』とも呼ばれ、ICの重要な基本要素である。

 もちろんレジスタは普通いくつもあって、コンピューターの複雑なシステムを実現する。
しかし、それならひとつの大システムを構成する、別々のプログラムの為のシグナルが、同じレジスタを使ってしまうと、システムは崩れかねない。

 例えば「アルファベット」を表現するシステムがあるとする。
 Aを表現する為のデータに関するシグナルが記憶されたレジスタが、新たにXを表現する為のシグナルの記録に使われてしまったら、AがXになったりしてしまう。
そんな些細な違いならまだマシで、それがシステム自体の不動作に繋がる危険性もある。

 そういう事を防ぐ為にも、I/Oポートには、『I/Oアドレス(port address)』と呼ばれる識別番号が設定されている。
またメモリー領域にも『メモリーアドレス(memory address )』という領域が設定されている。
これらのアドレスは、どのプログラムやシステムの為かが、明確に決まっていて、データ処理が混乱しないようになっている。
 またI/Oアドレスやメモリーアドレスは、物理的概念としての識別アドレス領域という意味で使われる事が多く、仮想的(システム構成的)なアドレス領域を指す言葉として『アドレス空間(Address Space )』がある。
 
 コンピューターを物理的に改造するに辺り、新たなシステム(ハードウェア+ソフトウェア)を追加する場合、そのシステムの為に使用するアドレス空間は、既存のシステムに割り当てられたものとの重複を避けねばならない。
 ただ現在は『プラグアンドプレイ(Plug and Play) 』と言われる仕様が多い。
つまり新たな機器を接続したり、プログラムを起動させると、自動的に使用可能なアドレス空間を割り出し、繋げてくれるようになっているのである。

クロック信号

 システム構築には、個々のプログラムが作動するタイミングも重要である。
 例えば「3+5×5-8」という計算を行うプログラムがあったとする。
答はもちろん20だが、その計算の順番を間違えてしまったら、それはもちろんでなくなる。
 例えば「(5-8+3)×5」という順番に計算してしまったら、答は0となってしまう。

 コンピューターのデータ処理とは、レジスタに記録したビットを使う演算である。
個々のレジスタの処理がズレると、計算の順番狂いなどが生じるであろう。

 そこで、ここの信号処理のタイミングを合わせる為に利用されるのが『クロック信号(clock signal)』である。
これは、電圧の高低(onとoff)を繰り返す信号。
雷「電磁気学」最初の場の理論。電気と磁気の関係  そして、クロック信号の繰り返しの度に、各回路、アドレス、レジスタの信号のタイミングのズレを正す事が出来る『クロック同期設計(Synchronous circuit)』という設計技術がある。
それにより、複雑なシステムの背後にある、複雑な機能も、問題なく機能してくれる訳だ。
電気回路「電気回路、電子回路、半導体の基礎知識」電子機器の脈  クロック信号を出力する回路は『クロックジェネレータ(clock generator)』と呼ばれる。
その性能は、主に繰り返しのスピード、周波数であり『ヘルツ(Hz)』と書かれる。
Hz=1秒間の振動数。
例えば5Hz=1秒間に5回繰り返す振動。
 よく聞く『メガヘルツ(MHz)』は1000000Hz 。
『ギガヘルツ(GHz)』は1000MHzである。
 
 もちろんクロック信号の速度もコンピューターのデータ処理速度に関わる。
さらに利用される回路規模がでかすぎて、クロック同期設計が間に合わず、ソフトウェアにエラーが生じてしまう場合がある。
そういうケースを『タイミングバイオレーション(Timing violation)』と言う。