コンパイラとは何か?インタープリタとの違いとコンパイルの流れを解説

2021年1月28日

コンパイラの概要

コンパイラとは「コンパイル処理を行うソフトウェア」のことです。
コンパイルとは、人間用の言語で書かれたプログラムを機械用の言語に変換する処理を指します。

プログラミングする時、C言語やJavaなどのプログラミング言語を使用することがあります。これらのプログラミング言語は「高水準言語」「高級言語」と呼ばれる種類のものです。
これらのプログラミング言語により人間はプログラムを理解することができますが、0と1の処理を主とする機械はこれらの言語を直接理解できません。
そのため、機械が理解できる「低水準言語」に変換する必要があります。この変換する処理のことを「コンパイル」と呼び、これを行うためのソフトウェアが「コンパイラ」です。
コンパイル方式のことを別名で「一括翻訳型」と呼ぶこともあります。

コンパイル方式とインタープリタ方式との違い

コンパイル方式のメリット

「一括翻訳型」と呼ばれるコンパイル方式は、ソースコード全体を一度書き出した上で機械語への翻訳を行います
この書き出しの際にループ処理などの最適化を行うため、最終的な実行速度が速くなります。
これにより、コンパイル方式は他の翻訳方式よりも高速で行えるというメリットがあります。

他の翻訳方式に「逐次翻訳型」と呼ばれるインタープリタ方式があります。
これはコンパイルとは違い、ソースコードを1行ずつ都度翻訳し、実行するというものです。
1行ずつソースを追うことができるためエラーなどを発見しやすいというメリットがありますが、その分ループ処理なども1行ずつ実行するため、コンパイラに比べて時間がかかるというデメリットがあります。

代表的なコンパイル型言語として「C」や「C++」、代表的なインタープリタ型言語として「Ruby」や「JavaScript」があります。

さらに別の翻訳方式に「中間言語方式」があります。これはソースコードを人間語と機械語の中間言語に翻訳し、実行する手法です。

以上がソースコードの大まかな翻訳方式で、開発するシステムや使用する言語によって翻訳方式を使い分けることが多いと言えます。

コンパイル方式の留意点

高速で行えるコンパイル方式ですが、インタープリタ方式と比較すると「バグの発生箇所を見つけづらい」という点があります。
1行ずつ実行するインタープリタ方式ではバグが起きたまさにその行を確認することができますが、コンパイル方式ではすべて実行した後に「どこかにバグがありエラーが起きた」という結果が返ってきます。
その際はソースコードを1行ずつ確認し、バグのある箇所を確認しなければなりません。

このように、翻訳方式にはそれぞれ特徴とメリットがあります。
それぞれの特徴を押さえた上で開発に取り組むといいでしょう。

コンパイルの流れ

コンパイルは主に「字句解析」「構文解析」「中間コード生成」「最適化」「コード生成」という流れで行います。

  • コンパイルの流れ
    • 字句解析
    • 構文解析
    • 中間コード生成
    • 最適化
    • コード生成

「字句解析」ではソースコードの全体を大まかに確認します。この時コンパイラは、プログラムを識別子や演算子などの単位で確認しています。これはプログラムの中では最小の文字列の単位であり、「字句(トークン)」と呼ばれています。
次に「構文解析」で構文の構造を把握し、処理を命令ごとにまとめます。
「中間コード生成」は構文解析で解析した構造をもとに、一連の単純な命令を作るものです。
そして作られた中間コードを「最適化」します。この時にデータの流れやループを最適化し、実行時間が短くなるように編集を行います。
最適化したものをさらに「コード生成」し、ここでコード全体がようやく機械語として翻訳されます。
これらの処理を行うソフトウェアがコンパイラです。
英語で"compile"とは「資料をまとめて編集する」という意味がありますが、これらの処理をまとめて行うことから、「コンパイル」という名前がついています。

参考