热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

06_V8执行JS代码

一.编译器vs解释器编译型语言:在程序执行之前,需要经过编译器的编译过程,并且编译之后会直接保留机器能读懂的二进制文件。每次运行程序时,直接运行该二进制文件,而不需要再次重新编译。




一. 编译器 vs 解释器


编译型语言:


  • 在程序执行之前,需要经过编译器的编译过程,并且编译之后会直接保留机器能读懂的二进制文件。
  • 每次运行程序时,直接运行该二进制文件,而不需要再次重新编译。
  • 如 C/C++、GO 等语言

解释型语言:


  • 在每次运行时都需要通过解释器对程序进行动态解释和执行。
  • 如 Python、Javascript 等语言。


编译器


  • 运用于编译型语言
  • 依次对源代码进行词法分析、语法分析,生成抽象语法树(AST),然后是优化代码,最后再生成处理器能够理解的机器码。
  • 如果编译成功,将会生成一个可执行的文件。
  • 如果编译过程发生了语法或者其他的错误, 那么编译器就会抛出异常,最后的二进制文件也不会生成成功。

解释器


  • 运用于解释型语言
  • 对源代码进行词法分析、语法分析,并生成抽象语法树(AST)
  • 再基于抽象语法树生成字节码,最后再根据字节码来执行程序、输出结果。

二. V8执行JS代码


V8 在执行过程中既有解释器,又有编译器



1. 生成抽象语法树(AST)和执行上下文


AST:一种数据结构,代码的结构化表示,编译器和解释器的后续工作都需要依赖于它



生成AST的阶段


  1. 分词(词法分析)。将一行行的源码拆解成一个个 token。
  2. 解析(语法分析)。是将上一步生成的 token 数据,根据语法规则转为 AST。

token,指的是语法上不可能再分的、最小的单个字符或字符串



2. 生成字节码


字节码:介于 AST 和机器码之间的一种代码。但是与特定类型的机器码无关,字节码需要通过解释器将其转换为机器码后才能执行。

字节码可以减少系统的内存使用。



  • 解释器根据 AST 生成字节码,并解释执行

3. 执行代码


  • 解释器会逐条解释执行第一次执行的字节码
  • 如果存在热点代码,后台编译器会将这一段字节码编译为高效的机器码。当再次执行这段代码,直接执行编译后的机器码,提升执行效率

热点代码:一段代码被重复执行多次

即时编译(JIT):字节码配合解释器和编译器的技术



三. JS性能优化方向


  1. 提升单次脚本的执行速度,避免 Javascript 的长任务霸占主线程,这样可以使得页面快速响应交互;
  2. 避免大的内联脚本,因为在解析 HTML 的过程中,解析和编译也会占用主线程;
  3. 减少 Javascript 文件的容量,因为更小的文件会提升下载速度,并且占用更低的内存。

学习资料

李兵:《14丨编译器和解释器:V8是如何执行一段Javascript代码的?》



推荐阅读
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 字节码开发笔记:深入解析与应用技巧 ... [详细]
  • 如何在Django框架中实现对象关系映射(ORM)
    本文介绍了Django框架中对象关系映射(ORM)的实现方式,通过ORM,开发者可以通过定义模型类来间接操作数据库表,从而简化数据库操作流程,提高开发效率。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • Python 领跑!2019年2月编程语言排名更新
    根据最新的编程语言流行指数(PYPL)排行榜,Python 在2019年2月的份额达到了26.42%,稳坐榜首位置。 ... [详细]
  • 解决JavaScript中法语字符排序问题
    在开发一个使用JavaScript、HTML和CSS的Web应用时,遇到从SQLite数据库中提取的法语词汇排序不正确的问题,特别是带重音符号的字母未按预期排序。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
  • V8不仅是一款著名的八缸发动机,广泛应用于道奇Charger、宾利Continental GT和BossHoss摩托车中。自2008年以来,作为Chromium项目的一部分,V8 JavaScript引擎在性能优化和技术创新方面取得了显著进展。该引擎通过先进的编译技术和高效的垃圾回收机制,显著提升了JavaScript的执行效率,为现代Web应用提供了强大的支持。持续的优化和创新使得V8在处理复杂计算和大规模数据时表现更加出色,成为众多开发者和企业的首选。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
author-avatar
低调酥紫_631
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有