実際、V8はC++で書かれています。しかし、基本的にはJVMと同じことですが、JVMはC. V8 JITのJavascriptコードで記述され、JITコードを実行します。同様に、JVM JITは、バイトコード(Javaではなく)をコンパイル(またはホットスポット・コンパイル)し、生成されたコードを実行します。
Javaはバイトコードは静的ではありません。実際、それはかなりダイナミックになる可能性があります。一方、Javaはほとんど静的であり、Javaとバイトコードを組み合わせることは正しくありません。 JavaコンパイラはJavaソースコードをバイトコードに変換し、JVMはバイトコードを実行します。詳細については、John Roseのブログ(example)をご覧ください。そこには多くの良い情報があります。また、Cliff Click(のような)による会談を探してみてください。
同様に、Clojureコードはバイトコードに直接コンパイルされ、JVMはそのバイトコードで同じ処理を行います。 Clojureのコンパイルは通常実行時に行われますが、これは最速のプロセスではありません。同様に、ClojurescriptからJavascriptへの変換も高速ではありません。 Javascriptから実行形式へのV8の翻訳は明らかにかなり速いです。しかし、Clojureはバイトコードにコンパイルされているので、起動時のオーバーヘッドを大幅に削減できます。
あなたが言ったように、JVMがバイトコードを解釈するとは言っても間違いありません。 1.0リリースは、17年以上前のことでした。
従来、2つのコンパイルモードがありました。最初のモードはJIT(Just in Time)コンパイラです。バイトコードがマシンコードに直接変換される場所。JavaのJITコンパイルは高速に実行され、高度に最適化されたコードは生成されません。それはOKを実行します。
第2のモードは、ホットスポットコンパイラと呼ばれます。ホットスポットコンパイラは非常に洗練されています。これは、インタープリターモードで非常に迅速にプログラムを開始し、プログラムが実行されると解析します。ホットスポット(頻繁に実行されるコード内のスポット)を検出すると、ホットスポットがコンパイルされます。 JITコンパイラは、JITされていない限り何も実行しないため、高速でなければならないのに対し、ホットスポットコンパイラはコンパイルするコードからsnotを最適化する余分な時間を費やす余裕があります。
さらに、必要に応じて後でそのコードに戻って、さらに最適化を適用できます。これは、ホットスポットコンパイラがコンパイルされたC/C++を打ち始めることができるポイントです。コードのランタイム知識を持っているので、静的なC/C++コンパイラではできない最適化を適用する余裕があります。たとえば、仮想関数をインライン化できます。
ホットスポットにはもう1つの機能があります。私の知る限り、他の環境はありません。また、必要に応じてコードを最適化することもできます。たとえば、コードが継続的に単一の分岐を取っていて、最適化されており、ランタイム条件がコードを他の(最適化されていない)分岐に強制的に変更し、突然パフォーマンスがひどくなる場合です。ホットスポットは、その機能を最適化しないようにし、分析を再開して、それをよりうまく動作させる方法を見つけ出すことができます。
ホットスポットの欠点は、少し遅く始まることです。 Java 7 JVMの1つの変更点は、JITコンパイラとホットスポットコンパイラを組み合わせたことです。しかし、このモードは新しく、デフォルトではありませんが、最初の起動時には良い状態にしてから、advanced optimizationsを起動してJVMがうまく動作するようにしてください。
乾杯!
「JavaはCよりも遅い」は、多くの問題のドメインで真実かもしれませんが、無関係です。適切な質問は「JavaがV8よりも遅いか」です。 V8はあなたのコードをコンパイルされたCコードとして実行しません。これはCで書かれたJavaScriptインタプリタです。 –
@EricJ。私はそれが私の質問だと思う、私はClojureを生成したJavaScriptとClojureを解釈するJVMを解釈するV8を見ている。 V8はJSをマシンコードにコンパイルして実行します。 JVMはこれより何が速いのですか? – lobsterism
ClojureはJavaと同様にバイトコードにコンパイルされています。あなたはそれがそうではないと思ったのですか? –