2016-07-19 3 views
0

NashornがJVMのバイトコードをオンザフライでコンパイルすることを理解します。しかし、Stringを使ってeval関数を見つけたとき、Nashornは何をしますか?それは文字列の内容をコンパイルするか、それを解釈しますか?例えばNashorn Javascriptは "eval"ステートメントをコンパイルしますか?

function sayHi() { 
    console.log("hi world"); 
} 

for (var i=0;i<10;i++) { 
    eval("sayHi()"); // what happens here? 
} 

カップルのオプションは次のようになります。 1)それはevalの 2内の文字列をコンパイルしません)それは、それをキャッシュし、一度それをコンパイルし、同じバイトコードを再利用(上記のループの場合と同じ) 3)毎回eval Stringの内容を新しいものに再コンパイルする

もちろん、これはeval文字列の内容メソッド呼び出しですが、より複雑なJSコードが文字列intとして渡されると想像してくださいo eval。

+0

ハードコードされた文字列で 'eval()'を使用することはほとんどありません。通常は 'eval()'が推奨されていませんが、あなたが*使用しようとしているのであれば、コンパイル時には知られていない値を持つ。 – nnnnnn

+0

これでevalの文字列が動的であるとしましょう。その後、まずJITを一時クラスにコンパイルしてからすぐにクラスをアンロードします。または、Rhinoのインタプリタモードと同様に解釈されますか?または別のオプション? – adamM

答えて

1

Nashornは、javascriptを常に実行用のバイトコードにコンパイルします。 JSの通訳はありません。はい、コンパイル/ロードされたクラスは、ライブオブジェクトから到達できない場合はアンロードされます。

+0

したがって、上記の例では、ループ内でevalが呼び出されるたびにevalが過去に同じ文字列に遭遇したとしても、新しい再コンパイル/アンロードクラスがありますか? – adamM

+0

いいえ、同じコードに対してキャッシュヒットが発生します。つまり、再コンパイルされません。アライブ・キャッシュが使用可能かどうかによって、コンパイルは回避されます。しかし、コードは確実に再実行されます。 –

+0

したがって、eval(String)の再コンパイルを避けるため、String.equalsに対してその特定の文字列がすでにコンパイルされているかどうかを確認します。あなたの専門家の助けをありがとう。 – adamM

関連する問題