私の理解から、デフォルトのPython interpreter(CPython)はソースコードをバイトコードにコンパイルし、バイトコードをマシンコードに解釈します。一方、PyPyはJITを利用して、頻繁に解釈されるバイトコードをコンパイル済みマシンに最適化しますこれはJVMとどう違うのですか?JVMはインタプリタ+コンパイラです。ソースコードをバイトコードにコンパイルし、よく解釈されるバイトコードをコンパイルされたマシンコードに最適化します。他に違いはありますか?
2つの間に2つの大きな違いがあります。
まず、JVMは抽象的で、PyPyは具体的です。 JVMは仕様書であり、一枚の紙です。 PyPyは実装であり、コードの一部です。
非常に異なる動作をするJVMの多くの異なる実装があります。 JVMバイトコードのみを解釈するもの、事前に静的にコンパイルするもの、動的にジャストインタイムでコンパイルするもの、インタープリターとJITコンパイラーの両方があるもの、インタープリターと複数のJITコンパイラーがあるもの、インタープリターがなく、JITコンパイラーが1つしかない場合、インタープリターがなく、複数のJITコンパイラーがある場合もあります。トレースJITを持つもの、メソッドごとのJITを持つもの、両方を持つものがあります。一部にはネイティブスレッドがあり、一部にはグリーンスレッドがあります。トレースガベージコレクターを持つものもあれば、参照カウントガベージコレクターを持つものもあります。などなど。
第二に、PyPyはより一般的です。特定の言語の実装ではなく、効率的な言語実装を簡単に作成するためのフレームワークです。 PyPyフレームワークを使用して構築されたさまざまな言語実装が多数あり、Topaz(Rubyの実装)、HippyVM(PHPの実装)、Pyrolog(Prolog)、RSqueak(Squeak VM)、PyGirl(GameBoyエミュレーター)、 langjs(JavaScript)、およびIoとSchemeの実装。そしてもちろん、Pythonの実装も。
コンパイラについて具体的に質問したので、PyPyのJITと他の混合モードエンジンのJITコンパイラの間には非常に重要な違いがあります。典型的な混合モードエンジン(たとえば、Oracle HotSpot JVM、IBM J9 JVM、Rubinius、Apple Squirrelfish FX、…))では、インタープリターとコンパイラーが並行して実行され、同じものを処理しますプログラムインタプリタはプログラムを解釈し始め、プログラム(の一部)をコンパイルすることが有益であると判断されると、プログラムはコンパイラに渡されてコンパイルされます。
ただし、PyPyでは、コンパイラーはインタープリターによって解釈されるプログラムをコンパイルしません。プログラムを解釈しているときにinterpreter自体をコンパイルします!
さて、なぜあなたはこのようなことをするのですか?これが何を意味するか考えてみてください。JITがプログラムを解釈しているときにインタープリターをコンパイルすると、最終的には、その1つのプログラムのみを解釈できる特別なバージョンのインタープリターであり、すべてネイティブコードにコンパイルされます。しかし、1つのプログラムしか解釈できないインタプリタは、そのプログラムと区別がつきません。つまり、言い換えれば、そのプログラムについて何も知らなくても、そのプログラムをコンパイルしたことになります。
これは、PyPyがフレームワークとして意図されていることに関係しています。この方法では、必要なのはone JITコンパイラーだけで、-all言語で機能します。 PyPyフレームワークに新しい言語を実装したい場合に書く必要があるのは、インタープリターだけです。 JITコンパイラは「無料」で入手できます。また、JITコンパイラーは非常に優れているため、インタープリターは非常に単純で、積極的な最適化などを実行する必要はありません。 (たとえば、HypyVM、PHP PyPyを使用した実装は、Zend Engineのほぼ8倍高速です(標準のPHP実装)で、2倍高速です) Facebookの積極的に最適化された高性能PHP実装HHVM。)
概念は最も広いストロークでのみ類似しています。はい、どちらもバイトコードと呼ばれる簡略化されたプログラム表現を解釈し、その一部を最適化されたマシンコードにコンパイルしますが、それで終わりです。手始めに、「JVM」は、標準のすべての実装を包括的に表す用語です。 PyPyは1つだけです。 JVMは1つもありません。
さらに、コンパイルはかなり異なって行われます。ほとんどのJVMは、いわゆるメソッドJITコンパイラーです。つまり、個々のメソッドをコンパイルして最適化します(モジュロインライン化)。 PyPyはいわゆるトレースJITであり、プログラムの動的実行の一部をコンパイルします。つまり、50の異なるメソッドを介して、または大きなメソッドの1つの小さな部分をカバーするだけで、制御フローに従います。