コンパイラとは?基礎知識やインタプリタとの違いをわかりやすく解説

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

プログラミングを学び始めると、「コンパイラ」という言葉を耳にする機会があります。しかしプログラミング初心者だとイメージしづらいため、お悩みの方も多いですよね。

プログラミングにおいて、コンパイラはとても重要な存在です。コンパイラとともによく使われる「インタプリタ」とあわせて、初心者のうちにしっかり理解しておく必要があります。

そこで本記事では、コンパイラの基礎知識やインタプリタとの違いについて解説します。プログラミング初心者でもわかりやすい内容のため、参考にしてください。

また、次の記事ではそもそもプログラミングとは何なのか、その特徴や仕組みを活用事例も交えて解説しているのでよければ参考にしてください。

プログラミングとは?仕組みや活用事例をわかりやすく解説

コンパイラとは

「コンパイラ」とは、人間が理解できる形(プログラミング言語)で記述されたプログラムを、コンピューターが理解できる「機械語」に翻訳する(コンパイルする)プログラムです。

「人間が理解できる形で記述されたプログラム」とは、たとえば下図のようなソースコードを指します。

プログラムの例

ソースコードの大部分は、英単語の組み合わせで表現されていますよね。そのため、プログラミングの知識がある人間なら、どんな処理が行われるのか理解できるのです。

一方で、コンピューターは上図のようなソースコードを理解できません。コンピューターでプログラムを実行させるためには、機械語への変換処理(コンパイル)が必要となります。

機械語とは

「機械語」とは、コンピューターが理解できるバイナリデータのことです。バイナリデータとは、「0」と「1」の2種類の数字だけで表現されるデータを指します。

ただし、すべてのバイナリデータが機械語というわけではありません。たとえば「JPEG」などの画像ファイルもバイナリデータですが、コンピューター上で表示するには専用の画像ソフトが必要です。

バイナリデータのほかには、テキストデータがあります。プログラミング言語は文字で記述されて、人間が読める文字列(テキストのソースコード)として、保存されているわけです。Webページで使われているHTMLファイルも、テキストデータといえます。

プログラミングにコンパイラが必要な理由

プログラミングにコンパイラが必要なのは、コンピューター上で動かせるプログラムを効率的に作成するためです。どんな優れたプログラマーでも、0と1だけの機械語ではプログラムを効率的には記述できません。

昔は機械語に近い形式で記述することもありましたが、ミスが発生しやすく効率が悪いものでした。そのため現代では、人間が理解できる「プログラミング言語」で記述してからコンパイラで変換する、という手順を踏むのです。

日本語や英語といった話し言葉がいろいろとあるように、プログラミング言語にもさまざまな種類があります。プログラミング言語の種類が変われば、使えるコンパイラも変わります。

コンパイラがソースコードを機械語に変換する仕組み

コンパイラがソースコードを機械語に変換するためには、いくつかのステップを踏む必要があります。大まかには、次の5ステップです。

  • 1. 字句解析
  • 2. 構文解析
  • 3. 中間コード生成(言語による)
  • 4. 最適化
  • 5. 機械語プログラム生成

1つずつ、順番に解説します。ただしコンパイルの方法は多種多様で、コンパイラによっては上記とは少し異なる場合もあります。

ステップ1:字句解析

「字句解析」とは、ソースコードを1文字ずつチェックし、プログラムの構成要素(トークン)を解析する手続きです。ソースコードのどこに、どのような要素があるのかを把握する目的があります。

冒頭のソースコードを見ても、英単語だけでなくカッコやピリオドといった、複数の要素がありますよね。プログラムを構成する主な要素は、下表のとおりです。

要素名概要・例
予約語プログラムの制御など、特別な意味を持つキーワード
例)if   for
識別子プログラマーが変数などに付ける任意の名前
リテラル数字や文字列などの具体的な値
例)123    "SAMURAI"
演算子四則演算などの演算を行うもの
例)+   =
セパレータ要素と要素を区切るもの
例){ }   < >

プログラムの主な構成要素

ステップ2:構文解析

「構文解析」とは、いくつかの要素がまとまりになっている「構文」を探し、それらの構造を解析する手続きです。たとえば、「1」「+」「2」という3要素のまとまりがあった場合、「1に2を加算する」という演算の構文になっています。

このような要素間の関係性を把握して、「構文木」と呼ばれるツリー構造にして整理します。そうすることで、プログラムをどう変換すればよいかコンパイラが判断しやすくなるのです。

ステップ3:中間コード生成(言語による)

プログラミング言語によっては、構文解析で整理したソースコードから「中間コード」を生成します。中間コードを生成しない言語の場合は、そのままステップ4に進みます。

中間コードとはその名のとおり、プログラミング言語で記述されたソースコードと、機械語の中間にあたるコードです。

機械語のプログラムは、コンピューターのCPUやOSに合った形式でなければ実行できません。とはいえ、実行環境ごとに異なる機械語プログラムを用意するのでは大変です。

その点中間コードであれば、実行環境が変わっても同一ファイルを共用できます。「仮想マシン(VM)」と呼ばれるプログラムが実行環境を判断して、中間コードをそれぞれのコンピューターに合った命令に変換してくれるためです。

中間コードを生成する主なプログラミング言語としては、「Java」が挙げられます(詳細は後述)。

ステップ4:最適化

「最適化」とは、ソースコードの無駄な部分を効率化する手続きです。最適化することでプログラムの高速化や、使用するメモリ(データ領域)の節約といったメリットがあります。

たとえば、結果が決まっている「1 + 1」という演算があれば「2」に置き換えるのも、一種の最適化です。最適化のバリエーションは多岐にわたり、コンパイラによっても異なります。

なお、中間コードを生成するプログラミング言語の場合は、実行時に仮想マシンが最適化も行います。

ステップ5:機械語プログラム生成

最適化されたコードから、コンピューターが理解できる機械語プログラムを生成します。中間コードを生成するプログラミング言語だと、この処理が行われるのは実行時です。

機械語プログラムを生成するときには、コードの実行順序や、「レジスタ割り当て」を決めます。レジスタ割り当てとは、CPU内の「レジスタ」と呼ばれるデータ領域にプログラムのデータを効率的に割り当てることです。

レジスタは高速処理が可能なものの、ごく限られた領域しかありません。プログラムの処理速度を高めるために、レジスタの使い方を事前に決めておく必要があるのです。

コンパイルとビルドの違い

コンパイルと混同されやすい言葉に、「ビルド」があります。それぞれの違いについて、詳しく解説します。

ビルドは「コンパイル+実行ファイル生成」

ビルドは、コンパイルに加えて機械語プログラムの「リンク」を行い、実行ファイルを生成する手続きです。

コンパイラはファイルごとに変換処理を行うため、基本的に複数の機械語プログラムファイルが生成されます。しかし、それらの関連性がわからないと、1つのプログラムとしては動かせません。

機械語プログラムファイルやライブラリ(汎用的な共通プログラム)をまとめて、1つの実行ファイルを作る手続きがリンクです。ビルドで生成された実行ファイルは、画面に表示されたファイルをダブルクリックするなどで簡単に実行できます。

なおプログラミングに使われる開発環境の多くは、機能としてビルドを提供しています。コンパイルとリンクを別々に行うよりも、ビルドで一連の処理を通して実行した方が、操作の手間が少ないためです。

コンパイルは「機械語プログラム生成まで」

先ほど紹介した5ステップからもわかるとおり、コンパイルは多くの場合「機械語プログラム生成まで」を指します。つまりコンパイルは、ビルドにおけるプロセスの一部です。

プログラムを実行ファイル化するためには、リンクが別途必要です。ビルドの方が手軽ですが、個別にコンパイルすることで、リンクするライブラリを独自に設定しやすいなどのメリットもあります。

なおコンパイラによっては、コンパイルの中にリンクが含まれる場合も。代表的なコンパイラとしては、オープンソースソフトウェアプロジェクトGNU(GNU is Not Unix)が提供する「GCC(the GNU Compiler Collection)」が挙げられます。

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

ソースコードを機械語に変換するものは、コンパイラのほかに「インタプリタ」もあります。それぞれの違いやメリット・デメリットについて、詳しく解説します。

コンパイラは「一括翻訳型」

コンパイラはいわば「翻訳家」、外国語で書かれた本をまとめて日本語に翻訳するイメージです。下図における赤枠部分のソースコードを、1回のコンパイルでまとめて機械語に変換します。

コンパイラの変換対象

コンパイラはあくまでコンピューターが理解できる形に変換することが目的のため、プログラムの実行はともないません。実行前にプログラム全体を最適化できるため、処理性能の高い実行プログラムを作れるのがメリットです。

プログラムが間違っているとコンパイルでエラーが発生し、正しい変換が行われません。エラーの原因を見つける必要があることや、プログラムを書き換えるたびにコンパイル作業が発生することがデメリットです。

インタプリタは「逐次翻訳型」

一方の「インタプリタ」はいわば「同時通訳者」、話し言葉を1文ずつリアルタイムに翻訳していくイメージです。プログラムを実行しながら、下図の赤枠部分のようにソースコードを1行ずつ機械語に変換します。

インタプリタの処理

インタプリタの場合は、プログラムを書き換えた後にそのまま実行が可能です。コンパイラのように、事前にエラーを解決しなくてもプログラムの動作を確認できるメリットがあります。

もちろん、プログラムに問題があっても良いわけではありません。実行する1行のプログラムに文法ミスなどがあれば、下図のようにエラーとなって実行が途中停止されます。

エラー参考例

デメリットは、プログラムの処理性能がコンパイラに比べて低くなりやすい点です。1行のソースコードを実行するたびに変換処理が発生するため、速度面ではコンパイルした実行ファイルには及びません。

また、プログラム全体をあらかじめ最適化できないため、メモリの使用量もコンパイルした実行ファイルより多くなりがちです。

コンパイラ型言語とインタプリタ型言語の主な種類

コンパイラ型言語とインタプリタ型言語の主な種類

ソースコードを機械語に変換する方法は、基本的にはプログラミング言語によって決まります。ここでは、代表的なコンパイラ型言語・インタプリタ型言語をそれぞれ紹介します。

プログラミング言語の基礎知識について詳しく知りたい方は、次の記事を一読ください。

プログラミング言語とは?種類別の特徴やできることをわかりやすく解説
更新日 : 2022年5月12日

コンパイラ型言語の主な種類

主なコンパイラ型言語を、一覧表にまとめました。各言語の解説記事もリンクしているため、ぜひ参考にしてください。

言語名主な用途
C言語組み込みシステム
C++組み込みシステム/ゲーム
C#Windowsアプリ/ゲーム
Java業務システム/Androidアプリ/Webアプリ(バックエンド)
Objective-CMacアプリ
SwiftMacアプリ/iOSアプリ
KotlinAndroidアプリ

主なコンパイラ型言語

特にポピュラーなものは、歴史の長い「C言語」や「Java」です。C言語は、電子機器を制御する組み込みシステム開発で人気の言語で、コンパイラ自体の開発に使われることもあります。

先ほども登場したJavaは、非常に汎用性が高いプログラミング言語です。「JVM」と呼ばれる仮想マシンが、中間コードを実行時にそれぞれのコンピューターに合った命令に変換することで、幅広い環境で動作します。

最近では、スマホアプリ開発に使われる「Swift」や「Kotlin」の人気も高まっています。これらの言語は、他言語の長所を取り入れた「モダン」(現代的)な言語で、無駄のないソースコードを書けるのが魅力です。

コンパイラ型言語がよく使われる開発分野には、次のような2つの共通点があります。

  • 処理性能が重視されやすい(組み込みシステム・業務システム)
  • プログラムを更新できるタイミングが限定的(パソコンアプリ・スマホアプリ)

パソコンアプリやスマホアプリは、ユーザーにインストールしてもらう必要があるため、頻繁にプログラムの更新を行えません。限られたタイミングで高品質なアプリを提供するために、処理性能の高いプログラムを作れるコンパイラ型言語が使われやすいのです。

インタプリタ型言語の主な種類

続いて、主なインタプリタ型言語も一覧表にまとめました。

言語名主な作れるもの
JavaScriptWebアプリ(フロントエンド)
PHPWebアプリ(バックエンド)
RubyWebアプリ(バックエンド)
Python人工知能/Webアプリ(バックエンド)

主なインタプリタ型言語

インタプリタ型言語は、少ない手間でプログラムを実行できるため実践学習がしやすく、その多くが初心者にも人気の言語です。

コンパイラ型言語の場合、プログラムを更新するたびに変換後のファイルも更新することになり、管理が大変です。そのため少ない手間でプログラムのメンテナンスが行える、インタプリタ型言語が好まれます。

なおWebアプリのプログラムは、大きく分けると「フロントエンド」「バックエンド」の2種類です。フロントエンドのプログラムはユーザーのWebブラウザ上で動作し、バックエンドのプログラムはWebサーバー上で動作します。

インタプリタ型言語とスクリプト言語の違い

インタプリタ型言語は、往々にして「スクリプト言語」と呼ばれますが、厳密には意味が異なります。スクリプト言語とは、プログラムを容易に記述できるように作られたプログラミング言語の総称です。

前章で紹介した主なインタプリタ型言語は、いずれも文法が比較的シンプルな言語。初心者でもプログラムを記述しやすいため、混同されやすいのです。

まとめ

今回はコンパイラに関して、下記の5点をお伝えしました。

  • コンパイラとは
  • コンパイラがソースコードを機械語に変換する仕組み
  • コンパイルとビルドの違い
  • コンパイラとインタプリタの違い
  • コンパイラ型言語とインタプリタ型言語の主な種類

コンパイラとインタプリタは、ソースコードを機械語に変換する代表的な方法です。それぞれ一長一短のため、どちらかが決定的に優れているわけではありません。

それぞれの違いを理解して、プログラミング学習に役立ててください。

この記事のおさらい

コンパイラとは何?

人間が理解できる形で記述されたプログラムを、コンピューターが理解できる「機械語」に変換するのがコンパイラです。機械語は、「0」と「1」の2つの数字だけで表現されます。

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

コンパイラはプログラム全体をまとめて機械語に変換しますが、インタプリタはプログラム実行時に1行ずつ機械語に変換します。メリット・デメリットについては、本記事を参照してください。

挫折しないプログラミングスクールNo.1
侍エンジニア

✔ 目的に合わせたオリジナルカリキュラム
✔ 現役エンジニアによる専属マンツーマンレッスン
✔ あなただけのオリジナルサービス開発
✔ 挫折させない充実のサポート
✔ 教材の数は40種類以上
✔ 受講実績28,000人以上
✔ 転職成功率98%

詳しくはこちら

侍エンジニアは「人生を変えるプログラミング学習」をコンセンプトに、過去多くのフリーランスエンジニアを輩出したプログラミングスクールです。プログラミングに役立つ情報や有用な情報を発信していきます。
サービスページはこちら

あなたの目的に合わせた
SAMURAI ENGINEERの運営サービス

SAMURAI ENGINEER Pro

未経験でも挫折しないプログラミングスクール

詳細はこちら

SAMURAI TERAKOYA

日本最大級のサブスク型オンラインITスクール

詳細はこちら

SAMURAI ENGINEER Freelance

「一人で稼げる」スキルを身につける

詳細はこちら
Close