プログラミング言語は、その実行方法を大別して「インタプリタ型言語」と「コンパイラ型言語」と言う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)
これらの方法により、インタプリタとコンパイラを融合することで、それぞれの利点を活かすことができるのです。