エンジニアの知識

インタプリタとコンパイラの違いは?網羅的に解説

プログラミング言語は、その実行方法を大別して「インタプリタ型言語」と「コンパイラ型言語」と言う2つのタイプに分かれます。

プログラミング言語の2つのタイプ

  • インタプリタ型言語
  • コンパイラ型言語

この記事では、それぞれについて解説し、また、その違いを説明します。
近年多く見られる「コンパイラ型とインタプリタ型が融合している現状」も触れていきます。

インタプリタ型言語とは?

インタプリタとは通訳者のこと。ソースコードを順々に翻訳しながら実行する形式

インタプリタ型言語(Interpreted Language)」は、コンピュータ・プログラミング言語の形態の一つです。単に「インタプリタ言語」ともいいます。英語で「インタプリタ」は「通訳者」や「解釈」という意味です。

インタプリタ型言語におけるプログラムの実行ソフトウェアを、単に「インタプリタ」といいます。インタプリタ型言語は、ソースコードを実行する際に、ソースコードとコンピュータの間に「通訳者」として入って、逐次的(≒順々)に実行を行っていく形式です。

代表的なインタプリタ型言語

  • JavaScript
  • Python
  • PHP
  • Perl
  • Ruby
  • R
  • etc...

コンパイラ型言語とは?

コンパイラとは編集者のこと。予めソースコードを実行可能な形式に変換しておき、それを実行する方式

コンパイラ型言語(Compiler Language)」は、コンピュータ・プログラミング言語の形態の一つです。単に「コンパイル言語」や「コンパイラ言語」ともいいます。英語におけるの「コンパイル(Compile)」の意味は「編集をする」であり、「コンパイラ」とは「編集者」という意味です。

特にコンピュータシステムでは高級言語で記述されたソースコードを、より機械側に近い「中間言語」へ変換したり、直接的に機械が扱える「機械語」へ変換することを指します。この時に使うソフトウェアをコンパイラといい、この変換作業を「コンパイルする」といいます。

コンパイラ型言語ではプログラムの実行前に、「予めソースコードを実行可能な形に変換」しておきます。こうして変換しておいたファイルを、実行時に動かすというわけです。以下に、コンパイラ型言語の有名な例を示します。なお、C#やJavaは特殊な例ですので、後述します。

代表的なコンパイラ言語

  • C言語
  • C++言語
  • Objective-C
  • C#(後述)
  • Java(後述)
  • etc...

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

インタプリタは動的型付けが主で、コンパイラは静的型付けが主

インタープリタ型言語とコンパイラ型言語は、その実行方式の違いから、様々な相違点があります。

インタプリタ型言語の場合、その性質上、「対話型環境(Interactive Environment)」を持つ事が多くあります。対話型環境を用いると、プログラムの内容(1行ないし複数行)を直接入力し、即座に実行して結果を得ることができます。

インタープリタ型言語に多く見られる特徴

  • 対話型環境を持つことが多い
  • 動的型付けが多い

そして、インタプリタ型言語では動的型付け(実行時に変数や関数の型が決定されるもの)が多く採用され、コンパイラ型言語では静的型付け(コンパイル時に変数や関数の型がチェックされるもの)が主に採用されるなどの特徴があります。

ただし、コンパイラ型言語において動的型付けがされないわけではありません。コンパイラ型言語では「主に静的型付けで事前チェックがなされ、実行時には動的型付けも行われることがある」という認識が正確です。

コンパイラ型言語に多く見られる特徴

  • 静的型付けが多い

両者のメリット・デメリットによる違い

インタプリタ型言語にもコンパイラ型言語には互いに対象的な利点と欠点がある

インタプリタ型言語はそのメリット・デメリットが、相反する関係になっています。

両言語のメリット・デメリットの違い

  • インタプリタ型言語:コンパイルが不要なので実行が楽だが、実行速度に難あり
  • コンパイラ型言語:コンパイルが必要で実行するまでが大変だが、実行速度が早い

まず、インタプリタ型言語はコンパイルという作業なしでも、そのままプログラムを実行できます。そのため実行が楽です。対して、コンパイラ型言語の場合、大規模なソフトウェアを開発している場合では、コンパイルだけで数時間を要することも起こりえます。

しかし、コンパイルにかかった時間のうちいくらかは、インタプリタ型言語の実行中に、常に含まれてしまいます。これは「実行速度がコンパイラ型言語に比べて遅くなること」を意味しています。

なぜなら、インタプリタ型言語は、言うなれば「コンパイルを実行中に、常に行っているのと同じようなもの」だからです。

そのため、インタプリタ型言語はコンパイラ型言語よりも処理時間が遅いとされています。これらの点は、インタプリタ型言語とコンパイラ型言語の明確な違いといえます。

インタープリタとコンパイラの融合

最近では、コンパイラ型言語とインタプリタ型言語は互いに融合し、利点と欠点を補いつつある

さて、これまでインタプリタ型言語とコンパイラ型言語の違いについて解説してきました。

しかし、最近では「インタープリタとコンパイラの利点欠点を補うために、それらが融合している例が多い」ことを知っておく必要があります。その最たる例が、『Java』や『C#』などの「VM上での動作を前提とした言語体系」の登場です。

「VM(Virtual Machine)」とは、「仮想マシン」のことで、JavaやC#(.Net Framework)が動作ターゲットとする仮想のコンピュータです。JavaやC#では、ソースコードをコンパイルすると、このVM上で動作する「中間コード」を生成します。

実はこの「中間コード」は、何を隠そう、インタプリタ型言語なのです。言うなれば、わざわざコンパイラでソースコードをコンパイルし、その結果をインタープリターで実行するという手順を取っているということです。これによって、インタプリタ型言語やコンパイラ型言語の欠点を補い、利点を最大化します。

インタプリタとコンパイラを組み合わせることで補われる欠点

  • インタプリタ型言語の欠点:静的型付けができない→コンパイラ採用で回避
  • インタプリタ型言語の欠点:動作速度が遅い→JIT技術を用いて回避
  • コンパイラ型言語の欠点:対話型環境がない→VMをインタプリタにすることで回避

動的型付けはコーディング自体は楽ですが、一歩誤ってしまうと実行時にしか不具合に気づきにくいという、最大の落とし穴があります。対して、静的型付けを用いると、プログラムのミスを実行前に気づけます。

また、JIT技術というのは「Just In Time」と呼ばれるものです。こちらは、「必要な時に」という意味です。こちらは基本的にはインタプリタで処理を実行しつつ、まとまった処理を実行する前に部分的にコンパイルしておき、必要な時にそのコンパイルされたプログラムを用いる方式です(≒必要な時だけコンパイルする)。

これにより無用な翻訳作業が減るため、インタプリタでありながらある程度の実行速度を確保できます。また、インタプリタは対話型環境を構築しやすいため、近年の開発には欠かすことのできない「デバッガー」や、デバッグ時の「イミディエイト機能」(デバッグ時に簡易的な対話≒イミディエイトを行う機能)などをコンパイラ型言語にも搭載できます。

コンパイラ型言語+インタプリタ型言語で、デバッグを行う例

  • Javaのデバッガー
  • C#と.Net Frameworkのデバッガー
  • gccとgdb(GNU DeBugger)

これらの方法により、インタプリタとコンパイラを融合することで、それぞれの利点を活かすことができるのです。

よく読まれている記事

1

Shellとは? Shellとは、人間の理解できる言葉を機会へ伝えるプログラムです。 Linux環境でコマンドプロンプト画面を開いているとき、常にShellは起動している状態です。 「Shell」とは ...

2

Linuxは主にサーバー用として利用されるOSです。大規模な基幹システムの開発者、ロボットや家電開発等の組み込み系エンジニア、ネットワーク機器やデータベースに携わるインフラエンジニアは触れることが多い ...

3

プログラミング言語を習得しようと思った時、必ずと言っていいほど候補として挙げられるのが「Java」というプログラミング言語です。 「Java」は、現在日本で最も使われている言語であり、非常に人気のある ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-エンジニアの知識