

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

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

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

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


CC BY-SA 3.0
2015-03-05T11:48:49.833
7489
2015-03-06T05:16:56.777
5855
question
c 言語仕様 プログラミング言語
プログラム言語って何でできてるのでしょうか?


> PHPは最終的にC言語に変換されると聞きました

これが気になったのでちょっと調べてみましたが、少なくとも公式の処理系である Zend Engine ではそのようなことはないようです。

  * [生まれ変わるPHP - Zend Engine 2、SQLiteの実力は? (5) Zend Engineの仕組みとパフォーマンスの向上 | マイナビニュース](http://news.mynavi.jp/special/2004/php5/004.html)
  * [Zend Engine - Wikipedia](http://ja.wikipedia.org/wiki/Zend_Engine)
  * [HipHop Virtual Machine - Wikipedia](http://ja.wikipedia.org/wiki/HipHop_Virtual_Machine)

なお、事前に機械語までコンパイルすることで処理速度の向上が期待できるため、 PHP から C++ への変換を行なう実装も存在します。

  * [PHPのソースコードをC++のコードに変換する:phpspot開発日誌](http://phpspot.org/blog/archives/2006/05/phpc.html)
  * [hiphop php でPHPからジェネレートされたC++コードを読んでみよう。 - お前の血は何色だ!! 4](http://d.hatena.ne.jp/rti7743/20111225/1324817155)

前述の HipHop VM のように、C/C++を介さず、その場で機械語にコンパイルして実行するというパターンもありますね。


CC BY-SA 3.0
2015-03-05T13:46:33.417
7497
2015-03-05T13:46:33.417
8000
7489
answer


一般にコンパイラの機能は大まかに **フロントエンド** と **バックエンド** に分割されます。

フロントエンドは特定の言語のソースコードの意味を分析する工程です。プログラミング言語は通常[バッカス・ナウア記法](http://ja.wikipedia.org/wiki/EBNF)などを使った文法の定義と、各文法の機能上の定義で出来ていますので、ルールに従って解析を行います。

一方バックエンドはフロントエンドの解析したコードの構造を利用して何か別のものを作成する部分です。「コンパイルしてできあがるあの物体」は一概には決まらず、同じ言語であってもコンパイラによってCPUや仮想機械や他言語向けのコードであったり、場合によってはドキュメント等も出力されます。

なおCPUや仮想機械には通常アセンブリ言語という機械語と一対一対応する言語が提供されており、それらを使えば実行ファイルを作成できます。もちろんアセンブラを使わずに機械語を直接打ち込むことも原理的には可能です。


CC BY-SA 3.0
2015-03-05T14:56:40.927
7503
2015-03-05T14:56:40.927
5750
7489
answer


## マシン語

ソースコードをコンパイルしてできるファイルには、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コンパイラによって実行ファイルにする、という形式で作られたものもありますが、一般的ではありません。


CC BY-SA 3.0
2015-03-06T05:16:56.777
7531
2015-03-06T05:16:56.777
5793
7489
answer