小学校のプログラミング授業が始まることもあり、プログラミングに興味を示す方も多くなっていると思います。
そして、
「どうやって機械に命令しているの?」
「なんでいろんなプログラミングの言語があるの?」
「コンピュータって英語なら理解出来るのに日本語は理解できないの?」
という素朴な疑問は多くの初学者が抱くことでしょう。
まず始めに、コンピュータが読める言葉は”機械語”だけ。ということを頭に置いておいてください。
機械語は0(OFF)と1(ON)からなる信号の羅列なので一般の人間には理解出来ません。(一部のマニアックな方には操れます)
コンピュータのメモリ上には番地を振り分けられたアドレスがあり〜、、、などと理論の説明していくと眠くなりそうですから、ここでは誤解を恐れず、出来るだけシンプルにプログラミング言語が何故機械を操れるのか?を小学生でもわかるように書いていきます。
簡潔に言えばプログラムとはCPU(命令の処理装置)に予め決められている処理をどこでどう実行するか?
という”命令書”のことです。
先ほど、「機械語は0か1かという信号の羅列」だと述べました。
ここで注意が必用なのが機械語で表現している0や1は数字ではありません!
0や1で表すから誤解を抱かれやすいのですが、機械語の01信号は「ナシ」か「アリ」、「NO」か「YES」、「OFF」か「ON」、「0V」か「3V」、「凹」か「凸」、「ー」か「+」
といった2択の信号の状態のことです。
この信号を順番通りに「貯めておく」場所がメモリーと呼ばれる場所で、
この信号を読み取って実行するのがCPUと呼ばれる演算処理機です。
予め、CPUには「この信号がきたらこう動くんだぞー」という決まり事が作られており、CPUがメモリーの信号に順番にアクセスすることで、メモリーの中にある命令(信号)が順番に実行されます。
例えば車のようなロボットをプログラムするとして
- 「00」という信号なら「停止」
- 「01」なら「右に曲がる」
- 「10」なら「左に曲がる」
- 「11」なら「前進する」
という決まり事が作ってあるCPUがあるとします。
このロボットに
「11 01 11 01 11 10 11 00」
という命令を書いてメモリーに保存したらプログラミング完了!
すると、ロボットは左から順番にこの命令を実行します。
つまり、「前進、右に曲がる、前進、右に曲がる、前進、左に曲がる、前進、停止」
という命令を理解して動きます。
しかし、
「11 01 11 01 11 10 11 00」
という命令書は人間には非常にわかりにくく、また間違いも見つけにくいので”人間の言葉”に近づけて見やすく、書きやすくしようとしたのがプログラミング言語です。
たとえば、上の命令をこのように置き換えます
- 「00」=「STOP」
- 「01」=「RIGHT」
- 「10」=「LEFT」
- 「11」=「GO」
すると、先ほどと同じ命令でも
GO
RIGHT
GO
RIGHT
GO
LEFT
GO
STOP
という命令でプログラム出来るようになります。
見比べてください。命令内容は全く同じですので動きも同じですね。
これなら英語の理解出来る大多数の人はプログラム出来ますね。
これが、機械語と1対1の関係でプログラムをする「アセンブラ」と呼ばれるプログラムの例です。
しかし、このアセンブラで書いたプログラムは機械では読めませんから理解出来るようにもう一度機械語に変換しないといけません。
この変換するソフトのことを「コンパイラ」と呼び、言わば翻訳機です。
実際にはCPUは「GO」とか「RIGHT」という文字を読んで実行しているのではなく、
コンパイラによって翻訳された「11」とか「01」という信号を実行しています。
言うなればプログラミング言語の数はコンパイラの数です。
そしてもっともっと人間の言葉に近づけて書きやすく、見やすくしたものが「高級言語」と呼ばれるものです。
高級言語は、機械語と1対1の関係ではなく、コンパイラで決まっている形式で記述します。
例えば
先ほど2回出て来た
「RIGHT GO」 という表現を便利なように1つに纏めて right_go()
という表現で表しましょう。
その他に
「GO」 を go()
「LEFT GO」 をまとめて left_go()
「STOP」 を stop()
で表現するようにコンパイラに取り決めが作ってあるとします。
それぞれの()内にはそれを行う回数を入れるとその回数実行するとします。高級言語のプログラムでよく使われる()内のデータを(引数(ひきすう))と呼びます。
すると同じプログラムで記述はこうなります。
go(1);
right_go(2);
left_go(1);
stop(1);
どうです?随分と見やすくなりましたね。
これでコンパイラで機械語に翻訳すると
「11 01 11 01 11 10 11 00」
となり、機械語では始めの物と同じプログラムです。
このように機械語と1対1ではないけれど、結果的に機械語に変換してくれるのが高級言語なのです。
つまり、日本語のコンパイラがあれば日本語でもプログラミングできます。その代表が「なでしこ」です。
しかし、グローバルな社会であえて日本人だけが扱えるプログラミング言語というのはウケませんから英語が多いのでしょうね。
実際のCPUは今回例示した01の2つの信号で動いているものではなく、膨大01信号の羅列を処理しています。
01信号が増えれば増えるほど細かいデータが処理できるようになります。
興味がありましたら続編もご覧ください↓
<続>機械語は0か1だけなのに何でいろんな表現が出来るのか↓
小学生にプログラミングに興味を持ってもらうには「実際にロボットを動かす」これに尽きると思います。