コンパイラ言語とインタプリタ言語の違い・メリットをわかりやすく解説!
こんにちは!
現役Webエンジニアの今井(@ima_maru)です。
今回は、「コンパイラ言語」と「インタプリタ言語」についての解説記事になります。
具体的には、以下のようなことが書かれています。
- コンパイラとインタプリタとは何か
- コンパイラ言語とインタプリタ言語とは何か
- それぞれの特徴やメリット/デメリット
- それぞれの代表的な言語
これら二つは「プログラムをどう実行していくか?」という実行型についての言語の定義で、よく対比される関係にあります。(スクリプト言語とは少し違う)
名称 | コードの実行方法 |
---|---|
コンパイラ言語 | 一度すべてのコードを機械語に翻訳してから実行する |
インタプリタ言語 | コードを一行一行機械語に※翻訳しながら実行していく |
また、これらの言語には開発においてのメリットデメリットが存在します。
名称 | メリット | デメリット |
---|---|---|
コンパイラ言語 | 実行速度が速い | 実行するまでがめんどう |
インタプリタ言語 | コードの修正が楽 | 実行速度が遅い |
それでは詳しく解説していきます。
【前提】プログラミング言語をコンピュータは直接理解できない
まず前提として、プログラミング言語は人間が機械語(マシン語)を生成するために用いるツールです。
なので、これらのプログラミング言語で書かれたコードは、人間にはある程度分かりやすくても、コンピュータには全く理解できない文字列なのです。
コンピュータが理解できるのは、「0」と「1」で書かれた「機械語」と呼ばれるものです。
最終的には、プログラミング言語で書かれたコードも機械語に翻訳されてから実行されています。
コンピュータは「0」か「1」しか実行できないのです。
そのため最終的には機械語にしてあげないといけません。
そして、今回の解説する「コンパイラ」と「インタプリタ」はどちらも、翻訳の役割を担うソフトウェアです。
つまり、「コンパイラ」と「インタプリタ」は、プログラミング言語で書かれたプログラムを、コンピュータがそのまま実行できる機械語に翻訳するためのツールということです。
これらどちらを使うかによって、コンパイラ言語、インタプリタ言語と呼ばれるのです。
余談ですが、「コンパイラ」「インタプリタ」とは別に、「アセンブラ」と呼ばれる翻訳機を使うプログラミング言語も存在します。
これが「アセンブリ言語」と呼ばれる言語です。
コンパイラ言語とインタプリタ言語の違い
コンパイラ言語とインタプリタ言語の違いは、プログラムの実行方法と翻訳のタイミングにあります。
コンパイラ言語は、プログラミング言語で書かれたコードを「コンパイル」という処理で実行可能な機械語に一括翻訳して、その機械語を実行することでプログラムを機能させます。
一方、インタプリタ言語は、プログラミング言語で書かれたコードを一行読んでは機械語に翻訳し実行、また一行読んでは翻訳し実行という逐次翻訳の手法でプログラムを機能させます。
名称 | コードの実行方法 |
---|---|
コンパイラ言語 | 一度すべてのコードを機械語に翻訳してから実行する |
インタプリタ言語 | コードを一行一行機械語に翻訳して実行していく |
どのタイミングで機械語に翻訳して実行するかというのが、この2つの言語を知るためのポイントになってきます。
コンパイラ言語の仕組み「一括翻訳型」
プログラミング言語で書かれたプログラム(ソースコード)を、コンピュータが直接的に実行できるコード(機械語)に全て翻訳してからプログラムを実行するプログラミング言語です。
こちらの例はC++という言語を使います。
#include <iostream>
using namespace std;
int factorial(int number)
{
int result = 1;
for (int i = 1; i <= number; i++)
result *= i;
return result;
}
int main()
{
cout << "Hello, World!!" << endl;
cout << "5の階乗=" << factorial(5) << endl;
}
このようなソースコードを一度コンパイラというものに通します。(このことをコンパイルと呼ぶ)
コンパイラとは、このソースコードを機械語に翻訳してくれるツールです。
コンパイルをすると、このようなファイルが生成されます。
このファイルこそ、コンパイラがソースコードから生成した機械語のプログラムなのです。
先ほどのソースコードの原型はなく、「0」「1」の羅列というコンピュータがそのまま実行可能なデータになっています。
(VisualStudioなどの総合開発環境に任せている場合でも、実はこのようなファイルが生成されています。)
このファイルを黒いコンソール画面などで実行すれば結果が返ってきます。
Hello, World!!
5の階乗=120
これがコンパイラ言語のプログラムの実行方法です。
- プログラミング言語でプログラムを書く
- コンパイラでコンパイルする(機械語の実行可能ファイルが生成される)
- 実行可能ファイルを実行する
次は、インタプリタ言語を見ていきましょう。
インタプリタ言語の仕組み「逐次翻訳型」
プログラミング言語で書かれたプログラム(ソースコード)を、コンピュータが直接的に実行できるコード(機械語)に逐次翻訳しながらプログラムを実行していくプログラミング言語です。
例としてPythonの対話型インタプリタをあげましょう。
↓のように問いに対して1対1で答えが返ってきます。
>>> print ("Hello, World!!")
Hello, World!!
>>> def factorial(num) :
... result = 1
... for i in range(num):
... result *= i + 1
... return result
>>> print("5の階乗=" + str(factorial(5)))
5の階乗=120
このようにひとつコードを打って実行。
もうひとつコードを打って実行とできるのがインタプリタ言語の特徴です。
その翻訳を担っているのが「インタプリタ」という翻訳機なわけですね。
これがインタプリタ言語のプログラムの実行方法です。
- プログラミング言語でプログラムを書く
- プログラムを機械語に一行一行翻訳しながら実行していく
このようにコンパイラ言語とインタプリタ言語の違いは、「一括で全て機械語に翻訳するか」「一回一回機械語に翻訳しながら実行していくか」という点です。
この違いが、プログラミングにおいてどのような影響を及ぼすのでしょうか?
コンパイラ言語とインタプリタ言語それぞれのメリット・デメリットを紹介
コンパイラ言語とインタプリタ言語の実行方法や翻訳タイミングの違いがわかったでしょうか。
次は、実際にプログラミング言語としてどちらが優れているのかや、プログラミングしていてどのような点で違いが表れるのかなどについてみていきましょう。
コンパイラ言語のメリットとデメリット
コンパイラ言語は、「実行速度が速い」「実行時にコンパイラはいらない」というメリットを持つ反面、「いちいちコンパイルが面倒」「プログラムのデバッグがしづらい」というデメリットを持っています。
メリット①:実行速度が速い
コンパイラ言語は、インタプリタ言語に比べて実行速度が速いという特徴があります。
それは、実行時に翻訳が必要ないからです。
実行時、インタプリタ言語はプログラムから機械語への翻訳を必要としますが、コンパイラ言語はすでに翻訳された機械語を読み込むだけで良いので、翻訳にかかる処理分だけコンパイラ言語が速く実行できるというわけです。
例えていうと、日本語に翻訳された本を読むか、アラビア語の本を1行1行日本語に翻訳しながら読むかの違いです。
明らかに前者のほうが読むスピードは速いですよね。
実行速度が重要になる「科学技術計算のライブラリ」や「大規模システムの開発」などにはもってこいでしょう。
メリット②:実行時にコンパイラが必要ない
コンパイラ言語は、一度すべてのソースコードを機械語に翻訳します。
機械語は「実行可能ファイル」、つまりコンピューターがそのまま実行できるファイルとなるので、実行時にはコンパイラといった特別なソフトウェアを必要としません。
例えば、有名なフリーホラーゲームの『青鬼』は「.exeファイル」(実行可能ファイル)で配布されているため、ゲームをプレイする側はコンパイラなどは必要なくそのまま実行できますね。
要は、実行可能ファイルを作れるっていうのがポイントです。
デメリット①:いちいちコンパイルが面倒くさい
コンパイラ言語は、プログラムを実行するために1回1回のコンパイルが必要になります。
インタプリタ言語を使ったことがある方からすると、少しめんどくさいと感じると思います。
デメリット②:プログラムのデバッグがしづらい
コンパイラ言語は、デバッグなどのプログラムを途中で確認する作業がしづらいという点があげられます。
「いきなりエラーが何か所にも出て大混乱!」なんてこともあります。
この話についてとあるサイトで良い表現があったので引用します。
作りながらデバッグを行うインタプリタ方式か、完成後に不具合を修正するコンパイラ方式かで開発状況も違ってきます。
パーソルテクノロジースタッフ
インタプリタ言語のメリットとデメリット
インタプリタ言語は、「プログラムをすぐに実行できる」「プログラムのデバッグがしやすい」というメリットを持つ反面、「実行速度が比較的遅い」「実行時にインタプリタが必要」というデメリットを持っています。
メリット①:プログラムをすぐに実行できる
インタプリタ言語は、プログラムを一行一行すぐに実行できるという特徴を持っています。
いちいちコンパイルする時間が省けるのは大きなメリットで、サクッと開発ができる生産性が売りですね。
メリット②:プログラムのデバッグがしやすい
インタプリタ言語は、コンパイラ言語に比べデバッグなどのプログラムの確認・修正が行いやすいです。
その理由としては、プログラムを書き換えた後にすぐに実行できるという点が大きいでしょう。
デメリット①:実行速度が比較的遅い
コンパイラ言語と違い、プログラムを実行するために一回一回機械語に翻訳する処理が必要なため、その時間分実行速度が遅くなります。
その結果、コンパイラ言語より実行速度が劣るというデメリットがあげられます。
ですが、今はコンピュータの性能や言語仕様などによってそこまで差がなくなってきたので、ゴリゴリに実行速度を出したい場合以外は気にしなくてもよいでしょう。
デメリット②:実行時にインタプリタが必要
インタプリタ言語は、実行時にそのプログラミング言語のインタプリタが必要になります。
デメリットというほどでもないですが、実行可能ファイルのみを配布するといった使い方はできませんね。
コンパイラ言語とインタプリタ言語、結局どっちがいいか?
コンパイラ言語とインタプリタ言語はどっちがいいかと聞かれたら私はこう答えます。
「状況によって変わる」
これがベストアンサーだと思います。
その理由は、コンパイラ言語のほうが活躍する分野もあれば、インタプリタ言語のほうが活躍する分野もあるからです。
例えば、高速なアルゴリズムを組んで処理をできるだけ速くしたいのならば、コンパイラ言語のほうが実行速度が速くて良いと思いますし、小規模プロジェクトで開発スピードが命ならばインタプリタ言語のほうが生産性が高くて良いと思います。
そんなこんなで、適する場面は変わってくるわけで、あなたがどの言語を学ぼうか迷っているならば、まず自分が何をやりたいかを見つけることのほうが圧倒的に重要です。
その業界で多く使われている言語はそれなりの理由があります。そしたらコンパイラかインタプリタかなんて言うほど関係ありません。
コンパイラ言語とインタプリタ言語の定義、実は曖昧です。
実は、コンパイラ言語とインタプリタ言語という単語は便宜上このように呼ばれているだけであって、厳密には定義が存在しないといってもよいでしょう。
というのも、プログラミング言語によってはコンパイル方式でもインタプリタ方式でも実行することができるからです。
そしたら、「コンパイラ言語なの?」「インタプリタ言語なの?」ってなりますよね。
なので、主に使われる方式によって呼ばれ方が決まっているという解釈でよいかと思います。
解釈としては、以下のようになります。
コンパイラ言語:「主に」コンパイル方式の実行方法をとるプログラミング言語
インタプリタ言語:「主に」インタプリタ方式の実行方法をとるプログラミング言語
インタプリタ言語のインタプリタは「翻訳」ではなく「解釈」をしている
本記事では便宜上、コンパイラもインタプリタもプログラミング言語で書かれたコードを機械語に「翻訳」すると言いましたが、インタプリタにおいては「翻訳」ではなく「解釈」という言葉が当てはまります。
(大したことではないので、そこまで気にすることではありません。)
これ以降の話は少し難しくなってしまいますが、インタプリタの仕組みまで理解したいという方は以下の記事を見たり、「インタプリタ 仕組み」などと検索してみたりすると良いでしょう。
コンパイラ言語とインタプリタ言語の代表例
インタプリタ言語やコンパイラ言語の代表例としていくつかプログラミング言語を挙げてみます。
コンパイラ言語の代表例
3D/VR/Windowsなどに強い「C#」
歴史が長く実行速度がとても速い「C/C++」
処理速度の速いサーバーサイド言語「Go」
実行速度/並行性/安全性を兼ね備えた「Rust」
インタプリタ言語の代表例
Webサイト開発に欠かせない「JavaScript」
人工知能(AI)の分野に強い「Python」
日本人が開発したWeb系に強い「Ruby」
Web開発に特化している「PHP」
コンパイラ言語はネイティブ系に強くて、インタプリタ言語はWeb系に強い印象ですね。
コンパイラ言語とインタプリタ言語の違い・メリット|まとめ
「コンパイラ言語」と「インタプリタ言語」についてみてきましたが、どうでしたでしょうか。
学習難易度はコンパイラ言語のほうが高いと思います。
私はC言語(コンパイラ言語)から学びましたが、コンパイルの際にエラーがいっぱいでて困ることが多々ありました。
それゆえに、多くのことを学べたんですけどね。
はじめにコンパイラ言語を学ぶのも全然いいと思います。
つまづいたときは、学習難易度が比較的低いインタプリタ言語に切り替えるのも手だと思います。
記事を書いて思ったのですが、いまはインタプリタやコンパイラなどと言って区別しなくてもいい時代だと思いました。
知っていて損はないですが、いろいろな開発環境があり気にしなくてもよいレベルになりました。
それに関連しているワードですが、「中間言語」「JVM」「JIT」という言葉がありますので、気になる方はぜひ調べてみると良いでしょう。
以上「コンパイラ言語とインタプリタ言語の違い・メリットをわかりやすく解説!」でした!
最後まで読んでいただきありがとうございます。