加入收藏 | 设为首页 | 会员中心 | 我要投稿 通化站长网 (https://www.0435zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 传媒 > 正文

如何快速地解析JavaScript延迟解析

发布时间:2021-05-01 15:44:47 所属栏目:传媒 来源:互联网
导读:译不必要的代码会产生实际的资源成本: 创建这些不必要的代码会占用CPU的一部分时间,这会导致启动时实际需要的代码延迟加载。 代码对象会占用内存,至少在回收机制判定当前代码不再需要并允许垃圾收集器回收之前是这样的。 ***脚本结束执行时编译的代码最终

译不必要的代码会产生实际的资源成本:

  • 创建这些不必要的代码会占用CPU的一部分时间,这会导致启动时实际需要的代码延迟加载。
  • 代码对象会占用内存,至少在回收机制判定当前代码不再需要并允许垃圾收集器回收之前是这样的。
  • ***脚本结束执行时编译的代码最终会缓存在磁盘上,占用磁盘空间。

由于这些原因,所有主流浏览器都实现了延迟解析。以前的做法是为每个函数生成一个抽象语法树(AST),然后将其编译为字节码,而使用了延迟解析之后,解析器就可以“预解析”它遇到的函数,而不需要对这些函数进行完全解析。它通过切换到预解析器来实现这一点,而预解析器是解析器的一个副本,它只做最基本的工作,否则就会跳过该函数。预解析器验证它跳过的函数在语法上是否是有效的,并生成正确编译外部函数所需的所有信息。在后边调用预解析的函数时,将按需对其进行完全解析和编译。

变量分配

使预解析复杂化的主要问题是变量分配。

出于性能原因,函数激活是在机器堆栈上进行管理的。例如,如果函数g调用了参数为1和2的函数f:接收器(即f的this值,由于它是一个草率的函数调用,所以它是globalThis)推入堆栈,接着是被调用的函数f。然后再将参数1和2推入堆栈。此时函数f被调用。为了执行调用,我们首先将g的状态保存在堆栈上: 包括f的“返回指令指针”(rip;我们需要返回什么代码)以及“帧指针”(fp;返回时堆栈应该是什么样子的)。然后我们输入f,它为局部变量c分配空间,以及它可能需要的任何临时空间。这确保了当函数激活超出作用域时,函数使用的任何数据都会消失: 它只是从堆栈中弹出。

(编辑:通化站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读