2012-09-29 7 views
5

私はv8のソースを勉強しています。特に、 'mksnapshot'ツールにv8バイナリのネイティブjavascriptファイル(runtime.js、json.js ...)のコンパイル済みイメージが含まれていて、ソースの(幾分)縮小版。v8で生成されたバイナリにネイティブのjavascriptのソースコードが保存されるのはなぜですか?

var $JSON=global.JSON; 

function Revive(a,b,c){ 
var d=a[b]; 
if((%_IsObject(d))){ 
if((%_IsArray(d))){ 
var g=d.length; 

と「json.js SRC /」の開始時に、私は以下を参照してください:はっきり

var $JSON = global.JSON; 

function Revive(holder, name, reviver) { 
    var val = holder[name]; 
    if (IS_OBJECT(val)) { 
    if (IS_ARRAY(val)) { 
     var length = val.length; 

両方のスニペットD8の実行可能ファイルの内容を検査する際に、例えば、私は、次のスニペットを参照してくださいは同等ですが、2番目はコンパイルプロセスの最初のものに変換されました。

「toString」で検査するために元のコードが含まれていても、「JSON.stringify」をd8に入力すると「function stringify(){[native code]}」と表示されますこれのポイントは何ですか?

+0

Google IO 2012でこの質問をしてください。 –

+0

この件に関する私の所見は次のとおりです。このhttp://nodejs.org/api/vm.html#vm_vm_createscript_code_filenameの出力を保存して後で実行する方法はありますか? nodejsをコンパイルすると、javascriptファイルを使用していないように見えます。なぜなら、ソース内以外ではどこにも見つからないか、見つけられないからです。 – Prospero

答えて

3

実際には、スナップショットにはコンパイルされたフォームのすべての組み込み関数が含まれていません。

V8では一般に、遅延と時間を節約するために遅延コンパイルが優先されます。使用されていないものをコンパイルすると、生成されたコードのメモリが浪費されます(最適化されていないコンパイラによって生成されたコードは非常に冗長です)と時間(スナップショットについて言えば、コンパイル時または直列化解除時)

だから、怠惰にコンパイルすることができるすべてV8は遅れてコンパイルしますが、これには組み込み関数が含まれています。したがって、スナップショットには実際にはすべての関数のコンパイルされたバージョンが含まれておらず、ソースはコンパイルする必要があります。

ソースが存在するときに可能になる別のことは、最適化です。V8は、その適応最適化パイプラインを適用するためにソースにアクセスする必要があります。

+0

したがって、2つの関数を持つnodejsスクリプトを実行し、1つしか使用しない場合、もう一方はコンパイルされません。この怠惰なコンパイルの動作については、ソースのどのファイルを見つけることができますか? –

+0

多くの要因によって異なりますが、一般的なケースでは、使用される関数は1つだけコンパイルされます。 'compiler.cc'でコードを読むことができます: http://code.google.com/p/v8/source/browse/trunk/src/compiler.cc?r=12566#935 –

+0

ありがとうそれ –

-1

おそらくv8を非常に高速にする理由は、バイナリをキャッシュすることが非常に高速であるためです。だから彼らは速くするために極端な措置を取った。あらかじめ生成されたネイティブコードのバイナリは、クライアントから思考を取り除き、それをはるかに速く実行させます。このような最適化はv8全体であります。 :)

+0

私はこの質問をしたのです。彼らがすでにコンパイルされたマシンコードを保存している場合、なぜそれを生成したソースも保存しますか? –

+0

ちょっとしたことが起こっていると、クライアントはそれがソースを必要とすると判断します。帯域幅は、特に物事をキャッシュすることができるときに来るのは簡単です。 v8はスピードを念頭に置いて書かれていたので、帯域幅のコストがより速いエンジンに支えられました。 – L0j1k

関連する問題