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

时间:2012-09-29 14:18:44

标签: 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;

在'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;

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

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

2 个答案:

答案 0 :(得分:3)

实际上,快照不包括编译表单中的所有内置函数。

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

所以它可以懒得编译的所有东西V8都会懒得编译,这包括内置函数。因此,快照实际上并不包含所有函数的编译版本,并且编译休息时需要源。

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

答案 1 :(得分:-1)

可能是因为缓存二进制文件使得v8的速度非常快:它的构建速度非常快。所以他们采取了极端的措施来加快速度。预生成的本机代码二进制文件从客户端中消除了思维,使其运行速度更快。整个v8都有这样的优化。 :)