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」なら「前進する」

という決まり事が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の関係でプログラムをする「アセンブラ」と呼ばれるプログラムの例です。

 

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

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

 

高級言語は、機械語と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ではないけれど、結果的に機械語に変換してくれるのが高級言語なのです。

 

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

nadesi.com

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

 

 

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

dreamerdream.hateblo.jp