STEP 3: プログラム’知識

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

IT入門シリーズ

🟢 STEP 1: ITの基礎を知る(ITとは何か?)
 📌 IT初心者が最初に学ぶべき基本知識。ITの概念、ネットワーク、OS、クラウドの仕組みを学ぶ。

🟡 STEP 2: PCの基本を知る(パソコンを扱えるようにする)
 📌 パソコンの基本操作を学び、Windows・Macの使い方や選び方を解説。

🔵 STEP 3: プログラミングの概念を理解する
📌 プログラムの仕組みやプログラミング言語の基礎を学ぶ。
├─ 【IT入門】プログラムって何?初心者向けにわかりやすく解説!
├─ 【IT入門】プログラムとスクリプトの違いとは?
├─ 【IT入門】インタプリタとコンパイラの違いは?網羅的に解説
├─ 【IT入門】シェルとシェルスクリプトの違いとは?シェルの種類について
├─ 【IT入門】アルゴリズムって何?基本の理解と活用方法
├─ 【IT入門】プログラミング言語とは?どんな種類がある?
└─ 【IT入門】初心者におすすめのプログラミング言語5選

🟣 STEP 4: IT技術の応用を学ぶ
 📌 システム開発、データベース、セキュリティなど、実践的なIT技術を習得する。

🔴 STEP 5: IT業界とキャリアを考える
 📌 IT業界の職種、エンジニアの働き方、キャリアパスについて学ぶ。

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

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

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

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

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

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

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

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

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

最新の技術同動向

JIT(Just-In-Time)コンパイルの普及により、インタプリタ型言語でも高速な実行が可能
JavaScriptエンジン(V8, SpiderMonkey)やPythonの「PyPy」はJITを活用し、高速実行が可能

コンパイラ型言語とは?

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

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

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

代表的なコンパイラ言語

    • C言語
    • C++
    • Objective-C
    • C#
    • Java
    • etc...

最新の技術動向

  • Ahead-Of-Time (AOT) コンパイルを採用する言語が増加(Rust, Swift)
  • WebAssembly(WASM)が登場し、ブラウザでの高速実行が可能に

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

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

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

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

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

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

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

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

  • 静的型付けが多い

インタプリタとコンパイラの比較

特徴インタプリタ型言語コンパイラ型言語
実行方法逐次解釈して実行コンパイル後に実行
実行速度遅い速い
デバッグ容易(コードを即時実行可能)コンパイル後のデバッグが必要
使用例スクリプト、Web開発大規模アプリケーション

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

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

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

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

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

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

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

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

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

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

しかし、最近では「インタープリタとコンパイラの利点欠点を補うために、それらが融合している例が多い」ことを知っておく必要があります。その最たる例が、『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)

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

実践的な選び方

プログラミング言語を選ぶ際には、開発の用途に応じてインタプリタ型かコンパイラ型かを考えることが重要です。

開発シチュエーション別の推奨方式

用途推奨言語理由
WebフロントエンドJavaScript (インタプリタ型)即時実行できるため、素早い開発が可能
システムプログラミングRust, C++, Java (コンパイラ型)高いパフォーマンスが求められる。JavaはGraalVMでAOTコンパイルが可能
データ分析・AIPython (JIT利用可)手軽にコードを書いて試せる
モバイルアプリSwift, Kotlin (AOTコンパイル)最適化された実行速度を提供

まとめ

  • インタプリタ型言語は「その場で解釈しながら実行」するため、開発スピードが速い
  • コンパイラ型言語は「事前に機械語へ変換」するため、実行速度が速い
  • JITやAOTの技術により、両者の境界は曖昧になりつつある
  • 用途に応じて最適な言語と方式を選択することが重要

技術の進化により、これまでの「インタプリタ型 vs コンパイラ型」の概念は変化しています。適切な方式を理解し、プロジェクトに最適な言語を選択しましょう。

【IT入門】アルゴリズムって何?基本の理解と活用方法

この記事を読んだら、次は 「【IT入門】シェルとシェルスクリプトの違いとは?シェルの種類について」 を読むのがおすすめです!

よく読まれている記事

1

IT入門シリーズ 🟢 STEP 1: ITの基礎を知る(ITとは何か?) 📌 IT初心者が最初に学ぶべき基本知識。ITの概念、ネットワーク、OS、クラウドの仕組みを学ぶ ...

2

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか?無料で使えるだけでなく、高い柔軟性 ...

3

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

-STEP 3: プログラム’知識