コンパイラ言語とは?インタプリタ・スクリプトとの違いやJITについても解説
公開日:2019.10.15
スキルアッププログラミング言語には、実行にコンパイル(コードを機械語に変換する作業)を必要とする言語としない言語の2つがあります。実行のたびにコンパイルする言語をインタプリタ型言語と呼ぶのに対して、事前に一括でコンパイルする言語をコンパイラ言語と呼びます。
ここでは、コンパイラ言語の特徴とメジャーなコンパイラ言語について解説していきます。
コンパイラ言語とは?
プログラミング言語をハードウェアが理解し、処理を実行するためには、機械語に翻訳(コンパイル)する必要があります。この作業を、インタプリタ言語の場合は処理を実行する直前に行いますが、コンパイラ言語の場合は、実行ファイルを作成するタイミングで行います。
たとえば、Aというプログラムがあったときの動作の処理例は以下のようになります。
コンパイラ言語の場合
AをコンパイルしたBというファイルを作成し、Bを実行することで処理を行います。
例:Aプログラム > コンパイル > ファイルB > 実行
- ※2回目以降は、すでにコンパイル済みのファイルBができているため、コンパイルの工程は省いて、ファイルBを実行するだけで処理結果が得られる
インタプリタ型言語の場合
Aを実行するタイミングで、1行ずつコンパイルを行いながら処理していきます。
Aプログラム > 1行ずつ翻訳 > 1行ずつ実行
- ※2回目以降も、毎回Aを実行し、1行ずつ翻訳を行って処理結果を取得していく
そのためコンパイラ言語は、処理を実行する直前に機械語への翻訳を行う必要がなく、インタプリタ型言語と比較すると実行速度が速いという特徴があります。また、事前にコンパイルしてしまうため、2回目以降の実行の際はコンパイル作業を省くことができます。
JIT(ジット)コンパイラ(Just-In-Timeコンパイラ = 実行時コンパイラ)
なおコンパイラ言語には、一括で完全にコンパイルするのではなく、コンパイルする部分と都度実行する部分をわけて行う、コンパイラ言語とインタプリタ型言語の中間のような処理を行うものもあります。それがJITコンパイラです。
JITコンパイラは、機械語ではない中間言語に一度変換した後、それを1行ずつ翻訳して実行する形をとります。JITコンパイラはOSやCPUに依存しないマルチプラットフォーム化したファイルを作成することができ、.NetworkやJavaなどで採用されています。
先の例と合わせると以下のようになります。
JITコンパイルの場合
Aというプログラムを一旦Cというファイル(中間言語)にコンパイルしておき、Cを実行します。
例:Aプログラム > JITコンパイル > ファイルC(中間言語) > Cを1行ずつ実行
- ※2回目以降はファイルCを1行ずつ実行する。
コンパイラ言語のメリット
事前にコンパイルを行うため、実行時の処理速度は他の形式の言語と比較して速く、CPUなどにかかる負荷も小さいのが特徴です。そのため、大量の処理や負荷が大きい処理を行う中規模以上のアプリケーションに採用される傾向があります。また、処理が早いということは消費電力なども抑えられるため、センサーなどの端末側で処理を行う組み込み系のシステムなどでも活躍しています。
コンパイラ言語のデメリット
しかし、最初にすべてをコンパイルする必要がある、ということはデメリットにもつながります。まず、インタプリタ型言語と異なり、気軽に実行してみるということが難しいといえます。また、コンパイルが終わるまでエラーが発生しているのかがわからないため、インタプリタ型言語と比較すると、単純なミスを見つける際、時間がかかる場合があります。
そのほか、コンパイル言語はインタプリタ型言語と比較すると習得には敷居が高い言語が多く、コンパイラをインストールする必要があるなど、開発に必要な環境を整える手間もかかる場合があります。
インタプリタ型言語・スクリプト言語の特徴と違い
コンパイラ言語と合わせてでてくる言葉に、インタプリタ型言語やスクリプト言語といったものがあります。ここでは、これらの違いについて解説していきます。
インタプリタ型言語の特徴と違い
定義があいまいなスクリプト言語は、インタプリタ言語と同義で使われることもありますが、「習得が比較的容易かつ簡単にプログラムを記述および実行できる」という特徴を持つプログラミング言語です。
習得と記述に容易な傾向があるものの、スクリプト言語も決して、複雑で高度な処理が行えない、というわけでありません。たとえば、Pythonなどは機械学習や深層学習、AI開発、Web開発の分野で多く起用されています。
メジャーなコンパイラ言語の紹介・事前コンパイル可能なインタプリタ言語も!
ここからは、開発現場で主流となっているコンパイラ言語を紹介していきます。インタプリタ言語にもかかわらず、事前コンパイル形式との併用が可能になった言語も併せて紹介します。
C / C++
高水準語として代表的な非常に古いプログラミング言語です。コンパイラを用いて機械語にコンパイルします。処理速度が高速であることや、メモリやCPUの操作など低水準語の分野もカバーするため、ロボット開発などの分野でも活躍する言語です。
習得の難易度は高いとされていますが、汎用性が高く、IoTなどのこれから増えていくであろう分野でも使用されるため、引き続き需要の高い言語といえます。
Go
Google社が開発した言語で、Cと同じく機械語にコンパイルします。幅広いプラットフォームでの実行が可能で、コンパイラ言語としては比較的プログラミングが容易であるのが特徴です。Webサーバの構築からアプリケーション開発まで多岐にわたる用途を持ち、C言語に劣らない高速な処理が可能です。
C#
マイクロソフトの提供するフレームワーク「.NET Framework」の一部であり、中間言語(Intermediate Language、IL)にコンパイルします。デスクトップアプリケーションのほか、マイクロソフト系列のWebアプリケーションはC#で記述されています。そのほか、Unityというゲームエンジンで採用されており、スマホアプリケーションの開発現場でも多く使用されています。
Java
Javaバイトコードと呼ばれる中間言語にコンパイルします。JavaバイトコードはJava仮想マシン(JVM(ジェーブイエム))上で実行される専用のコードです。JVMは、さまざまなプラットフォームの環境の相違を吸収することができるもので、家電や車載機器、モバイル端末、サーバマシンなどのさまざまな環境で実行が可能です。
Ruby:JITコンパイラ導入
インタプリタ言語として代表的な言語の一つですが、Ruby2.6.0でJITコンパイラが導入されました。JITコンパイラによってYARV(ヤルブ)(Yet Another Ruby VM)バイトコードと呼ばれる中間言語に変換し、実行時にはYARVを通して機械語に変換を行います。
これにより、Rubyの処理速度を格段に向上することができました。しかし、一部のフレームワークでは逆に処理速度が低下する例もあるため、使用をする際はしっかりとした調査が必要になります。
Python:JITコンパイラ使用可能
AI開発などで脚光を浴びたインタプリタ言語ですが、Numba(ナンバ)などのライブラリを使用することでJITコンパイラが使用可能になります。
NumbaはPythonのコードをLLVM(エルエルブイエム) (Low Level Virtual Machine = コンパイラ開発のためのソフトウェア)向けにコンパイルし、LLVMを使用して機械言語に変換することで、Pythonの処理を高速化します。ライブラリであるため、すべてのPython機能がサポートされているわけではなく、導入時には調査が必要な場合もあります。
PHP:JITコンパイラ導入?
WordPressを始めとした多くのWebアプリケーションで使用されているインタプリタ言語ですが、次世代となるPHP8ではJITコンパイラが導入される可能性が示唆されています。
- ※現時点ではまだJITコンパイラは導入されていません。
速度を重視したコンパイラ言語にもトライしてみよう!
処理速度が速いコンパイラ言語は大規模な開発の現場で多く用いられることから、大きな案件に参画する場合、経験が求められる可能性があります。習得が難しいとされることもあるコンパイラ言語ですが、将来性のある言語も多くあり、エンジニアとしてチャレンジする価値は高いでしょう。
ぜひこの機会に、コンパイラ言語に挑戦し、エンジニアとしてのキャリアパスを広げてみてはいかがでしょうか。
AKKODiSでは、コンパイラ言語の求人を多数取り扱っています。またAKKODiS(派遣・紹介予定派遣)の研修プログラム、AKKODiS Academyでは、コンパイラ言語のひとつであるJavaの研修プログラムも開設中!開発環境からクラス、メソッド、カプセル化までしっかり学習可能です。ぜひ一度ご確認ください。
(2019年10月現在)