最初の違いは、プログラミング言語が自然言語より
文法が単純であることです。
プログラミング言語の文法は、単語の記述順が決まっているだけです。
この章では、仮のプログラミング言語を例にとって説明します。
たとえば、以下の例を見てください。
このプログラムは、画面に「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メートル前進、右に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つを組み合わせれば、どんな複雑な計算でも行えてしまうのです。
しかし、これでは、人間にとってはあまりにも不便です。
そのため、人間にとって扱いやすくなるように、現代のコンピュータには様々な機能が追加されています。
したがって、現在では、プログラミングでも、様々な便利機能を享受できるため、
ここまで厳密で緻密に考える必要はありません。
しかし、現代(2023年)においても、コンピュータの本質的な仕組みには、一切の変化がありません。
したがって、全てのプログラムは、最終的には非常に単純な計算に分割されます。
そして、コンピュータは、ただ単に(1秒間に1兆回くらい)単純な計算を繰り返しているだけなのです。
プログラムを作るためには、コンピュータが
厳密な機械であることを、意識しておくことが大事です。