コンパイラとインタプリタ
言語処理系には、コンパイラ(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
という命令は、もしかしたらどこかで定義されているかもしれないので、実行してみないことにはエラーかどうかわからないのです。