私には多くの違いはありません
$>python module.py
そして:
$>javac module.Java
$>Java module.class
前者は中間言語(pythonバイトコード)にコンパイルされ、プログラムを実行します。後者はステップを分割し、最初に中間言語(jvmバイトコード)にコンパイルしてから、別の行で実行します。実際、私はpythonを書き換えて、この SO質問 のように2つのステップを分割することができます。
コンパイルされた言語と解釈された言語の間の明確な違いについて人々は大きな問題を抱えているようです。線が完全にぼやけているようです。他の人気のあるインタープリター型言語も同様の機能を持っています。 PHPは、後で使用するためにキャッシュまたは保存できる独自のオペコードに「コンパイル」します。 Perlもコンパイルされています。
では、これらの人気のあるインタープリター型言語とVMにコンパイルされる人気のあるコンパイル済み言語の間に本当に違いがあるのでしょうか?おそらく1つのケースでは、VMは通常、より多くのメモリに常駐しますが、「解釈された」言語では、通常、ランタイムが起動されますか?しかし、これは簡単に変更できるようです。
しかし、まだ違いがあるようです。それらが多かれ少なかれ同じである場合、Java/C#の performance がC++に近づいているように見えますが、「解釈された」言語はまだ桁違いです。すべてが本当にバイトコードがVMで実行されており、すべてが本当に同じである場合、パフォーマンスに大きな違いがあるのはなぜですか?
多くの違いがあります。まず第一に、バイトコードインタープリターと言語インタープリターの違いを考えてください。すべてのコマンドは予測可能な形式に従っているため、バイトコードの解釈は簡単ですが、言語の解釈には解析と字句解析が含まれます。これは、言語によっては非常に負担のかかる操作です。
C#とJavaはバイトコードにコンパイルするだけではありません。JITコンパイルも使用します。これにより、アプリケーションの全期間にわたってバイトコードを数回解釈し、結果をキャッシュできます-実行スレッドがつまずくたびにそれを解釈する代わりに、多くの冗長性を伴います。
私が覚えている限り、pythonはバイトコードにコンパイルできますが、JITを使用しないため、パフォーマンスが大幅に向上します。
通常、インタプリタ言語は、完全な静的分析(たとえば、複数のモジュールにわたる静的型チェック)および最適化の対象ではありません。バイトコードへのコンパイルはこれを提供できます。 OTOH、遅延バインディングされた参照であるため、一部のライブラリ(ライブラリなど)が欠落している場合でも、インタープリタ言語は実行できます。 IOW、コードを実際に呼び出さない場合、コードが存在するかどうかは関係ありません。