DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

プログラミングでなぜ機械を操れるの?(高級言語とは?)

小学校のプログラミング授業が始まることもあり、プログラミングに興味を示す方も多くなっていると思います。

そして、

「どうやって機械に命令しているの?」

「なんでいろんなプログラミングの言語があるの?」

「コンピュータって英語なら理解出来るのに日本語は理解できないの?」

という素朴な疑問は多くの初学者が抱くことでしょう。

 

まず始めに、コンピュータが読める言葉は”機械語”だけ。ということを頭に置いておいてください。


機械語は0(OFF)と1(ON)からなる信号の羅列なので一般の人間には理解出来ません。(一部のマニアックな方には操れます)

 f:id:DreamerDream:20180622150526p:plain

コンピュータのメモリ上には番地を振り分けられたアドレスがあり〜、、、などと理論の説明していくと眠くなりそうですから、ここでは誤解を恐れず、出来るだけシンプルにプログラミング言語が何故機械を操れるのか?を小学生でもわかるように書いていきます。

 

簡潔に言えばプログラムとはCPU(命令の処理装置)に予め決められている処理をどこでどう実行するか?

という”命令書”のことです。

 

先ほど、「機械語は0か1かという信号の羅列」だと述べました。

ここで注意が必用なのが機械語で表現している0や1は数字ではありません!

0や1で表すから誤解を抱かれやすいのですが、機械語の01信号は「ナシ」か「アリ」、「NO」か「YES」、「OFF」か「ON」、「0V」か「3V」、「凹」か「凸」、「ー」か「+」

といった2択の信号の状態のことです。

この信号を順番通りに「貯めておく」場所がメモリーと呼ばれる場所で

この信号を読み取って実行するのがCPUと呼ばれる演算処理機です。


予め、CPUには「この信号がきたらこう動くんだぞー」という決まり事が作られており、CPUがメモリーの信号に順番にアクセスすることで、メモリーの中にある命令(信号)が順番に実行されます。

 

例えば車のようなロボットをプログラムするとして

  • 「00」という信号なら「停止」
  • 「01」なら「右に曲がる」
  • 「10」なら「左に曲がる」
  • 「11」なら「前進する」

f:id:DreamerDream:20190415113953p:plain

という決まり事が作ってあるCPUがあるとします。

 

このロボットに

「11 01 11 01 11 10 11 00」


という命令を書いてメモリーに保存したらプログラミング完了!

すると、ロボットは左から順番にこの命令を実行します。
つまり、「前進、右に曲がる、前進、右に曲がる、前進、左に曲がる、前進、停止」
という命令を理解して動きます。

f:id:DreamerDream:20190415114506p:plain


 

しかし、
「11 01 11 01 11 10 11 00」
という命令書は人間には非常にわかりにくく、また間違いも見つけにくいので”人間の言葉”に近づけて見やすく、書きやすくしようとしたのがプログラミング言語です。

 

たとえば、上の命令をこのように置き換えます

  • 「00」=「STOP」
  • 「01」=「RIGHT」
  • 「10」=「LEFT」
  • 「11」=「GO」

f:id:DreamerDream:20190415115032p:plain



すると、先ほどと同じ命令でも

GO

RIGHT

GO

RIGHT

GO

LEFT

GO

STOP 

という命令でプログラム出来るようになります。

f:id:DreamerDream:20190415115334p:plain

見比べてください。命令内容は全く同じですので動きも同じですね。

これなら英語の理解出来る大多数の人はプログラム出来ますね。
これが、機械語と1対1の関係でプログラムをする「アセンブラ」と呼ばれるプログラムの例です。

 

しかし、このアセンブラで書いたプログラムは機械では読めませんから理解出来るようにもう一度機械語に変換しないといけません
この変換するソフトのことを「コンパイラ」と呼び、言わば翻訳機です。

 

実際にはCPUは「GO」とか「RIGHT」という文字を読んで実行しているのではなく、

f:id:DreamerDream:20190415115334p:plain

コンパイラによって翻訳された「11」とか「01」という信号を実行しています。

f:id:DreamerDream:20190415114506p:plain

言うなればプログラミング言語の数はコンパイラの数です
そしてもっともっと人間の言葉に近づけて書きやすく、見やすくしたものが「高級言語」と呼ばれるものです。

 

高級言語は、機械語と1対1の関係ではなく、コンパイラで決まっている形式で記述します。

例えば

先ほど2回出て来た

RIGHT GO」 という表現を便利なように1つに纏めて right_go()

という表現で表しましょう。

f:id:DreamerDream:20190415120515p:plain

その他に

GO」 を go()

f:id:DreamerDream:20190415120533p:plain

LEFT GO」  をまとめて  left_go()

f:id:DreamerDream:20190415120547p:plain

STOP」 を stop()

f:id:DreamerDream:20190415120600p:plain

で表現するようにコンパイラに取り決めが作ってあるとします。

それぞれの()内にはそれを行う回数を入れるとその回数実行するとします。高級言語のプログラムでよく使われる()内のデータを(引数(ひきすう))と呼びます。

 

すると同じプログラムで記述はこうなります。

go(1);

right_go(2);

left_go(1);

stop(1);

f:id:DreamerDream:20190415134952p:plain

どうです?随分と見やすくなりましたね。

これでコンパイラ機械語に翻訳すると

「11 01 11 01 11 10 11 00」

となり、機械語では始めの物と同じプログラムです。

f:id:DreamerDream:20190415134952p:plainf:id:DreamerDream:20190415114506p:plain

 

このように機械語と1対1ではないけれど、結果的に機械語に変換してくれるのが高級言語なのです。

 

つまり、日本語のコンパイラがあれば日本語でもプログラミングできます。その代表が「なでしこ」です。

nadesi.com

しかし、グローバルな社会であえて日本人だけが扱えるプログラミング言語というのはウケませんから英語が多いのでしょうね。

 

 

実際のCPUは今回例示した01の2つの信号で動いているものではなく、膨大01信号の羅列を処理しています。

01信号が増えれば増えるほど細かいデータが処理できるようになります。

興味がありましたら続編もご覧ください↓

<続>機械語は0か1だけなのに何でいろんな表現が出来るのか↓

dreamerdream.hateblo.jp

 

 

 

 

 

小学生にプログラミングに興味を持ってもらうには「実際にロボットを動かす」これに尽きると思います。

dreamerdream.hateblo.jp

https://cdn.profile-image.st-hatena.com/users/DreamerDream/profile.png私、(PONさん (@o_n_pon) | Twitter)を応援してくださるお優しいかたは15円から投げ銭可能ですので↓よりカンパをお願いしますm(_ _)m

kampa.me