プログラム言語って何でできてるのでしょうか?


プログラム言語って何でできてるのでしょうか?

コンパイルしてできあがるあの物体はなんですか?  
どうしてあれでコンピュータが動くのですか?

それを手書きすることも可能なのでしょうか。

また、PHPは最終的にC言語に変換されると聞きましたが、他の言語も最後はCなのでしょうか?




## マシン語

ソースコードをコンパイルしてできるファイルには、CPUに対する命令とデータが羅列されています。命令には、2番だったらメモリからCPUにデータを読む、4番だったらCPUに入っているデータにメモリに入ってるデータを足す、というように1つ1つ番号がついています。この番号そのものもしくはこれを並べたものをマシン語といいます。実行ファイル≒マシン語です。

初期のCPUではこの命令も大した数がなかったので、番号を丸暗記していて直接実行ファイルを書くこともできました。

## アセンブラ(アセンブリ言語)

しかしそれではあまりに不便なので、アセンブラ(アセンブリ言語)が作られます。これはさっきの番号をもう少しわかりやすい名前に変えたものです。上の例で行くとMOVとかADDとかです。これを並べたテキストファイル(アセンブリ言語のソースファイル)をアセンブラ(ややこしいですが、ここではテキストファイルをマシン語に変換するプログラムのこと)にかけると、マシン語の実行ファイルができあがります。ソースファイルに従ってマシン語を組み立てるのでアセンブラです。

## C言語などの高級言語

マシン語そのものに比べればアセンブラはだいぶ易しくなりますが、それでも面倒なことには変わりありません。`1+1`は`1+1`と書きたいですし、画面に文字を出力するには`puts("hoge")`と書きたいでしょう。そこで生まれたのがC言語などのプログラム言語です。人間が読み書きしやすい文法で書いたプログラムのソースファイルをマシン語に変換するのがコンパイラです。(マシン語ではなくアセンブラのソースファイルを出力することができるものもあります)

コンパイラが出力するのも最終的にはマシン語ですから、理屈さえわかっていれば同じ意味のマシン語を直接書くこともできます。

## インタープリタ

普通C言語などは、コンパイラによって実行ファイルを出力しますが、実行ファイルに変換するのではなくその場で実行する形式の言語もあります(インタープリター言語)。PHPもその一つです。(中間言語とかややこしい概念もあるのですが、省略します)

## PHPは最終的にC言語に変換される?

PHPのインタープリタがCで書かれている、という意味ならその通りですが、PHPのプログラムを実行しているときにC言語に変換されているという意味なら誤りです。

ただし、一部の言語では、自分自身が実行ファイルを出力するのではなく、C言語のソースファイルに変換し、それをCコンパイラによって実行ファイルにする、という形式で作られたものもありますが、一般的ではありません。

