1. ホーム

[解決済み】コンパイル言語とインタープリタ言語の比較

2022-03-30 03:48:20

質問

違いについて理解を深めたいのですが。ネットでいろいろな解説を見つけたが、実用的な意味合いよりも抽象的な違いに目が行きがちだ。

私のプログラミング経験のほとんどは、CPython(動的、インタプリタ)とJava(静的、コンパイル)です。しかし、インタプリタ型やコンパイル型の言語には他にも種類があることは理解しています。コンパイル言語で書かれたプログラムから実行ファイルを配布できることは別として、それぞれにメリット・デメリットがあるのでしょうか?よく、インタプリタ型言語は対話的に使えるという主張を聞きますが、コンパイル型言語にも対話的な実装は可能ですよね?

どのように解決するのですか?

コンパイル言語とは、一度コンパイルされたプログラムがターゲットとなるマシンの命令で表現される言語である。例えば、ソースコード中の足し算 "+"演算は、そのまま機械語の"ADD"命令に翻訳することができます。

インタープリタ型言語とは、命令がターゲットマシーンによって直接実行されるのではなく、他のプログラムによって読み取られ実行される言語です(通常 ネイティブ・マシンの言語で書かれている)。例えば、同じ "+" 操作を実行時にインタープリタが認識し、適切な引数で自身の "add(a,b)" 関数を呼び出し、マシンコードの "ADD" 命令を実行することになるのです。

解釈言語でできることはすべてコンパイル言語でもできますし、その逆もまたしかりで、どちらもチューリング完全言語です。どちらもチューリング完全言語です。しかし、どちらも実装や使用において利点と欠点があります。

完全に一般化してしまいますが(純粋主義者の方、お許しください!)、大雑把に言って、コンパイル言語の利点は以下の通りです。

  • ターゲットマシンのネイティブコードを直接使用することによるパフォーマンスの向上
  • コンパイル時に非常に強力な最適化機能を適用することができます。

そして、インタプリタ型言語の利点がここにあります。

  • 実装が簡単 (良いコンパイラを書くのはとても難しい!!)
  • コンパイルステージを実行する必要がない:コードを直接 "オンザフライ" で実行することができる。
  • 動的な言語ではより便利な場合がある

バイトコードコンパイルのような最新の技術では、さらに複雑さが増すことに注意してください。ここで起こるのは、コンパイラが、基盤となるハードウェアとは異なるquot;仮想マシン"をターゲットにしていることです。この仮想マシンの命令は、後で再びコンパイルしてネイティブコードを得ることができます(たとえば、Java JVMのJITコンパイラが行うように)。