こんにちは、京大生ブロガーのゲーテ(@goethe_kyodai)です。
プログラミング言語は大まかにコンパイラ言語とインタプリタ言語の二つに分かれますが、コンパイラ言語とインタプリタ言語の違いをプログラミングと無縁な人でもわかるように説明します。
目次
まずコンピュータはどうやってプログラムを理解しているの?
コンピュータはどうやってこんなプログラム(ソースコード)を理解しているでしょうか?
図1
コンピュータというのは、上の形のままプログラムを理解しているわけではありません。
コンピュータは原理的に0と1しか理解できないため、下のような0と1の羅列に直してもらわないと理解できません。
図2
このコンピュータが理解できる0と1の羅列をマシン語(機械語とも言う)と言います。
プログラムを実行するとき、コンピュータに理解してもらうために、図1のソースコードを図2のようなマシン語に変換してやる必要があります。
そしてコンパイラ言語とインタプリタ言語ではその変換の仕方に違いがある んです。
コンパイラ言語
コンパイラ言語は、実行前にプログラムをまとめてマシン語に変換します。
プログラムをマシン語に変換するのがコンパイラというソフトウェアです。変換することをコンパイルと言います。
ここでプログラミングをやる上で知っておきたいのは、コンパイラには種類があってその種類ごとに変換の方法が違う 、ということです。
変換の方法が違うので、同じソースコードでも、あるコンパイラを使ったらエラーが出ないのに、違うコンパイラを使ったらエラーが出ることがあるので注意です。
コンパイラ言語で有名なのはCやC++です。古いですがCOBOLやFORTRANもコンパイラ言語です。
インタプリタ言語
コンパイラ言語は、実行前に全部まとめてプログラムをマシン語に変換しますが、
インタプリタ言語は、実行時に一行ずつプログラムをマシン語に変換します。
コンパイラ言語は実行前にマシン語に変換してしまうので、それと比べると、インタプリタ言語は実行時に変換という作業をしなければいけない分、コンパイラ言語より実行時間が遅いです。
インタプリタ言語は、一行一行実行するのでエラーも一行一行チェックできます。なので、一括変換されるコンパイラ言語よりバグ取りがしやすいです。
インタプリタ言語で有名なのはPerlやPHPです。
Java
ここは本題からちょっと逸れた、しかもちょっと込み入った話をします。飛ばしてもらってもかまいません。
はじめに、「プログラミング言語は大まかにコンパイラ言語とインタプリタ言語に分かれる」と言いましたが、どちらにも属さないプログラミング言語がJavaです。
Javaはコンパイラ言語とインタプリタ言語の両方の良いところを取ったみたいな言語です。
Javaでは、まずプログラムを橋渡し的なコードである、バイトコードというものに変換します。
そして仮想マシンという環境で、そのバイトコードをマシン語に変換し、実行します。
なんでこんなめんどくさいことをやるかというと、どんなプラットフォームでも速く実行できるようにするためです。
プラットフォームというのはなんなのでしょうか?
まず、プログラムはハードウェアとOS上で実行されます。
そしてプラットフォームというのは、そのプログラムを実行するハードウェア(パソコン本体)やOS(WindowsやMac)のことです。
下図のように、ハードウェアとOSという土壌がないとプログラムは実行できません。
コンパイラ言語では、同じことをやるプログラムを書くにしても、違うプラットフォーム(OS、ハードウェア)では、違うソースコードが必要です。
というのは、コンパイラはプラットフォームに合わせて作られてるからです。
プラットフォームAにはコンパイラAが、プラットフォームBにはコンパイラBが、というようにプラットフォームごとにコンパイラが違います。
そしてソースコードはコンパイラに合わせて書かなければいけないので、コンパイラが違えばソースコードも違うんです。
だから、コンパイラ言語ではプラットフォームごとに違うソースコードを用意しなきゃいけなくてめんどうです。
そこでJavaは、ソースコードをまずすべてのプラットフォームで通用するバイトコードに変換します。
そして、プラットフォームごとに仮想マシンでマシン語に一括変換することで、プラットフォームが違くても一種類のソースコードを用意すれば済むようにしてます。
インタプリタ言語は、コンパイラを使うコンパイラ言語とは違って、プラットフォームに依存しないですが、さっき言ったように実行時間が遅いです。
インタプリタ言語の実行時間の遅さと、コンパイラ言語のプラットフォームへの依存性を同時に解消したのがJavaなのです。
コンパイラ言語とインタプリタ言語の違いまとめ