5

私はv8ソースを研究してきましたが、特に「mksnapshot」ツールにv8バイナリのネイティブjavascriptファイル(runtime.js、json.js ...)のコンパイル済みイメージが含まれている方法で、(やや)ソースの縮小版。たとえば、d8実行可能ファイルの内容を調べると、次のスニペットが表示されます。

var $JSON=global.JSON;

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

'src / json.js'の先頭には、次のように表示されます。

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;

明らかに両方のスニペットは同等ですが、2番目のスニペットはコンパイルプロセスで最初のスニペットに変換されました。

'toString'で検査するために元のコードが含まれていたかどうかは理解できましたが、d8に'JSON.stringify'と入力すると、' function stringify(){[native code]}'だけが表示されるので、これ?

4

2 に答える 2

4

実際、スナップショットには、コンパイルされた形式のすべてのビルトインが含まれているわけではありません。

V8は一般に、スペースと時間を節約するために遅延コンパイルを好みます。使用されていないものをコンパイルすると、生成されたコード(および最適化されていないコンパイラによって生成されたコードは非常に「冗長」)と時間(コンパイル時またはスナップショットについて話している場合は逆シリアル化時)にメモリを浪費します。

したがって、遅延コンパイルできるすべてのV8は遅延コンパイルされ、これには組み込みが含まれます。したがって、スナップショットには実際にはすべての関数のコンパイル済みバージョンが含まれているわけではなく、残りをコンパイルするにはソースが必要です。

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

于 2012-09-30T16:41:50.860 に答える
-1

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

于 2012-09-29T14:22:09.833 に答える