コンパイラとインタプリタは何をしていて、何が違うのか

プログラミング言語には2種類あります。コンパイラ型とインタプリタ型です。(本当はもう少し細分化できますが、ややこしいので簡単にまとめます)

この2つがどのような働きをしていて、どのような違いがあるのかということをテーマにお話したいと思います。

コンパイラやインタプリタは何をしているのか

ソースコードとバイナリコード

僕たちがプログラミング言語を使って書くコードは「ソースコード」と呼ばれます。ソースコードはその読み書きを学べば人間が読んだり書いたりできるものです。

しかし、コンピュータは人間の言語を理解できません。0と1の羅列しか解読できないため、例えば"orange"という単語1つを出力しようと思っても、コンピュータが直接分かるように書こうとするとorangeというアルファベットは使用できません。アルファベットはあくまで人間語だからです。

この「人間には理解できないが、コンピュータは理解できる0と1で構成された言語」を「バイナリコード」と言います。

ちなみにですが、orangeをバイナリコードにするとこうなります。

01101111 01110010 01100001 01101110 01100111 01100101

011011110111001001100001011011100110011101100101
orange

人間とコンピュータの間に入るのがコンパイラ、インタプリタ

コンパイラやインタプリタは人間語のソースコードと機械語のバイナリコードの間に入り、人間が書いたプログラムをコンピュータが分かる言語に翻訳するものです。

これによって

System.out.println("Hello");

とか

print("Hello")

と人間が読み書きできるソースコードで書けば、翻訳された0と1のバイナリコードがコンピュータに届けられ、それをコンピュータが実行してHelloが出力されるということになります。

コンパイラとインタプリタの違い

「人間語をコンピュータが理解できる言語に翻訳する」のがコンパイラやインタプリタですが、ではこの2つの違いとは何でしょう?

コンパイラは翻訳家

ハリー・ポッターの本を読んだことがあるという方はたくさんいると思いますが、原書を英語のまま読んだという日本人はそんなに多くないのではないでしょうか。

ハリー・ポッターは長編です。そこそこ英語ができるという方でも一冊読み切ろうと思うとかなり大変な作業になります。しかし日本語に一冊丸ごと翻訳すればどうでしょう?

コンパイラの仕事はまさにこれです。英語が読めない人(人間語が読めないコンピュータ)のために、英語で書かれた物語(ソースコード)を本一冊丸ごと一気に翻訳してから手渡すと、長い物語でもスムーズに楽しむことができます。

インタプリタは同時通訳

一方で、この丸ごと一気に翻訳することのデメリットは何でしょう?

大きな問題は翻訳する手間と時間がかかるというものです。

例えばスポーツ中継のヒーローインタビューでは、選手が英語で話すからといって、コメントを丸ごと一気に翻訳するでしょうか?

そんなことしてたら時間がかかってしょうがありません。そこで必要なのは、すぐに翻訳してくれる同時通訳です。

インタプリタはこの同時通訳のように、人間語を少しずつ機械語に翻訳しながらプログラムに書かれた命令をコンピュータに伝えて実行させます。

一方で先ほどのハリー・ポッターのような長編小説や、ある程度の量がある文章の場合、同時通訳は向いていません。なぜなら同時通訳は逐一翻訳作業を挟むために、その速度に限界があるからです。

メリットとデメリット

このメリットとデメリットはそのままプログラミングにも当てはまります。

  • コンパイラ型は事前に丸ごと一気にソースコードをバイナリコードに翻訳するため、実行までに手間と時間がかかるが実行速度が早い
  • インタプリタ型は少しずつ翻訳しながら実行するために実行速度は遅いが、すぐにプログラムを開始できる

これはつまり、その言語が大規模開発に向いているのか、小規模開発に向いているのかの違いと言ってもいいでしょう。

最近流行のPython、Webと密接な関係にあるPHPがなぜインタプリタ型なのか、逆に大規模なシステム開発などに使われるC言語がなぜコンパイラ型なのかがなんとなく分かると思います。

タイトルとURLをコピーしました