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

言語処理系には、コンパイラ(compiler、コンパイラー)とインタプリタ(interpreter、インタープリター)という二つの方式があります。

例えば、C言語の一般的な処理系はコンパイラで、ソースコードをいったん機械語に翻訳してから実行します。また、Pythonの標準処理系はインタプリタで、ソースコードをそのまま実行します。

これを単純化し、「C言語はコンパイラ言語、Pythonはインタプリタ言語」と教えてしまうことがあります。しかし、これは、C言語やPythonのような言語と、コンパイラ・インタプリタという処理方式とを混乱した間違いです。C言語にもインタプリタがありますし、Pythonのコンパイラも開発されつつあります(例えば Mojo)。

さらにいうと、現代のインタプリタは、ソースコードを1行ずつ解釈しながら実行するのではなく、まずソースコード全体を中間言語にコンパイルしてから実行します。

中間言語ではなく機械語に、その場で(実行中に)コンパイルするものもあります。こういうものをJIT(Just In Time)コンパイラといいます。Pythonにも Numba というJITコンパイラがあります。

コンパイルと実行の処理をより詳しく説明するために、Pythonで次のような2行だけの間違ったプログラムを実行してみましょう。どちらの行も print(123) を書き間違えたものです。

plint(123)
print 123

実行すると、どちらも間違いなのに、Python処理系はまず全体を中間言語にコンパイルする時点で、二つめの間違い print 123 を見つけて、SyntaxError として報告します。

そこで、二つめの間違いを修正して実行してみましょう。

plint(123)
print(123)

今度は、構文上の間違いはないので、コンパイルは正常に終了し、あらためて1行目から実行しますが、その時点で plint という書き間違いを見つけて、NameError として報告します。plint という命令は、もしかしたらどこかで定義されているかもしれないので、実行してみないことにはエラーかどうかわからないのです。