はじめに

「なぜ windows のソフトウェアが Mac では動かないの?」と彼は言った。『CPU が違うからだ』という説明は理解できたようだ。CPU が演算処理を行うということを彼は知っていた。「CPU が違うとなぜ動かないの?」『CPU には独自の命令セットがあって、windows が動く CUP(intel) と Mac が動く CPU(PPC) は命令セットが違うんだよ。』「そうなんだ。」

プログラマを名乗る者が「なぜ windows のソフトウェアが Mac では動かないの?」との問いに答えられないことには驚いた。プログラマだったらコンピューターが動く仕組みを少しは知っていると思っていたからだ。私はえらそうなことを言えるほどの知識をもっていないが コンピューターの仕組み には常々興味がある。たしかにコンピューターの仕組みをすべて知ったところで素晴らしいプログラムが書けるわけないのだが、プログラマたる者、コンピューターの低レベルな部分への好奇心を持ち、知識を貯えることでより良いプログラミングやソフトウェアの設計が行えるだろう。

コンピューターの低レベルな部分=ハードウェア。ハードウェアを制御するソフトウェアを知ることでプログラミングの限界の幅が広がる。コンピューターの仕組みを理解してゆく道は有益なライブラリに出会う感動と似ている。

無機質なプログラミングの説明

コンピューターのソフトウェアを記述することをプログラミングと言う。ソフトウェアを記述するとはプログラミング言語を用いてコンピューターへの命令を書くことだ。ソフトウェアを記述することを「プログラムを作る」と言うこともあるが、語の定義に厳密な違いはない。 (本書ではソフトウェアという用語をプログラムと同意語として扱う。またアプリケーションも同じくソフトウェアを指す。プログラム=ソフトウェア=アプリケーション)

我々は何故にソフトウェアを作るのかと言えば、道具としてコンピューターを利用するためである。コンピューターの強みは毎度同じ演算を飽きもせずに実行してくれることだ。繰り返しの作業でも飽きずにやってくれる。ソフトウェアを一度書けば同じ処理を「ソフトウェアを実行する」という1回の処理に置き換えられるので工数削減とか自動化ができる。だから我々はソフトウェアを作るのだ。場合によってはコンピューターでしか実現し得ない行為をソフトウェアとして具現化することもあるだろう。

プログラムの要素

次に挙げるのはプログラミングを成立させる基本事項。命令の構成要素である。

入力
キーボードやファイルからデータを受け取る。
出力
データをディスプレイへ表示したりファイルに書き出す。
数学
足し算やかけ算、代入といった数式を実行する。
条件付きの実行
ある状態であるかないかを判別して、適切な系の命令だけを処理する。
反復
何らかの動作を繰り返し実行する。

こういった要素を用いてコンピューターへの命令(プログラム)を書くのだ。

コンピューターに命令するとはどういうことか

コンピューターに命令する。コンピューターとは計算する箱、総称してハードウェアと呼ばれる。ハードウェアはソフトウェアが無ければただの物体。CDプレーヤーと音楽、ビデオデッキと映像の関係と同じく、それ単体ではどちらも無用の長物である。

プログラミングはコンピューターへの命令を書く行為だ。コンピューターへのひとまとまりの命令がソフトウェアとなる。このソフトウェアは演劇の台本と似ている。始まりがあり終わりがある。ストーリーの流れが意味を成すのである。ソフトウェアという芝居は ハードウェアの制御 に他ならない。役者への要求のかたまりである。

ハードウェアの制御はプログラミングのなかでも最も低レベルな部分にあたる。それなりに高度な知識と経験と盆雑/冗長なプログラミングが必要になるので、一般的にはハードウェアを抽象化したプログラムを用いるようにプログラミングを行う。つまり、ハードウェアについて知らなくてもソフトウェアを作成することができる。

ソースコードから生成されるコード

プログラミング言語を用いて書かれたコンピューターへの命令文の集まりを ソースコード という。ソースコードは OS にとってはただのテキスト ファイルであり、ソースコードそのものはソフトウェアではない。

ソースコードをコンピューターが理解可能(実行可能)な形式へ変換する必要がある。 この変換作業を コンパイル という。 コンパイルを担うソフトウェアを コンパイラ [compiler] と呼ぶ。 コンパイラはソースコードをコンピューターが読み取り可能な形式である オブジェクトコード に変換する。 オブジェクトコードは、オブジェクトファイルあるいはネイティヴコードとも呼ばれる。

オブジェクトコードはさらに他のオブジェクトコードと リンク されることで 実行可能なファイル(実行ファイル) になる。あるいは他のプログラムから利用されるための ライブラリ になる。

コンパイラは一般的にオブジェクトコードの生成、オブジェクトコードのリンク、実行ファイルの生成を一手に引き受けるツールである。ソースコードが実行可能なファイルになるまでに必要なツールはコンパイラ、アセンブラ、リンカー。多くのコンパイラはこの3つのツールを含むかたちで提供されている。

プログラムを実行する = カーネルがハードウェアを制御する

実行ファイルを駆動するのはカーネルと呼ばれる OS の中核にあたるソフトウェアである。正しくはシェルと呼ばれるソフトウェアを介してカーネルに命令が届く。プログラムは必ずカーネルの制御を受けるのでカーネルがプログラムを実行すると思って間違いない。プログラムの出力結果は何らかの出力装置に対して書き込まれる。出力装置へのアクセス制御などもカーネルが行っているのでカーネルの介在は無視できない。通常、カーネルのみがハードウェアを直接制御できる。

我々が普段利用しているパソコンはハードウェアとソフトウェアに分かれる。ソフトウェアとは OS を始めとする各種アプリケーションのことである。ハードウェアはキーボード、マウス、ディスプレイ、ハードディスク、メモリなどである。

ソフトウェアは我々が操作するキーボードやマウスから入力信号を受け取り、その命令はカーネルが処理し、ディスプレイなどの出力装置へ結果が出力される。 キードードはそれ単体で電気信号を発しマザーボードに配置された各種の バス を通じてその信号がカーネルに伝えられる。ちなみにキーボードを動作させるのは人間の指先だけで、パソコン本体のように電力が不要。キーボードの内部では電極が接触することで電気信号が発するようになっている。

入力装置から受け取った信号をカーネルはソフトウェア(プログラム)の命令に従い、計算式を実行して画面にその結果を出力したりする。カーネルは入力装置からの信号を実行中のプログラムに従って処理し、その結果を出力装置(ディスプレイやプリンタ)や記憶装置(ハードディスク)に出力する役割が与えられている。究極的にはカーネルがなければハードウェアもソフトウェアも役に立たない。厳密にはカーネルを含むあるいはカーネルと一体となるソフトウェア群から成るオペレーティング システムが必要なんだけどその中核は常にカーネルであることは間違いない。

hardware-and-software


最終更新日: 2009年05月04日(月) / カテゴリー: プログラミング・ソフトウェア開発


Back to top