当前位置: 首页 >> 商务
V8是如何执行JavaScript代码的?
来源:前端南玖     时间:2023-06-05 22:55:53
前言

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

什么是V8

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

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


(相关资料图)

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

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

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

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

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

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

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

解释执行

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

编译执行

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

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

V8是如何执行JavaScript代码的?

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

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

V8执行JavaScript代码流程图

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

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

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

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

初始化执行环境解析JavaScript代码生成AST和作用域根据AST和作用域生成字节码解释执行字节码监听热点代码优化热点代码为二进制的机器代码优化生成二进制机器代码
标签:
V8是如何执行JavaScript代码的? 前言一般来讲,电脑是不能直接运行我们的javascript代码的,它需要一个
少林齐眉棍全套视频教程_少林齐眉棍 相信目前很多小伙伴对于少林齐眉棍都比较感兴趣,那么小搜今天在网上也
深海铁锰结壳矿石成分研究 使用数字光学显微镜、高分辨率扫描电子显微镜、X射线荧光和衍射分析以
21岁“小武磊”被各级国字号哄抢:国足让给全运队!|天天聚看点 其中,本赛季中超联赛迎来重新爆发的天才新星陶强龙就是其中之一,如今
正泰集团资本局:抢滩户用光伏,谋求上市队伍“添丁” 正泰集团或再添一家上市公司。正泰电器(601877 SH)6月4日晚间公告称
防范“烂尾楼”,有招了! 热资讯 近日,广西壮族自治区住房和城乡建设厅印发《广西壮族自治区房地产开发
苹果手机连不上4g网络和wifi(苹果手机连不上4g网络) 每日动态 1、请查看微信登录方式,如果登录信息正确,可能由于网络不稳定导致,
心理健康教育志愿者宣讲团走进仙桃二小-天天热议 寻找身边的小确幸,守护学生幸福成长-----心理健康教育志愿者宣讲团走
世界消息!天津市内子女与父母迁移投靠特殊情形 ➤➤天津市内子女与父母迁移投靠特殊情形特殊情形1、房主、户主因故无
最让人感动的100个关爱自然的故事(对于最让人感动的100个关爱自然的故事简单介绍) 聊聊一篇让人感动的100个关爱自然的故事,对于最让人感动的100个关爱自
河南安阳高考考点首次启用智能安检门|今日热讯 据悉,按照教育部统一部署,今年安阳市高考考点将首次启用智能安检门,
精选!猪肚鸡火锅的做法 食材准备猪肚,三黄鸡1只,红枣,枸杞,白胡椒粒,生姜,盐,香菇,金
潍柴(青岛)智慧重工智造中心项目钢结构围护安装完成_焦点热议 据媒体消息,6月4日,潍柴(青岛)智慧重工智造中心项目完成所有钢结构围
焦点热讯:《公民生态环境行为规范十条》发布 海霞、姚晨等现场诵读并倡议 6月5日,2023年六五环境日国家主场活动上,发布了新修订的《公民生态环
鸡蛋果一个有多少颗种子? 世界观察 1-2颗,鸡蛋果汁含量40%左右,加工出汁率28%至33%。汁含有机酸、枸
微导纳米(688147)盘中异动 股价振幅达7.83% 上涨7.22%(06-05)|焦点热文 摘要:2023年06月05日微导纳米(688147)股价大幅拉升7 22%,该股报54
观热点:2023上半年上海大学英语四六级考试考生须知 上海市2023年上半年全国大学英语四、六级考试(CET)将于6月17日(星期六)
李莓铃长大的样子_李莓铃 1、先分缝,中分。2、再扎起来绑住。3、这是图。4、能给我分吗??。本
环球快资讯:水绿景美 湛河扮成会客厅 2023年6月5日平顶山晚报A03版湛河上游船如织湛河岸边举办全民钓鱼比赛
工商银行龙凤呈祥金条25克价格今天多少一克(2023年06月05日)_焦点速讯 金投网提供工商银行龙凤呈祥金条25克价格今天多少一克(2023年06月05日
环球热头条丨30万级新能源大五座SUV,小鹏G9和岚图FREE怎么选 随着新能源品牌崛起,我们能够发现咱们国产品牌已经是在逐渐实现弯道超
【天天播资讯】无带胸罩_关于无带胸罩介绍 1、无带胸罩是2013年12月2日报道的。2、可利用磁浮技术抗衡地心引力托
环球观察:下一站巨星官方小说_下一站巨星第二季 1、没有,也应该不会有了。2、看漫画吧。3、漫画比动画好看。4、表示没
抱团取暖!三菱扶桑和日野汽车计划在2024年合并 全球资讯 面对全球电气化潮流的趋势,汽车厂家竞争越来越激烈,所以很多都需要寻
世界要闻:董坚(关于董坚的简介) 大家好,董坚,关于董坚的简介很多人还不知道,现在让我们一起来看看吧

广告

X 关闭

广告

X 关闭