Javaにはコンパイラーとインタープリターの両方が必要であるという事実を理解できます。
そうではありません。Java言語仕様には、Javaにはコンパイラーが必要であると述べられていません。また、Java言語仕様には、Javaにインタープリターが必要であると書かれていません。
インタープリターを使用するか、コンパイラーを使用するか、またはこの2つの組み合わせを使用するかは、完全に実装者の裁量に任されています。
実際には、そこにあるマシンコードに直接コンパイルしたJavaの実装では、JavaのためのGNUコンパイラは、例えば、gcj
。技術的に言えば、Oracle OpenJDK Javaコンパイラは、マシンコード、具体的にはJVMバイトコードにもコンパイルされます。今、あなたは言うかもしれません、ちょっと待ってください、それはマシンコードではありません!しかし、x86マシンコード用のソフトウェアインタープリターがあり、JVMバイトコードを実行できるハードウェアCPUがあるので、一方が「ネイティブ」になり、もう一方が「ネイティブ」にならないのはなぜですか。
JVMバイトコードは、x86マシンコードと同じように、Java言語仕様の外側にあることに注意してください。
次に、仮想マシン(Windows、Linux、Androidなど)がそのバイトコードを現在のアーキテクチャのマシンコードに変換します。
繰り返しますが、それは完全に実装者次第です。
元のSun JVMは変換されず、常に解釈されました。現在のOracle OpenJDK JVMは解釈し、頻繁に実行される部分のみがコンパイルされます。Maxine Research VMは常にJITコンパイルを行います。Excelsior.JET実装は、事前に1回コンパイルされます。IKVM.NET JVMはCILバイトコードにコンパイルされます。Androidランタイムは、インストール時に事前に1回コンパイルされます。(また、AndroidランタイムはJVMバイトコードを認識せず、完全に異なる言語であるDalvikバイトコードを使用します。)
しかし、なぜPythonにはコンパイラとインタープリタの両方が必要なのでしょうか。
繰り返しますが、そうではありません。Python言語仕様には、Pythonにはコンパイラーが必要であると書かれていません。また、Python言語仕様には、Pythonにインタープリターを用意する必要があると述べているものはありません。
実際には、Pythonが解釈されることはありません。既存のすべての Python実装は、常に Pythonを別の言語にコンパイルします。その言語は次に解釈される場合とされない場合がありますが、その言語はPythonとは異なる言語です。Pythonは解釈されません。
なぜ単に解釈を使用しないのですか?
Pythonはマシンが簡単に解釈できるように設計されていないからです。人間が簡単に解釈できるように設計されています。大藤、CPythonのバイトコードは、されやすいマシンによって解釈されるように設計されています。したがって、人間向けに設計された言語でコードを記述し、マシン向けに設計された言語で解釈することは理にかなっており、一方から他方に進むには、コンパイルする必要があります。
私の知る限り、Pythonプログラム(バイトコードにコンパイルされたもの)を変更せずにWindowsまたはLinuxマシンで実行することはできません。
はい、できます。CPython VMは、PyPy、Jython、IronPythonと同様に、WindowsとLinuxの両方で使用できます。
言語をコンパイルまたは解釈する必要はありません。言語はただです。実際、インタープリターやコンパイラーがなくても、言語は完全に存在できます。たとえば、1930年代に彼が設計したKonrad ZuseのPlankalkülは、生涯にわたって実装されたことはありません。それでも、プログラムを記述したり、それらのプログラムを分析したり、それらについて推論したり、それらのプロパティを証明したりできます。実行することはできません。(まあ、実際、それは間違っています。もちろん、頭の中で、またはペンと紙でそれらを実行できます。)
現在、言語の特定の実装では、コンパイラー(または複数のコンパイラー)、インタープリター、または任意の組み合わせを使用できます。しかし、それは言語ではなく、実装の特性です。すべての言語はコンパイラで実装でき、すべての言語はインタプリタで実装できます。
ただし、インタープリターなしではプログラムを実行できないことに注意してください。コンパイラは単にプログラムをある言語から別の言語に変換します。しかし、それだけです。これで、同じプログラムが別の言語で提供されました。唯一、実際にプログラムの結果を取得する方法はあるし、解釈を。時々、言語は非常に単純なバイナリマシン言語であり、インタプリタは実際にはシリコーンでハードコードされています(これを「CPU」と呼びます)が、それはまだ解釈です。
また、インタプリタ、JITコンパイラ、AOTコンパイラの違いや異なる手段を説明するこの私の答えと、AOTコンパイラとJITコンパイラの違いを扱うこの答えに興味があるかもしれません。