幾千万の言葉を尽くしても
うまい食べ物が嫌いな人間はそうそういないと思う。もちろん私もそんなうまい物好きの一人であると自認するものであり、機会があればあちこちの店を訪れて食べ歩いている。すると、自然とお気に入りの店というものができてくるものである。以前のエッセイで紹介した紅茶専門店TEA BAR KANDYもそうだし、これから紹介するレストラン「まほうのきっちん」という店もそうである。
「まほうのきっちん」、はじめて目にした時はちょっとインパクトのある名前と思った。夜だったのでいささか目立たなかったが、外壁がショッキングピンク(懐かしい言葉である)だったのがまた驚きであった。それにくらべると店内はわりと普通だった。経営していたのは感じのいい若い夫婦であった。いくつかの品をオーダーしたが、どれも大変美味であった。すっかり気に入った私はそれ以来、昼夜となく通うようになった(簡単にいうと馬鹿の一つ覚え状態である)。
しつこく通っていると自然と顔なじみになってしまうもので、今では食事をとりながらいろいろな話題に花を咲かせるようになった(相手を選べないところに客商売の辛さがある、と思う)。そんな中でうまいものを作れる人をたいへん尊敬すると言った事がある。
いろいろと異論もあろうが、とにかく私自身はコンピュータの技術に比べ、料理の技術の方がはるかに洗練されており文化的にも格上と思っている。そんなことないでしょうと言われたが、それに対して私はこう答えた。
「コンピュータは説明しないと分からないが、料理は説明しなくても分かってもらえる」
けだし名言、と思いたいところだが、いかがなものだろうか(さらにここで、料理の素晴らしさを高々と謳い上げられればよいのだろうが、私の本職をよく思い出していただきたい)。
ところで説明といえば、任意の事柄や概念等を言葉で示す事である。そして、コンピュータの技術で言葉といえば、やはりプログラム言語を取り上げないわけにはいかないだろう。これは、コンピュータを利用するために非常に重要な技術であるが、習得に苦労している者も多い(私もその一人だ)。まあ、いつもの通り解説していく事にしよう。
しかし、解説といっても、プログラム言語はいくつもの種類があり、そのひとつでも取り上げて詳細に説明すると、まさに本を一冊書くことになってしまう。そこで、ここではプログラム言語の概念を中心に解説していくつもりである。
そもそも言語とは、人間同士が意志の疎通を図るために用いる記号・文字・音声の集合と、それを互いにどのように交換するかを定めた規則である、といえる。これに対しプログラム言語は人間がコンピュータにその意志を伝える、つまりどのように動作すればよいかを「命令」という単位を用いて記述する規則である。命令はコードとも呼ばれている。
さて、ここで問題が発生する。それは人間の理解する言語とコンピュータで用いるプログラム言語が「大きく異なっている」ということである。人間が通常、用いている言語を特に「自然言語」と呼ぶ。コンピュータでもプログラム言語として自然言語を採用することが出来ればたいへん理想的である。が、現実にはコンピュータの動作を記述する言語とは最終的には2進数の数列によって表現されるコードの集合であり、例えば次のようなものだ(註1)。
<機械語で記述されたプログラム例>
00101110 00000000 00000011 00000001 00101110 00000000 00000100 00000001
00100111 00000001 00000001 00000000 00100101 00000000 00000101 00000001
00101111 00000000 00000000 00000000
これだけでは、なんのことやらさっぱり理解できないだろう。もちろん、それが普通である(理解する変わり者もまれに存在する。近寄らない方が無難である)。このおよそ自然言語とはかけ離れた、2進数の数列からなるプログラム言語が、機械語(マシン語ともいう)と呼ばれるものなのである。そしてこの機械語こそが、コンピュータが直接解釈し実行可能な唯一の言語であり、まさにコンピュータにとっての自然言語と呼ぶべきものである。
だが、これほどまでにかけ離れた人間とコンピュータの言語を、このままにはしておけない。互いに、またはどちらかが歩み寄る工夫が必要であり、これがいくつものプログラム言語を生み出す事になった。
まずは、アセンブラ言語である。前述の通り、機械語は2進数の数列であるため大変読みにくい。そこで、その2進数のコードを英単語を元にしたニーモニックという略号に置き換えたプログラム言語が、このアセンブラ言語である。アセンブラ言語で記述されたプログラムの例を次に挙げよう。
<アセンブラ言語で記述されたプログラム例>
LD 0003 A
LD 0004 B
ADD A B
ST 0005 A
HALT
機械語よりはずっといい。しかし、コンピュータはこの単純なニーモニックすら理解できないため、アセンブラというプログラムを用いて2進数の機械語に変換する(註2)。なんといってもコンピュータが実行できるのは唯一、機械語だけなのだ。
アセンブラ言語は機械語より(我々にとって)いくぶん理解しやすい。だが、単純な動作をさせるためにも大変きめ細かく記述しなければならない。この調子で大規模なプログラムを大量に記述するのはあまり現実的ではない。
ところで、機械語とアセンブラ言語の2種類の言語をまとめて低水準言語と分類される。これは、数あるプログラム言語の分類法の一つで、人間とコンピュータのどちら寄りであるかで高水準・低水準とする考え方である。人間にとって分かりやすいと高水準、コンピュータに近いと低水準となる。低水準言語に分類されるのは機械語とアセンブラ言語の2つだけである。
高水準言語は低水準言語に比べ、より人間に近いプログラム言語を表す分類である。高水準言語の主な特色は、低水準言語に比べ文法がたいへん自然言語(特に英語)に近いという点である。今まで同様、ある高水準言語で記述されたプログラム例を次に示してみよう。
<ある高水準言語で記述されたプログラム例>
a:=1+2
たったこれだけである。なんとなく足し算に見えないだろうか。そう、実は先ほどから取り上げているプログラム例は全て、同じ1+2という足し算を実行させるものだったのだ。低水準言語に比べると、我々人間の言葉にとても似ている。これなら習得はかなり楽になるかもしれない。ただし、しつこいようだがコンピュータが理解できるプログラム言語は機械語だけである。したがってどこかの時点で、高水準言語で記述されたプログラムは、機械語に翻訳されなければならない。高水準言語であることは、この翻訳する仕組みを持つことにほかならない。
ところで、いま私は「翻訳」という言葉を使った。アセンブラ言語の時は「変換」と説明したが、高水準言語ではあえて「翻訳」である。なぜか。それは、アセンブラ言語のニーモニックは機械語コードと1対1で対応していが、高水準言語のコードは複数の、しかも多数の機械語コードに変換されるので、単なる変換ではなく翻訳なのである。
さて、どのようにして高水準言語を機械語に翻訳するか、これには大きく分けて2つの方法がある。ひとつは、インタープリタ方式。もう一つはコンパイラ方式である。
インタープリタ方式とは逐次翻訳といって、高水準言語で記述されたプログラムを実行時に逐一、機械語に翻訳し実行するというものである。高水準言語で記述されたプログラムはすぐその場で実行できるため、実行結果の確認も容易になり作業効率もよい。ただし、翻訳と実行を同時に行うため、コンピュータの性能を翻訳にもつぎ込むことになり、見かけの性能は大変低下する。
コンパイラ方式は、この翻訳作業をあらかじめ済ませておき、実行時のために機械語のプログラムとして用意しておくというものである。この方式では、まず高水準言語で記述された元になるプログラムを用意する。この用意されたプログラムはソースプログラム、または単にソースと呼ばれている。ソースプログラムはそのままでは当然実行できないので機械語に翻訳しなくてはならない。翻訳を行うのは専用に記述されたプログラム(これも機械語で記述されている)であり、この翻訳用プログラムをコンパイラと呼ぶ。コンパイラで機械語に翻訳されたプログラムはオブジェクトプログラム、またはオブジェクトと呼ばれている。オブジェクトプログラムはインタープリタ方式で記述されたプログラムに比べ、コンピュータの性能を無駄にすることが少なく大変高速に実行できる。ただし、コンパイルする時点でソースプログラムに誤りや矛盾がないことが条件である。文法上の誤りはコンパイラが見つけてくれるが、文法的にまともでも内容の矛盾した記述があると、コンパイラはそれを発見できずに実行用のオブジェクトプログラムを生成してしまう。これを実行するとコンピュータの動作がおかしくなる、いわゆる「暴走」や「フリーズ」といった状態に陥る。
この文法的にはまともだが矛盾する記述という状態はいささか分かりにくいかもしれない。これは例えていうなら、次のような行動を指示する文章だ。
1.雨に濡れたネコをタオルを使って乾かしてあげなさい。
2.雨に濡れたネコを電子レンジを使って乾かしてあげなさい。
ほとんどの人々にとって1の指示はまともなものだが、2もまともだと思う人は極めて少ないだろう(註3)。たが、単純に「文法的」な点から見てはどうだろう。なにかまずいところがあるだろうか。ネコを電子レンジに入れるのは極めて悪質な虐待、つまり異常な行動であるからコンピュータ的には「暴走」である。だが、それは道徳的な異常さであって、日本語の文法上の誤りではない。これが実行可能だが問題のある記述というものである。
コンパイラ方式の主な欠点といえば、インタープリタ方式に比べ、プログラムの作成が難しいことだろう。逐次翻訳・実行タイプのインタープリタ方式なら、記述したプログラムをその場ですぐに実行して確かめられるので、誤りを見つけるのが比較的容易である。それに対して、コンパイラ方式は記述したプログラムは、一括して翻訳作業を行った後にようやく実行可能になる。実行可能にならなければプログラムのチェックも難しいため、作業手順が増えて理解しにくくなるのである。だが、そんな生産性の低下を補ってあまりあるほど、インタープリタ方式に比べ実行性能が高まるため、現在ではコンパイラ方式が主流である。
また、これは高水準言語全体について言えることだが、概してプログラムサイズが大きくなるという欠点がある。それは翻訳の際に、無駄なコードが組み込まれるからだ。これは、外国語(例えば英語)を直訳することを想像していただきたい。日本語としてみると妙に回りくどかったり、直接的な表現になり文章が長くなったりする。ところが、きれいに翻訳すると同じことをもっと短く自然な言葉で表現できていたりする。高水準言語でも同じことで、翻訳用のプログラムがプログラマの意図を完全にくみ取れる訳ではない。したがって、まず完全に動作するようにコードを省略せず、回りくどい記述になりがちなのである。
高水準言語に分類されるプログラム言語には実に様々な種類があり、ここでさらなる解説をしたい衝動を鎮めるに十分なほどである。よって、残念ではあるが、その件は別のエッセイで取り上げるとしよう(ネタの節約という意味もあるが)。
現代社会において、流通や生産の現場を支えている重要な要素のひとつがコンピュータとネットワークである。そして、そのコンピュータを動かしているのは文字通り幾千万ものコードを紡いで書き上げられた無数のプログラム群だろう。
冒頭で私は、料理は説明しなくても分かってもらえる、と書いた。もちろん、好みの問題もあるので全ての人々にとってそれが最高のものであるかどうかは分からない。だが、自分だけしか理解できない喜び、たとえ幾百、幾千万の言葉を尽くしても表現できない感動、というものは存在する。そんな感動を作り出す人々に、様々な素材を供給し、生産を支えるための産業基盤の一部として多くのコンピュータシステムが構築されるのだとすれば、そして、そのために無数のコードが記述され利用されているのだとすれば、コンピュータに関わる仕事も悪くはない、と思えるのである。
(註1)ここで取り上げた機械語は架空のマイクロプロセッサを想定している。つまり実在しないコードだが、現実の機械語も似たようなものである。
(註2)その昔は、ハンドアセンブルといってニーモニックでプログラムを記述した後、変換表を見ながら手作業で機械語に変換した。そのせいか「変換表を見ずに」じかに機械語に変換できる「人間アセンブラ」と呼ばれる者まで出現した。
(註3)極めて少ない、としたのは実際に米国で起きたことだからだ。無論、電子レンジに入れられたネコは命を落とした。さらに実行した本人は虐待だとは自覚しておらず、説明書にネコを入れてはいけないとは書いていなかったと製造元を訴えた。驚くべきことに製造元は敗訴した。