未経験者歓迎!知識ゼロからシステムエンジニアを目指す

インタプリタとコンパイラ

 

コンピュータでプログラムを実行する方法は大きく分けて二つあります。それは「インタプリタ」と「コンパイラ」です。

 

これらの違いを理解するにはまず、コンピュータに直接命令を与える「機械語(マシン語)」の概念を理解する必要があります。

 

そもそもコンピュータに搭載されるCPU自体は単なる計算機です。計算の際には電流の「オン」と「オフ」をもとにした「1」と「0」による2進数の計算しか出来ません。コンピュータは「1」と「0」の命令でしか動かないのです。

 

この2進数で書かれた命令の集まりを「機械語」と呼びます。

 

つまり、「機械語で与えられた命令でCPUが動く」ということが「プログラムが動く」ということなのです。「インタプリタ」と「コンパイラ」ではこの機械語を作る方法やタイミングに違いがあります。

 

インタプリタ

インタプリタはプログラミング言語で書かれたソースコード(=プログラム)を読み込んで、それを機械語に変換してコンピュータに命令を与えます。

 

プログラム実行時に変換する」、というところがポイントです。

 

実行時にその都度変換するわけですから、当然、時間が掛かります。また、実行時に変換するための仕組みが必要になります。「Basic」や「Perl」、「JavaScriptといった言語はインタプリタに分類されます。

 

コンパイラ

いっぽう、コンパイラはプログラミング言語で書かれたソースコードを事前に機械語へ「一括変換」して、変換語のプログラムがコンピュータに命令を与えます。「事前に変換する」というところがポイントです。

 

実行時に改めて変換する必要がないわけですから、高速で処理できます。また、実行時に変換するための仕組みも必要ありませんので、単独でプログラムを実行できます。

 

変換する仕組みのことを「コンパイラ」、変換する作業のことを「コンパイル」と呼びます。「C言語」や「C++」はコンパイラに分類されます。

 

Java言語

Java言語は「インタプリタ」と「コンパイラ」両方の側面を持っています。

 

ソースコードを事前に中間的なコードであるバイトコードに変換します。このバイトコードを仮想マシンと呼ばれる実行環境で動かすと、仮想マシンがバイトコードを機械語に変換してコンピュータに命令を与えるのです。

 

なぜこのような面倒なことをしているかというと、Java言語はどのプラットフォームでも実行できるようにするという思想で作られた言語だからです。プラットフォームとはプログラムを動作させるために必要なハードウェアやOSなどのことを指します。

 

インタプリタは「プログラム実行時にソースコードを機械語に変換する仕組み」さえあればどのプラットフォームでも動きますが、実行速度は遅いです。また、コンパイラは、異なるプラットフォームで動かす場合には、ソースコードをプラットフォームに合わせて変更して再度コンパイルし直す、いわゆる「移植」作業が必要となります。

 

それら両者のデメリットをなくすために、Javaでは仮想マシン上でバイトコードを動かすという方式を採用しています。

 

バイトコードは全プラットフォーム共通で、あとはプラットフォームごとの実行環境(=仮想マシン)が機械語への変換を行うようにすれば、バイトコードは1種類だけで済むのです。

 

バイトコードの実行方式

バイトコードの実行には以下の方式があります。

 

・バイトコードをインタプリタで逐次解析しながら、「JVM」という仮想マシン上で実行。
・バイトコードの読み込み時に、JITコンパイラがバイトコードを機械語にコンパイルして実行。

 

Javaの登場当初はインタプリタ方式で実行されていましたが、現在ではJITコンパイラの方が主流となっています。

 

バイトコードとJVM

コンピュータのOSには、Windows、MacOS、Linux、Androidなどがあります。これらいずれの環境でも動くプログラムを実現しようとすると、それぞれに対応したプログラムを組まなければなりません。コンパイラはOSやCPUごとに用意されていて、特定のコンパイラでコンパイルした実行プログラムは、他の環境では実行できないからです。

 

しかしそれでは、開発にかかるコストは大きくなってしまいます。

 

Javaでは、「バイトコード」と「JVM」の導入により、プラットフォームに依存しないプログラム開発ができるようになりました。Javaは、JVMがバイトコードを逐次解析しながら実行したり、JITコンパイラがバイトコードを機械語にコンパイルしてCPUに実行させるといった方式により実行されます。

 

つまり、JVMがコンピュータの違いを吸収してくれるため、ハードウェアやOSに依存しないプログラム開発ができるということです。

 

■次の記事
C言語

 

■おすすめ記事

PR


 このエントリーをはてなブックマークに追加 

PR


HOME スマホアプリ開発ブログ SE入門講座 プログラミングスクール フリーSE案件サイト SEおすすめ書籍