実際、V8はC++で書かれています。ただし、基本的にはJVMと同じことを行い、JVMはCで記述されています。V8JITはJavascriptコードであり、JITされたコードを実行します。同様に、JVM JITはバイトコード(Javaではなく)をコンパイル(またはホットスポットコンパイル)し、生成されたコードを実行します。
Javaのように、バイトコードは静的ではありません。実際、それは非常に動的である可能性があります。一方、Javaはほとんど静的であり、Javaをバイトコードと混同することは正しくありません。JavaコンパイラはJavaソースコードをバイトコードに変換し、JVMはバイトコードを実行します。詳細については、John Roseのブログ(例)を参照することをお勧めします。そこにはたくさんの良い情報があります。また、Cliff Clickによる講演を探してみてください(このように)。
同様に、Clojureコードはバイトコードに直接コンパイルされ、JVMはそのバイトコードで同じプロセスを実行します。Clojureのコンパイルは通常、実行時に実行されますが、これは最速のプロセスではありません。同様に、ClojurescriptからJavascriptへの変換も高速ではありません。V8によるJavascriptの実行可能形式への変換は明らかに非常に高速です。Clojureは事前にバイトコードにコンパイルすることができ、それにより多くの起動オーバーヘッドを排除できます。
あなたが言ったように、JVMがバイトコードを解釈すると言うのも実際には正しくありません。1.0リリースは17年以上前にそれを行いました!
従来、2つのコンパイルモードがありました。最初のモードはJIT(Just in Time)コンパイラです。バイトコードがマシンコードに直接変換される場合。JavaのJITコンパイルは高速に実行され、高度に最適化されたコードは生成されません。正常に動作します。
2番目のモードはホットスポットコンパイラと呼ばれます。ホットスポットコンパイラは非常に洗練されています。インタプリタモードでプログラムを非常に迅速に起動し、プログラムの実行時に分析します。ホットスポット(頻繁に実行されるコード内のスポット)を検出すると、それらをコンパイルします。JITコンパイラは、JITされない限り何も実行されないため、高速である必要がありますが、ホットスポットコンパイラは、コンパイルするコードからsnotを最適化するために余分な時間を費やす余裕があります。
さらに、後で戻ってそのコードを再検討し、必要かつ可能であれば、さらに最適化を適用することができます。これは、ホットスポットコンパイラがコンパイルされたC /C++を打ち負かし始めることができるポイントです。コードの実行時の知識があるため、静的C /C++コンパイラでは実行できない最適化を適用する余裕があります。たとえば、仮想関数をインライン化できます。
ホットスポットにはもう1つの機能があります。私の知る限り、他の環境にはない機能ですが、必要に応じてコードを最適化解除することもできます。たとえば、コードが継続的に単一のブランチを取得していて、それが最適化され、実行時の条件が変化して、コードが他の(最適化されていない)ブランチを強制的に停止し、パフォーマンスが突然ひどくなる場合です。ホットスポットは、その機能を最適化解除し、分析を再開して、機能をより適切に実行する方法を見つけることができます。
ホットスポットの欠点は、開始が少し遅いことです。Java 7 JVMの1つの変更は、JITコンパイラとホットスポットコンパイラを組み合わせることです。ただし、このモードは新しく、デフォルトではありませんが、最初の起動が適切であると、JVMが得意とする高度な最適化を開始できます。
乾杯!