当前位置: 首页 > Web前端 > vue.js

【动画】JavaScript引擎的工作原理

时间:2023-04-01 01:08:52 vue.js

作者:LydiaHallie处理编译器。但是,了解JS引擎的基础知识并了解它如何处理JS代码并将其转换为机器可以理解的东西绝对没有坏处。注意:本文主要基于Node.js和基于Chrome的浏览器使用的V8引擎。HTML解析器遇到带有源代码的脚本标记。来自此源的代码是从网络、缓存或已安装的serviceworker加载的。响应是作为字节流的请求脚本,这是字节流解码器的责任。字节流解码器在下载字节流时对其进行解码。字节流解码器从解码后的字节流中创建令牌。例如,0066解码为f,0075解码为u,006e解码为n,0063解码为c,0074解码为t,0069解码为i,006f解码为o,006e解码为n,后跟一个空格。与JS中的function一样,this是JS中的保留关键字,用于创建令牌并将其发送给解析器。字节流的其余部分也是如此。该引擎使用两个解析器:预解析器和解析器。预解析器只是提前检查标记中的语法错误。这减少了发现代码中的错误所需的时间,否则这些错误稍后会被解析器捕获。如果没有错误,解析器将根据从字节流解码器接收到的标记创建节点。使用这些节点,它创建一个抽象语法树或AST。接下来,轮到口译员了。遍历AST并根据AST中包含的信息生成字节码的解释器。一旦字节码完全生成,AST就会被删除,从而清理内存空间。最后,生成的机器码就可以在电脑上运行了。虽然字节码很快,但它可以更快。运行此字节码时,将生成信息。它可以检测某些行为是否频繁发生,以及使用的数据类型。也许某个函数已被调用数十次:现在是时候对其进行优化以使其运行得更快!字节码与生成的类型反馈一起发送到优化编译器。优化编译器获取字节码和类型反馈,并根据此信息生成高度优化的机器代码。JS是一种动态类型语言,这意味着数据类型可以不断变化。如果JS引擎每次都要检查一个值的数据类型,那会很慢。相反,JS引擎使用一种称为内联缓存的技术。它将代码缓存在内存中,希望将来它能以相同的行为返回相同的值。假设某个函数被调用了100次,到目前为止它始终返回相同的值。它将假定第101次调用它时也将返回此值。假设我们有以下函数sum,它每次(到目前为止)都以一个数字作为参数调用:执行的结果是3。下次调用它时,它会假设我们再次调用它时使用相同的数字两个数字。如果转换是假的,则不需要动态查找,只需使用存储在特定内存槽中的结果,该内存槽已经有一个引用。否则,如果假设不正确,它将取消优化代码并恢复为原始字节码,而不是优化后的机器码。例如,下次我们调用它时,我们传递一个字符串而不是数字。由于JS是动态类型的,所以这样做没有错。这意味着数字2将被强制转换为字符串,函数将返回字符串“12”。它返回执行解释和更新类型反馈的字节码。希望这篇文章对你有用!当然,引擎的更多部分(JS堆、调用栈等)本文没有涉及,后续会继续分享。如果您对JS内部结构感兴趣,我强烈建议您自己做一些研究,V8是开源的,并且有一些关于它如何工作的很棒的文档。https://dev.to/lydiahallie/ja...无法实时获知代码部署后可能出现的bug。之后为了解决这些bug,花费了大量的时间在日志调试上。在这里顺便推荐一个好用的BUG监控工具Fundebug。干货交流系列文章总结如下。我觉得点个Star就好了。欢迎加群,互相学习。https://github.com/qq44924588...我是小智,公众号《大招天下》的作者,前端技术爱好者。我会经常分享自己学习看到的干货,在进步的路上互相鼓励!关注公众号,后台回复福利,就能看到福利,你懂的。