苦しんで覚えるC言語

プログラムとは何か?


第1項:プログラムとは

ここでは、プログラムに初めて挑戦する人のために、
プログラムの概要を説明しておきたいと思います。

プログラムとは、コンピュータを動かす最も基本的な方法です。
プログラムでは、一般にプログラミング言語と呼ばれる、
コンピュータのための言語を使用してコンピュータを操作します。

わざわざここで説明しなくてもほとんどの人は、プログラミング言語が、
コンピュータのための言語であることは知識として知っています。
しかし、それでも簡単にはプログラムが理解出来ないのは、
プログラミング言語には自然言語と違う点が多いためです。
なお、我々人間が使う自然言語のことを自然言語と呼びます。

つまり、プログラミング言語と自然言語の違いを理解することが、
プログラミングを理解する上での最初のハードルとなります。
この章では、具体例を通じて2つの言語の違いを説明します。
目次に戻る

第2項:単純な文法

1つ目の違いとして、プログラミング言語は自然言語より文法が単純です。
プログラミング言語の文法とは、単語の記述順が決まっているだけです。
この章では、仮のプログラミング言語を題材にして説明します。

例えば、次の例を見て下さい。

REFLECT HELLO
このプログラムは、画面に HELLO と言う言葉を映せ、という意味です。
このプログラムを、日本語の単語に置き換えるとこんな感じになります。

映せ こんにちは
これで、画面に こんにちは という言葉を映せ、という意味になります。
たった2つの単語だけですが、これがプログラミング言語の文法なのです。

プログラミング言語で使われる品詞は、ほとんどが動詞と目的語です。
先ほどのプログラムでは、映せが動詞、こんにちはが目的語、です。
動詞を先に持ってくるのは、コンピュータが主に英語圏の国で発展したためです。

先ほどのプログラムを自然言語に翻訳すると次の通りになります。

画面に「こんにちは」という言葉を映しなさい。

この2つを比べると、プログラミング言語の文法の単純さがわかります。
自然言語画面に「こんにちは」という言葉を映しなさい。
プログラミング言語REFLECT HELLO
日本語の単語映せ こんにちは
プログラミング言語に慣れない人は、この単純さに疑問を覚えます。
しかし、冒頭で述べたように、プログラミング言語はコンピュータを操作する言語です。
つまり、コンピュータへの命令を表現できれば十分なのです。

ところで、先ほどのプログラムを見て、プログラミング言語では 映せ とは書いていても、
画面に とはどこにも書いてないことに気づいた人もいるでしょう。
これは、映せ に既に 画面に の意味が含まれているためです。
どこに映すか、まで正確に表現する必要がある場合は、次の通りになります。

映せ 画面 こんにちは
この書き方であれば、こんにちは、を移す対象を変更することができます。

映せ プリンタ こんにちは
このように書き換えれば、こんどはプリンタに印刷してくれます。
目次に戻る

第3項:明確な意味

前節では、プログラミング言語の文法が非常に単純であることを説明しましたが、
プログラミング言語と自然言語との違いはそれだけではありません。

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つの点として考えています。
00-01-01.png
この様に、極めて明確な手順で命令するのがプログラミング言語の特徴です。
その手順には曖昧さが全くなく、全ての動作をこと細かく命令しなくてはなりません。

もう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つを組み合わせれば、どんな複雑な計算でも可能です。

現在では、様々な機能がコンピュータの先人達によって作られており、
ここまで細かく考える必要はありませんが、
コンピュータはそのような厳密な機械であることは覚えておいて下さい。

目次に戻る

第4項:全ては計算

前節の最後の方でも少しその形を見せていましたが、
プログラミング言語と自然言語の最大の違いは、その目的にあります。

3つ目は、プログラミング言語は、計算のための言語であるという点です。
コンピュータでは数値が全てであり、数値以外の概念は一切存在しません。

前節で三角形を描く時も、全て数値で指定していましたが、
同様に、プログラミング言語で扱われるのは全て数値であり、
結局の所、プログラミング言語とは計算用言語なのです。

しかし、前節で説明したように、コンピュータに行える計算とは足し算だけです。
もちろん、その足し算の組み合わせによって、加減乗除が行えますが、
所詮、コンピュータに出来る計算とはその程度でしかありません。

加減乗除しか出来ないコンピュータなど電卓より劣るように思えますが、
コンピュータには、人間から指定された順番通りに計算を行う機能があります。
計算の順番を指定するための言語が、プログラミング言語なのです。

現代のコンピュータは、加減乗除の計算順序をとてつもなく複雑に組み合わせて、
マウスを使って直感的に操作出来るような機能を提供しているため、
どうしても数値を扱っているという感覚が薄れてしまいます。

しかし、プログラミング言語を習得する時には、数値を強く意識すれば、
一見すると理解しにくい文法などもわかりやすくなると思います。

目次に戻る