この記事ではコンパイラとインタプリタの違いを端的に解説します。
コンパイラ言語とインタプリタ言語の違いは実は1つだけ。それは、プログラムの実行方式です。
分類 | プログラム実行方式 |
---|---|
コンパイラ | ソースコードを一括で機械語に変換する仕組み |
インタプリタ | ソースコードを1行1行機械語に変換しつつ同時に実行まで制御する仕組み |
このページでは、そもそも機械語って何?コンパイラ・インタプリタって何?という前提から、コンパイラ言語とインタプリタ言語の違い・両者の使い分け、メリット/デメリットまで網羅的に解説していきます。
プログラマーを目指す方であれば基本として知っておきたい内容ばかりです。(そして、最後まで読んでいただければ、コンパイラ言語・インタプリタ言語という分類が誤解であるということを理解することができます。)
是非最後までご覧ください。
前提:機械語とは?
コンパイラ言語とインタプリタ言語の違いを解説する前に、まずは前提となる「機械語」について。
我々が普段書いているソースコードは、実は書いている人間しか理解することができません。言い換えると、コンピューターはソースコードの命令の意味や文字の内容を直接認識しているわけではないのです。
def add_func(a, b): return a + b answer = add_func(b=9, a=2,) print(answer)
参考 print関数
このソースコードはPythonで書かれていますが、コンピューターはそのままの形では何も理解することができないのです。では、どのようにしてコンピューターはプログラムを実行しているか?
その答えが機械語です。
そもそもプログラムを実行するCPU(コンピューターの頭脳)自体は単なる計算機でしかありません。また「計算」とは言っても、電流のON/OFFを数値化した「0」か「1」の計算しかできない代物です。つまり、コンピュータでプログラムを実行するためには、全ての命令は「0」と「1」だけで構成する必要があるのです。
コンピュータが実際に命令を理解できるように、様々な言語で書かれたソースコードを「0」と「1」だけで構成されるように翻訳したものが機械語です。
最終的にプログラムを実行する際には、どのような言語であってもコンピュータが最終的に読んでいるのは機械語に翻訳されたコードなのです。
コンパイラ・インタプリタとは?
結論から言うと、コンパイラとインタプリタはソースコードを機械語に翻訳するためのツール(仕組み)です。
先ほど説明した通り、コンピュータは「0」か「1」しか理解できないので、プログラムを実行する際にはソースコードを機械語に翻訳する必要があります。この際に利用するのがコンパイラorインタプリタです。
機械語への翻訳をコンパイラで行う言語を「コンパイラ言語」、インタプリタで行う言語を「インタプリタ言語」と呼びます。
コンパイラとインタプリタの違い
さて、この2つの翻訳ツール「コンパイラ」と「インタプリタ」は何が違うのか?
それをまとめたのが以下の表です。
分類 | プログラム実行方式 |
---|---|
コンパイラ | ソースコードを一括で機械語に変換する仕組み |
インタプリタ | ソースコードを1行1行機械語に変換しつつ同時に実行まで制御する仕組み |
コンパイラとインタプリタの違いを一つずつ詳しく解説します。
コンパイラの仕組み
コンパイラは、ソースコードを一括で機械語に変換する仕組みのこと。プログラムは、この一括変換後に生成されたexeファイルを読み込んで実行されます。
ポイントはプログラム実行前に一括変換するということ。つまり、プログラムを実行する前にすべてのソースコードが機械語に翻訳されている状態のため、プログラムの実行速度がその分早くなります。
一方で、プログラムを編集するたびに、毎回コンパイルをし都度実行ファイルの生成が必要となるため改修のしやすさという面ではマイナスです。
ソースコードから機械語に翻訳することをコンパイルと言います。翻訳する仕組み自体のことをコンパイラと呼び区別します。
コンパイラはあくまでも機械語への翻訳のみを行う
もう少し詳細に説明すると、コンパイラはあくまでもソースコードを機械語に翻訳する役割のみを担います。
つまり、一度コンパイルしてしまえば、プログラムを実行する際にコンパイラは不要であるばかりでなく、おおもとのソースコードがなくても動くということです。
コンパイラはあくまでもソースコード⇒機械語への変換機能のみを担うという理解が重要です。
インタプリタの仕組み
それでは、インタプリタはどのような仕組みでしょう。
インタプリタはコンパイラと異なり、プログラム実行時にソースコードを1行ずつ翻訳しながらコンピュータへ命令を渡していく仕組みです。
大事なポイントは、機械語への翻訳とプログラムの実行が同時に行われるということ。
コンパイラがプログラム実行前にすべてのソースコードを一括で機械語に変換するのに対して、インタプリタは「機械語への変換」と「プログラムの実行・制御」を同時に行います。(同時通訳をしているようなイメージを持てればOK。)
コンパイラの場合、一度ソースコードを機械語に翻訳してしまえばあとはプログラムの実行に関しては全く関係のない存在となります。しかし、インタプリタは機械語への翻訳をしつつ、プログラムの制御も同時に行っているため、インタプリタがなければインタプリタ言語は実行することができません。
コンパイラは1冊の本を翻訳すること。インタプリタは同時通訳をすることに例えられます。
コンパイラはあくまでも本を翻訳(機械語への変換)する役割なので、誰かが本を読む(プログラムを実行する)際には必要がない存在です。一方で、インタプリタは同時通訳―。つまり、本を翻訳しながら読み上げることが役割であるため、本を読む(プログラムを実行する)際には必ず必要となる存在なのです。
「コンパイラ言語」「インタプリタ言語」という誤解
ここまで読んでいただいた方の中にはお気づきになった方も多いかもしれませんが、インタプリタによってプログラムの実行が行われる言語を「インタプリタ言語」、事前にソースコードが一括でコンパイルされる言語を「コンパイラ言語」と分類してしまうのは実はナンセンスです。
一般的にPythonやRubyはインタプリタ言語である!と説明されますが、実は、インタプリタ言語のソースコードもコンパイルすることは可能です。つまり、いつもはインタプリタを通してプログラムを同時翻訳的に実行するような言語でも、事前に一括翻訳(コンパイル)し、CPUが直接実行することも技術的に可能なのです。
「Pythonは勉強しやすいけど実行速度が遅いからなあ」というのは半分正解で半分間違い。実際に、Pythonで書かれたプログラムの高速化するために、インタプリタによって実行するのではなく、事前にコンパイルしておく例も豊富に存在しているということに注意しましょう。
プログラミングを1から学んでみたい方は
プログラミングをより実践的に学びたい―。実際にコーディングをしながら学びたい―。独学に限界を感じている―。
そんな方には、無料体験/オンライン完結もあるプログラミングスクールで学ぶのがおすすめです。都度検索しながら知識を補完していくのではなく、1から体系立てて学ぶことで短時間・かつ効率的にスキルハックすることが可能です。
各プログラミングスクールの特徴をまとめた記事をこちらに記載しておきますので、是非ご覧ください。