我、京大生ぞ

現役京大生の雑記。メインテーマは大学受験とプログラミングと英語と京大の日常

コンパイラ言語とインタプリタ言語の違いを誰でもわかるように説明する【図解】


こんにちは、京大生ブロガーのゲーテ(@goethe_kyodai)です。


プログラミング言語は大まかにコンパイラ言語インタプリタ言語の二つに分かれますが、コンパイラ言語とインタプリタ言語の違いをプログラミングと無縁な人でもわかるように説明します。


目次

まずコンピュータはどうやってプログラムを理解しているの?


コンピュータはどうやってこんなプログラム(ソースコード)を理解しているでしょうか?


図1
f:id:a86223990:20180611164357p:plain


コンピュータというのは、上の形のままプログラムを理解しているわけではありません。


コンピュータは原理的に0と1しか理解できないため、下のような0と1の羅列に直してもらわないと理解できません。


図2
f:id:a86223990:20180611165014p:plain


このコンピュータが理解できる0と1の羅列をマシン語(機械語とも言う)と言います。


プログラムを実行するとき、コンピュータに理解してもらうために、図1のソースコードを図2のようなマシン語に変換してやる必要があります。


f:id:a86223990:20180611171329j:plain


そしてコンパイラ言語とインタプリタ言語ではその変換の仕方に違いがある んです。

コンパイラ言語


コンパイラ言語は、実行にプログラムをまとめてマシン語に変換します。

 


f:id:a86223990:20180611172002j:plain


プログラムをマシン語に変換するのがコンパイラというソフトウェアです。変換することをコンパイルと言います。


ここでプログラミングをやる上で知っておきたいのは、コンパイラには種類があってその種類ごとに変換の方法が違う 、ということです。


変換の方法が違うので、同じソースコードでも、あるコンパイラを使ったらエラーが出ないのに、違うコンパイラを使ったらエラーが出ることがあるので注意です。


コンパイラ言語で有名なのはCC++です。古いですがCOBOLFORTRANもコンパイラ言語です。

インタプリタ言語


コンパイラ言語は、実行全部まとめてプログラムをマシン語に変換しますが、


インタプリタ言語は、実行一行ずつプログラムをマシン語に変換します。


f:id:a86223990:20180611174109j:plain


コンパイラ言語は実行前にマシン語に変換してしまうので、それと比べると、インタプリタ言語は実行時に変換という作業をしなければいけない分、コンパイラ言語より実行時間が遅いです。


インタプリタ言語は、一行一行実行するのでエラーも一行一行チェックできます。なので、一括変換されるコンパイラ言語よりバグ取りがしやすいです。


インタプリタ言語で有名なのはPerlPHPです。

Java


f:id:a86223990:20180611191606j:plain


ここは本題からちょっと逸れた、しかもちょっと込み入った話をします。飛ばしてもらってもかまいません


はじめに、「プログラミング言語は大まかにコンパイラ言語とインタプリタ言語に分かれる」と言いましたが、どちらにも属さないプログラミング言語Javaです。


Javaはコンパイラ言語とインタプリタ言語の両方の良いところを取ったみたいな言語です。


Javaでは、まずプログラムを橋渡し的なコードである、バイトコードというものに変換します。


そして仮想マシンという環境で、そのバイトコードをマシン語に変換し、実行します。


なんでこんなめんどくさいことをやるかというと、どんなプラットフォームでも速く実行できるようにするためです。


プラットフォームというのはなんなのでしょうか?


まず、プログラムはハードウェアOS上で実行されます。


そしてプラットフォームというのは、そのプログラムを実行するハードウェア(パソコン本体)やOS(WindowsやMac)のことです。


下図のように、ハードウェアとOSという土壌がないとプログラムは実行できません。


f:id:a86223990:20180611185228j:plain


コンパイラ言語では、同じことをやるプログラムを書くにしても、違うプラットフォーム(OS、ハードウェア)では、違うソースコードが必要です。


というのは、コンパイラはプラットフォームに合わせて作られてるからです。


プラットフォームAにはコンパイラAが、プラットフォームBにはコンパイラBが、というようにプラットフォームごとにコンパイラが違います。


そしてソースコードはコンパイラに合わせて書かなければいけないので、コンパイラが違えばソースコードも違うんです


f:id:a86223990:20180611191150j:plain


だから、コンパイラ言語ではプラットフォームごとに違うソースコードを用意しなきゃいけなくてめんどうです。


そこでJavaは、ソースコードをまずすべてのプラットフォームで通用するバイトコードに変換します。


そして、プラットフォームごとに仮想マシンでマシン語に一括変換することで、プラットフォームが違くても一種類のソースコードを用意すれば済むようにしてます。


f:id:a86223990:20180611195536j:plain


インタプリタ言語は、コンパイラを使うコンパイラ言語とは違って、プラットフォームに依存しないですが、さっき言ったように実行時間が遅いです。


インタプリタ言語の実行時間の遅さと、コンパイラ言語のプラットフォームへの依存性を同時に解消したのがJavaなのです。