1つ目の違いとして、プログラミング言語は自然言語より
文法が単純です。
プログラミング言語の文法とは、単語の記述順が決まっているだけです。
この章では、仮のプログラミング言語を題材にして説明します。
たとえば、次の例を見てください。
このプログラムは、画面に HELLO と言う言葉を映せ、という意味です。
このプログラムを、日本語の単語に置き換えるとこんな感じになります。
これで、画面に こんにちは という言葉を映せ、という意味になります。
たった2つの単語だけですが、これがプログラミング言語の文法なのです。
プログラミング言語で使われる品詞は、ほとんどが
動詞と目的語です。
先ほどのプログラムでは、映せが動詞、こんにちはが目的語、です。
動詞を先に持ってくるのは、コンピュータが主に英語圏の国で発展したためです。
先ほどのプログラムを自然言語に翻訳すると次の通りになります。
この2つを比べると、プログラミング言語の文法の単純さがわかります。
言語 |
文章 |
自然言語 |
画面に「こんにちは」という言葉を映しなさい。 |
プログラミング言語 |
REFLECT HELLO |
プログラミング言語(日本語単語) |
映せ こんにちは |
プログラミング言語に慣れない人は、この単純さに疑問を覚えます。
しかし、冒頭で述べたように、プログラミング言語はコンピュータを操作する言語です。
つまり、コンピュータへの命令を表現できれば十分なのです。
ところで、先ほどのプログラムを見て、プログラミング言語では 映せ とは書いていても、
画面に とはどこにも書いてないことに気づいた人もいるでしょう。
これは、映せ にすでに 画面に の意味が含まれているためです。
どこに映すか、まで正確に表現する必要がある場合は、次の通りになります。
この書き方であれば、こんにちは、を移す対象を変更できます。
このように書き換えれば、こんどはプリンタに印刷してくれます。
前節では、プログラミング言語の文法が非常に単純であることを説明しましたが、
プログラミング言語と自然言語との違いはそれだけではありません。
2つ目は、プログラミング言語は自然言語に比べ、
意味が明確なことです。
曖昧さが発生する余地はまったくなく、厳格で明確な意味が決められています。
たとえば、三角形を書く、という例を考えてみます。
人間相手であれば、三角形を書け、だけで十分通用しますが、
コンピュータを相手にする場合、三角形、という言葉はあまりにも抽象的です。
明確に、どのような手順で、どのようにして三角形を書くのか、
曖昧さがまったくない、
明確な手順で命令しなくてはいけません。
まず、どこから書き始めるかを命令しなくてはなりませんが、
そのとき、どこから、という位置も曖昧さがないように命令しなくてはいけません。
地球上で位置を完璧に指定するなら、緯度と経度を使いますが、
今回は似た方法として、画面の左上から右に何ミリ、下に何ミリ、で命令します。
初めに書く位置が決まったら、次に、どこまで線を引くかを命令します。
この位置を三角形の形になるようにすれば、三角形を書くことができるのです。
次は、英語のプログラミング言語で表してみた例です。
LINE 50,50 - 250,100
LINE 250,100 - 120,160
LINE 120,160 - 50,50
これを、日本語のプログラミング言語にすると次のようになります。
線 50,50 から 250,100
線 250,100 から 120,160
線 120,160 から 50,50
さらに、普通の日本語に訳すと次のようになります。
画面左上から右に50ミリ、下に50ミリの位置から、
右に250ミリ、下に100ミリの位置まで線を引け。
画面左上から右に250ミリ、下に100ミリの位置から、
右に120ミリ、下に160ミリの位置まで線を引け。
画面左上から右に120ミリ、下に160ミリの位置から、
右に50ミリ、下に50ミリの位置まで線を引け。
この手順に忠実に従うと、次のような画像が書かれます。
なお、ここでは1ミリを1つの点として考えています。
この様に、極めて明確な手順で命令するのが
プログラミング言語の特徴です。
その手順には曖昧さがまったくなく、すべての動作をこと細かく命令しなくてはなりません。
もう1つの例を出すならば、コンピュータにカップラーメンを作ってもらうには、
カップラーメンを作れ、だけでは当然不十分であり、
1メートル前進、右に90度回転、手を10センチ前方に突き出す、・・・
を延々と繰り返し、ラーメンを取り出しヤカンに水を入れ火をつけて注ぐまで、
人間がすべての動作をこと細かく教え込んでやらなければなりません。
また、コンピュータにとって、これらの動作は、単なる動作でしかありません。
コンピュータにとっては、
個々の動作はすべて独立した動作であって、
それが全体として、カップラーメンを作る、という仕事であるとは認識していません。
ただ、教えられた通りに動き続けている、それだけのことなのです。
もし、その最中にヤカンのお湯をぶちまける、という事態が発生しても、
それも単なる動作の1つであって、それが
ミスだとは認識していません。
これだけでも、人間相手に比べると非常に厳格で曖昧さがないと思えますが、
実を言えば、ここで紹介した手順でさえ、曖昧さが残っている手順なのです。
そもそも、線を引く、というのは非常に
曖昧な命令なのです。
コンピュータの画面が点(ドットと呼ぶ)の集まりなのは知っていると思いますが、
その一点一点について、どの点を書くかを命令しなくてはなりません。
もし、そのように、完璧に明確な命令を行うのであれば、
DOT 50,50
DOT 51,50
DOT 52,50
DOT 53,50
DOT 54,51
DOT 55,51
DOT 56,51
・
・
と言うように、点を書け、という命令を延々と繰り返さなくてはなりません。
さらに踏み込めば、点を書け、ですら曖昧な命令であり、
点を書け、という命令を完璧に明確な命令として表すならば、
コンピュータに接続されているOO番目の装置の記憶している数値の内、
32050番目の数値を0に設定せよ。
と言うとんでもない命令になります。
ここでは、横幅が640ドットのディスプレイを例として考え、
計算を行うと32050番目が画面左上から50、下に50の位置になります。
OO番目の装置とは、ディスプレイ(正確にはビデオカード)と考えます。
なお、0に設定せよ、というのは色のことで、0は黒を表すとします。
この様に、極限まで分解すれば、コンピュータの動作とは、
1つの数値を記憶する。(記憶)
1つの数値が0であるか判断する。(判断)
2つの数値を足し算する。(演算)
※しかも、ここで言う足し算とは、0+0,0+1,1+0,1+1 の4つだけです。
の3つだけということになります。
しかし、この3つを組み合わせれば、どんな複雑な計算でも行えてしまうのです。
現在では、さまざまな機能がコンピュータの先人達によって作られており、
ここまで細かく考える必要はありませんが、
コンピュータはそのような
厳密な機械であることは覚えておいてください。