首页 > 编程语言 >V8是如何执行JavaScript代码的?

V8是如何执行JavaScript代码的?

时间:2023-06-12 10:36:52浏览次数:47  
标签:二进制 代码 JavaScript 编译 V8 执行

前言

一般来讲,电脑是不能直接运行我们的javascript代码的,它需要一个翻译程序将人类能够理解的编程语言 JavaScript,翻译成机器能够理解的机器语言。目前市面上有很多种 JavaScript 引擎,诸如 SpiderMonkey、V8、JavaScriptCore 等。而由谷歌开发的开源项目 V8 是当下使用最广泛的 JavaScript 虚拟机,全球有超过 25 亿台安卓设备,而这些设备中都使用了 Chrome 浏览器,所以我们写的 JavaScript 应用,大都跑在 V8 上。

如果这篇文章有帮助到你,❤️关注+点赞❤️鼓励一下作者,文章公众号首发,关注 前端南玖 第一时间获取最新文章~

什么是V8

在 V8 出现之前,所有的 JavaScript 虚拟机所采用的都是解释执行的方式,这是 JavaScript 执行速度过慢的一个主要原因。而 V8 率先引入了即时编译(JIT)的双轮驱动的设计,这是一种权衡策略,混合编译执行和解释执行这两种手段,给 JavaScript 的执行速度带来了极大的提升。通俗点理解就是:V8是一个高性能的JavaScript解析执行引擎

v8-1.png

对与很多开发者来说,V8就像是一个黑盒,我们将一段代码丢给这个黑盒,它便会返回结果,我们只知道V8 的主要职责是用来编译执行 JavaScript 代码的,并没有深入了解过它的工作原理。

下面我们就来深入了解一下V8到底是如何执行JavaScript代码的。

为什么需要编译这一过程?

我们先从 CPU 是怎么执行机器代码讲起,你可以把 CPU 看成是一个非常小的运算机器,我们可以通过二进制的指令和 CPU 进行沟通,比如我们给 CPU 发出“1000100111011000”的二进制指令,这条指令的意思是将一个寄存器中的数据移动到另外一个寄存器中,当处理器执行到这条指令的时候,便会按照指令的意思去实现相关的操作。为了能够完成复杂的任务,工程师们为 CPU 提供了一大堆指令,来实现各种功能,我们就把这一大堆指令称为指令集(Instructions),也就是机器语言。

CPU 能直接识别汇编语言吗?

显然是不行的,如果你使用汇编编写了一段程序,你还需要一个汇编编译器,其作用是将汇编代码编程成机器代码

计算机执行高级语言的基本方式

一般来讲,计算机执行高级语言的方式有以下两种:

解释执行

改方式需要先将输入的源代码通过解析器编译成中间代码,之后直接使用解释器解释执行中间代码,然后直接输出结果。

v8-2.png

编译执行

采用这种方式时,也需要先将源代码转换为中间代码,然后我们的编译器再将中间代码编译成机器代码。通常编译成的机器代码是以二进制文件形式存储的,需要执行这段程序的时候直接执行二进制文件就可以了。还可以使用虚拟机将编译后的机器代码保存在内存中,然后直接执行内存中的二进制代码。

v8-3.png

即便是JavaScript一门语言,也有好几种流行的虚拟机,它们之间的实现方式也存在着部分差异,比如Chrome使用的是V8虚拟机,Safari使用的是JavaScript Core虚拟机,而Firefox则使用的是TraceMonkey虚拟机。

V8是如何执行JavaScript代码的?

作为JavaScript的主流虚拟机,V8是如何编译执行JavaScript代码的呢?它采用的是我们上面介绍的解释执行、编译执行中的哪一种呢?

解释执行的启动速度快,但是执行速度比较慢,而编译执行的启动速度慢,但是执行速度比较快,所以为了权衡两种方法各自的优缺点,V8采用的是两种方法结合的方式进行编译执行JavaScript代码。

V8执行JavaScript代码流程图

v8-4.png

  • 从这张图的左侧部分我们可以看出,V8在启动执行JavaScript代码之前,它需要初始化好执行环境,这些环境包括:堆空间栈空间全局执行上下文全局作用域循环系统♻️内置函数等,这些内容都是在JavaScript执行过程中需要使用到的。
  • 在初始化完执行环境后,就可以向V8提交需要执行的JavaScript代码了。
  • V8在接收到JavaScript代码后,并不会立即执行,因为V8并不能直接理解JavaScript代码的含义,这对于它来说只不过就是一段字符串而已。它需要将代码结构化生成抽象语法树(AST),在生成抽象语法树的同时,V8还会生成相应的作用域。
  • 有了AST和作用域后,就可以生成字节码了,字节码是介于AST和机器代码之间的中间代码。
  • 生成字节码后,解释器就会按照顺序解释执行字节码,并输出执行结果。
  • 解释器在执行字节码的过程中,如果发现某段代码被多次重复执行,那么这段代码就会被标记成热点代码。
  • 当某段代码被标记成热点代码后,V8就会将这段代码交给优化编辑器,优化编辑器会在后台将字节码编译为二进制代码,然后再对编译后的二进制代码进行优化操作,优化后的二进制机器代码的执行效率就会大幅提升。

总结

由于计算机只能识别二进制指令,所以一般需要将高级代码编译成计算机能够识别的二进制指令才能执行,一般有两种方法:编译执行和解释执行。

两种方法各有优缺点,所以V8采用了一种权衡策略,在启动时采用解释执行的策略,但是如果某段代码的执行频率超过某个值,V8就会采用优化编译器将其编译成执行效率更高的机器代码。

V8执行JavaScript代码的主要流程:

  • 初始化执行环境
  • 解析JavaScript代码生成AST和作用域
  • 根据AST和作用域生成字节码
  • 解释执行字节码
  • 监听热点代码
  • 优化热点代码为二进制的机器代码
  • 优化生成二进制机器代码

标签:二进制,代码,JavaScript,编译,V8,执行
From: https://www.cnblogs.com/songyao666/p/17474247.html

相关文章

  • c++中string类的源代码
    一:回顾(1)c++中的string类是在面试中和笔试中经常考的题目;工程代码免费下载 string类的自行实现(2)c++中的string类和fstream类合起来是处理外部数据的利器;(3)string类经常用到findfind_first_offind_first_not_offind_last_offind_last_not_ofsubstrreplace等,以及联合使用来达......
  • Javascript考试复习
    登录页面<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>登录页面</title><style>html{background:#bde0ff;}form{text-align......
  • CSS选择器——简单爬虫代码
    爬取豆瓣top250影片资料(待修改)使用BeautifulSoup方法进行操作,CSS选择器截取html文本内容,对网页解析如。 importrequestsfrombs4importBeautifulSoup#避免反复获取出现爬取失败#头请求用于防止访问拒绝,亦可加cookiesdefpage_request(url,headers):htmltxt=requests.g......
  • 使用Xpath编写爬虫代码
    Xpath选择器爬取房源信息实例获取网页html,未处理子网页信息。python3.6foriinrange(1,101):print('正在爬取第'+str(i)+'页')#爬取北京上海广州深圳的二手房信息city=['bj','sh','gz','sz']forcincity:......
  • 【操作系统】【硬件结构】如何写出让 CPU 跑得更快的代码?
    1  前言代码都是由CPU跑起来的,我们代码写的好与坏就决定了CPU的执行效率,特别是在编写计算密集型的程序,更要注重CPU的执行效率,否则将会大大影响系统性能。CPU内部嵌入了CPUCache(高速缓存),它的存储容量很小,但是离CPU核心很近,所以缓存的读写速度是极快的,那么如果CPU......
  • mybatis-plus-generator-ui 可视化代码生成器!
    它提供交互式的WebUI用于生成兼容mybatis-plus框架的相关功能代码,包括Entity,Mapper,Mapper.xml,Service,Controller等。可以自定义模板以及各类输出参数,也可通过SQL查询语句直接生成代码。git地址:https://github.com/davidfantasy/mybatis-plus-generator-ui一、使用示例1......
  • 面试考代码,居然翻车了!
    你好,我是田哥今天早上,一位同学去现场面试,面试官现场写一段代码,请看代码:/***@author公众号:java后端技术全栈*@date2022年11月07日*/publicclassSolution{publicstaticvoidmain(String[]args){intcount=0;for(inti=0;i<10;i++......
  • XML代码的编写(一)
    XML代码的编写(一)XML概念Extensible Markup Language,翻译过来为可扩展标记语言。Xml技术是w3c组织发布的,目前推荐遵循的是W3C组织于2000发布的XML1.0规范。学习XML的目的在现实生活中大量存在有关系的数据,如下图所示  这样的数据如何交给计算机处理呢?,XML语言......
  • JavaWeb开发与代码的编写(十八)
    JavaWeb开发与代码的编写(十八)Filter(过滤器)Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp,Servlet,静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控......
  • 帝国CMS如何设置屏蔽页代码
    情景描述:当我们不想让用户直接看到真正的内容时候,但又不让蜘蛛发觉,以致快照更改,所以需要用到屏蔽页,这样既能兼顾用户浏览的需求,也能兼顾到蜘蛛,不至于快照被篡改的情况。步骤:1.制作一个txt文本文件,填充假页面代码,(注意,保存文件格式一定是txt文档)如下:<!DOCTYPEhtml><htmllang=......