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

【JavaScript运行原理之V8引擎】V8引擎解析JavaScript代码原理

1.编程语言的执行高级语言最终都需要

1. 编程语言的执行

高级语言最终都需要编译为低级语言才能被硬件执行,越高级的语言中间的转换时间越长,效率越低,越低级的语言执行素的越快,但是由于缺少高级语言便捷的语法特性所以很难编写代码。

2. 大杂烩JS

它是作者在1995年花10天写出来的,整个语言差不多是很多语言的大杂烩:

  • 借鉴了C语言的基本语法;
  • 借鉴了Java的数据类型和内存管理
  • 借鉴了Scheme语言,将函数作为一等公民
  • 借鉴了Self语言,使用了原型继承机制,基于原型prototype的继承机制
    所以JS算是 函数式编程 和 面向对象编程的混合产物。

3. 动态语言JS

通过var声明一个变量,可以给这个变量赋值任何数据类型的值,所以称js是一门动态语言。

但这也有一个缺点:我们在声明了复杂数据类型以后,可以随便删除、修改里面的属性,这对开发者来说是很爽的,但是对于编译器来说就是一场灾难,因为源代码里提供的信息太少了,js的语言特性让编译器没办法在运行前知道变量的类型,只有在运行期间才能确定各个变量的类型,这就导致了JS无法在运行前编译出更加迅速的低级语言代码。

但是现在的JS编译引擎都使用了运行时编译,在运行时阶段生成机器代码,而不是提前生成,这就是把代码的运行和生成机器代码同时执行,在运行阶段收集变量的类型信息,然后根据这些信息编译生成机器代码,然后直接使用这些机器代码。像Java这样的语言都是在运行前生成好机器代码。

4. Javascript引擎

JS作为一门高级语言,它被CPU执行之前,需要通过某种程序将js转换成机器语言并执行,这种程序就是Javascript引擎。
Javascript有很多引擎但是在编译JS时流程是差不多的:

  1. 将js源码通过解析器解析成抽象语法树AST;
  2. 接着通过接着再通过解释器将AST编译成字节码,字节码与平台无关,可以在任何操作系统上运行
  3. 字节码最后通过编译器生成机器码,由于不同平台使用 的机器代码会有差异,所以编译器会根据当前平台生成相应的机器码(汇编代码)。
    这是一个简化流程,在不同JS引擎中表现会有一定的差异。

5. 什么是V8引擎

V8 是一个接收Javascript代码,并编译代码,执行代码的一个C++程序,编译后的代码可以在多种操作系统,多种处理器上运行。

V8的工作:编译执行js代码、处理调用栈、内存分配、垃圾回收。

6. V8如何编译执行js代码

一般引擎在编译执行js代码都会用到3个重要的组件:解析器、解释器、编译器。

  • 解析器:负责将js源代码解析为抽象语法树AST
  • 解释器:将AST解释为字节码,同时解释器也有直接解释执行字节码的能力
  • 编译器:将字节码编译为运行高效的汇编语言(机器码)

编译流程:

  1. 由解析器将js解析为抽象语法树AST
  2. 通过解释器将AST生成字节码,此时AST就被清除了,释放内存空间。生成的字节码直接被解释器执行,同时生成的字节码将作为基准执行模型,
  3. 在代码不断运行的过程中,解释器会收到很多可以用于优化代码的信息,比如变量的类型,哪些函数执行的频率较高这些信息会收集给编译器,编译器会根据这些信息编译出经过优化的机器代码

注意: 优化后的机器代码也可能会被还原成字节码,因为js时一门动态语言,会导致编译器收集到的变量的类型不一致,比如你一开始声明函数接收的参数时int类型,函数被标记为热点函数后就会生成机器码,但是后边调用函数你传入的参数时String类型,机器码不知道如何处理字符串参数,于是就需要回退到字节码,由解释器来解释执行,效率就会变低。所以我们尽量不要把一个变量的类型变来变去(TS了解一下)。

7. 编译器处理js过程中的优化策略:


  1. 若函数只是声明,没有被调用,则不被解析生成AST
  2. 若函数只被调用一次,则生成字节码后就直接被解释执行,不会进行优化编译为机器代码
  3. 函数若被调用多次,则可能会被标记为热点函数,可能会被编译为机器代码,之后调用这个函数时,直接调用机器代码

推荐阅读
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
  • 本文详细介绍了Java中实现异步调用的多种方式,包括线程创建、Future接口、CompletableFuture类以及Spring框架的@Async注解。通过代码示例和深入解析,帮助读者理解并掌握这些技术。 ... [详细]
  • 云屏系统基于嵌入式微系统msOS,旨在解决当前嵌入式彩屏GUI编程中硬件要求高、软件开发复杂、界面效果不佳等问题。该系统通过结合MCU和Android技术,利用Html5+JavaScript实现高效、易用的图形用户界面开发,使嵌入式开发人员能够专注于业务逻辑。 ... [详细]
  • Appium + Java 自动化测试中处理页面空白区域点击问题
    在进行移动应用自动化测试时,有时会遇到某些页面没有返回按钮,只能通过点击空白区域返回的情况。本文将探讨如何在Appium + Java环境中有效解决此类问题,并提供详细的解决方案。 ... [详细]
  • 12月16日JavaScript变量、函数、流程、循环等***线上九期班
    12月16日JavaScript变量、函数、流程、循环等***线上九期班 ... [详细]
  • 本文详细介绍了Grand Central Dispatch (GCD) 的核心概念和使用方法,探讨了任务队列、同步与异步执行以及常见的死锁问题。通过具体示例和代码片段,帮助开发者更好地理解和应用GCD进行多线程开发。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • 鼠标悬停出现提示信息怎么做
    概述–提示:指启示,提起注意或给予提醒和解释。在excel中会经常用到给某个格子增加提醒信息,比如金额提示输入数值或最大长度值等等。设置方式也有多种,简单的,仅为单元格插入批注就可 ... [详细]
  • 本文总结了优化代码可读性的核心原则与技巧,通过合理的变量命名、函数和对象的结构化组织,以及遵循一致性等方法,帮助开发者编写更易读、维护性更高的代码。 ... [详细]
  • 探讨如何修复Visual Studio Code中JavaScript的智能感知和自动完成功能在特定场景下无法正常工作的问题,包括配置检查、语言模式选择以及类型注释的使用。 ... [详细]
  • 探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ... [详细]
  • 优化网页加载速度:JavaScript 实现图片延迟加载
    本文介绍如何使用 JavaScript 实现图片延迟加载,从而显著提升网页的加载速度和用户体验。 ... [详细]
author-avatar
手机用户2502929415
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有