電話

夜七時頃、ポケットの中で電話が鳴った。
出てみると、先日、書店で少し本を案内してさしあげた方からだった。
内容は、本を読んでみてもよくわからない点があるので教えてほしいとのこと。
プログラミング言語とはなんなのかが、よくわからないらしい。
その上に機械語だの、高級言語だのと言われても、理解しかねるということのようだった。
しばらく話して、「結局、人間が間違えにくいように作られているプログラミング言語高級言語なんですね」と納得してもらえた。

というわけで、そのあたりのことを、ここでもまとめておこう。

まず、目に見えるコンピュータの画面にいろいろなソフトが動くのは、そうした動きをコンピュータに仕込んであるからだ。
仕込みは、機械に作りつけではなく、とりかえることができる。
これがプログラム。ソフトとは、要するにプログラムだ。コンピュータはソフトを読み込んで、その指示に従って動作する。
プログラムには、その取替え可能なコンピュータの動き方の式次第が書いてある。
その書き方がプログラミング言語。プログラムは、その書き方にしたがって書かれる。

プログラミング言語といっても、機械にわかるのは、電気の状態がオンだかオフだかでしかない。つまり、機械すなわちコンピュータは、コンピュータ内にたくさん配線されている電線のうち、ある特定の電線には、いま電気が流れている(オン)か、流れていない(オフ)かという状態の集まりにしたがって動くわけだ。

だから、プログラムは、つまるところ、そうした電気パターンを、どんなふうにはじめるべきか、そうしてそれから、つぎつぎにどんな計算を続けて変化させていくべきかを指示するものだ。

機械は人間が作るもの。だから、ある特定の電気パターンには、ある特定の動作をするというように設計しておくことができる。
だから機械(CPU)ごとに、どんなパターンならどういう動作をするかが決められている。というか、決めてある。
そのオンの状態を1、オフの状態を0に対応させることにすれば、電気パターンを数字の羅列として表現することができる。
機械の設計上、その数字のパターンには特定の意味が割り付けてある。これが、もっとも原始的なプログラミング言語機械語だ。

機械語の一語一語はごく単純な動作しかしない。それでも、ある状態であるパターンの電気的入力があれば、ある特定の画面上の点を光らせたりすることはできる。これを大量に、かつ精密に指定すれば、どんな模様でも、あるいは文字でも静止画でも動画でも表示させられる。スピーカーからさまざまな音を出したりすることもできる。
プログラミング言語で書かれた内容(プログラム)には、コンピュータが何をどのくらい出力するのかを計算せよ、出力信号を送れというような命令の一式が入っている。

機械が直接反応できるのは、機械語だ。しかし、一見無意味な(CPUの設計者が決めたにすぎない)数字列を人間が扱うのは大変だ。
少しでも扱いが楽になるように、数字列のままではなく、意味ありげな記号列(ニーモニックという。憶えやすいというような意味)に割り当てなおしたものは、機械語よりも一歩だけ人間よりなプログラミング言語だ。これはアセンブラ(組み立て用言語という意味)と呼ばれる。

機械はいくら無味乾燥で恣意的な決め事であっても黙々と従うはずだから、機械が解釈するという目的にとっては、プログラミング言語にわかりやすさは必要ない。

だが、プログラミング言語を使ってプログラムを作るのは人間だ。
人間は、退屈する。人間は、混乱する。退屈したり混乱したりすると、人間は、間違える。
一方で、機械は人間の意図を理解できない。指示されれば、それが間違っているかどうかにかまわず実行する。間違った指示が出されれば、指示通り正確に間違う。

コンピュータが間違った動きをしては困る。だから、プログラムは正確に仕込まなくてはならない。これは、なかなか大変なことだ。

そこで、プログラミング言語をより間違えにくい、人間の都合にあったものにしようということになる。こうして人間寄りになったプログラミング言語は、高級言語と呼ばれる。

たとえば、アセンブラで、「ああして、こうして、そうなったらこんどはどうして、・・・」というような長い指示をあちこちで繰り返すかわりに、一連の慣用的な指示のかたまりは、短い一語で表現できるようにする。

あるいは、数学的な計算を指示する場合には、できるだけ数学の記号をそのまま使って書けばよいようにする。

またあるいは、機械はどんなデータでもすべてオンとオフのパターンとして処理するにしても、ソフトの動作を指示する人間の都合としては、いろいろなデータの種類を意図する(たとえば、整数だったり、文字だったり)。このようなデータ型をそのまま表現できるようにする。

さらには、同じ内容を表現できて、コンピュータが実行するときの結果が同じなら、プログラムはできるだけ短く簡潔に、プログラムする人間の意図をずばりと書けるほうがよい。

こんなふうに、プログラムを作る人間が、意図を正しく間違えずに表現できるようなプログラミング言語を作ろうというのが高級プログラミング言語を作る動機になっている。

もっとも、こうしたプログラミング言語で書いたプログラムは、もはやそのまま機械が直接実行できる様式ではない。そこで、機械が直接実行できる機械語に戻すという手間がかかるようになる。この手間は、コンパイルと呼ばれる。
(少しずつ高級言語のプログラムを読み、機械語に変換して実行して、また高級言語のプログラムの続きを読み・・・という処理を行うインタプリタというのもある。この種類のソフトは、仮想機械とも呼ばれる。)