为什么v8会在生成的二进制文件中保存本机javascript的源代码?

Thi*_*uda 5 javascript v8 embedded-v8

我一直在研究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;
Run Code Online (Sandbox Code Playgroud)

在'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;
Run Code Online (Sandbox Code Playgroud)

很明显,两个片段都是等效的,但第二个片段在编译过程中转换为第一个片段.

我会理解是否包含原始代码用于检查'toString',但是当我在d8中输入'JSON.stringify'时,我看到的是'function stringify(){[native code]}',那么有什么意义呢?这个?

Vya*_*rov 4

实际上快照并不包括编译形式的所有内置函数。

V8 通常更喜欢延迟编译以节省空间和时间。如果编译未使用的内容,则会浪费生成代码的内存(非优化编译器生成的代码相当“冗长”)和时间(如果我们谈论快照,则在编译或反序列化时)。

因此,它可以延迟编译的所有内容 V8 都会延迟编译,其中包括内置函数。因此,快照实际上并不包含所有函数的编译版本,并且需要源代码来编译其余部分。

当源存在时,另一件可能的事情是优化:V8 必须能够访问源来应用其自适应优化管道。