导航:首页 > 源码编译 > v8引擎js源码解读

v8引擎js源码解读

发布时间:2023-01-06 17:56:08

1. V8编译生成的机器码究竟是什么

实际上V8的JIT编译器是直接在内存中生成机器码的,并不会先生成文本形式的汇编然后再使用汇编器去转换为机器码。“动态生成机器码”听起来可能有点玄乎,其实根本没啥,就是往内存里写字节,这些字节正好是某些机器码的意思,然后把这块内存当作函数去调用就是了。由于代码自身就是动态生成的,在生成的代码里直接嵌入resolve好的各种值其实就相当于传统编译流程里的“动态链接”的效果。顺手放俩我以前博客的传送门:V8实际上自带一个用C++实现的“汇编器库”用来动态生成机器码。它并不把文本形式的汇编转换为机器码,而是提供一组C++ API,调用这个API的函数就可以在内存里生成机器码来。有兴趣的同学可能会知道,V8的MacroAssembler库源自Animorphic的Strongtalk VM,而Strongtalk VM也是HotSpot JVM的前辈。V8 Design Elements文档里所描述的是最初期的V8的状态。当时的V8只有一个JIT编译器,一个javaScript函数通常只会被JIT编译一次。这个JIT编译器做的优化也不是很多。后来V8演化为拥有两个JIT编译器,一个初级编译器(baseline compiler,名字叫做Full Code Generator,简称FullCodeGen),和一个优化编译器(optimizing compiler,名字叫做Crankshaft),两个编译器结合在一次构成双层编译。JavaScript函数通常会先被FullCodeGen编译,然后如果还继续执行很多次的话则会再被Crankshaft重新编译一遍,生成更优化的代码。在这个架构中,FullCodeGen里生成的代码还是跟V8 Design Elements的相似,会通过inline cache来实现property access;而这些inline cache不但用于实现fast property access,更重要的是它们会被用于收集profile,然后等到Crankshaft编译的时候,它就可以看先前收集的profile来做profile-guided optimization。以这个 function foo(p) { return p.x } 为例,参数p没有任何特别的地方,所以JavaScript引擎也无法知道p到底可能有怎样的值。但通过FullCodeGen生成的代码所收集到的profile信息,Crankshaft再去编译 foo() 的时候就可以知道p之前通常指向一个Map(hidden class)为0x2c97ccb179d1的类型的对象。这个类型的constructor为Point、[[Prototype]] 为Point.prototype、对象里有足够空间容纳10个内嵌的字段(in-object property),并且其中2个slot被用于存储Smi类型,剩余的8个slot未被使用。

2. 什么是Google V8 JavaScript引擎

V8是一个由丹麦Google开发的开源JavaScript引擎,用于Google Chrome中。[2]Lars Bak是这个项目的组长。[3]
V8在执行之前将JavaScript编译成了机器码,而非位元组码或是直译它,以此提升效能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。[4]
传统的javascript是动态语言,又可称之为Prototype-based Language,JavaScript继承方法是使用prototype,透过指定prototype属性,便可以指定要继承的目标。属性可以在运行时添加到或从对象中删除,引擎会为执行中的物件建立一个属性字典,新的属性都要透过字典查找属性在内存中的位置。V8为object新增属性的时候,就以上次的hidden class为父类别,创建新属性的hidden class的子类别,如此一来属性访问不再需要动态字典查找了。
为了缩短由垃圾收集造成的停顿,V8使用stop-the-world, generational, accurate的垃圾收集器。[5]在执行回收之时会暂时中断程序的执行,而且只处理物件堆叠。还会收集内存内所有物件的指标,可以避免内存溢位的情况。V8组译器是基于Strongtalk组译器。[6]。

3. 同样源自V8引擎的phantomjs,nodejs和iojs有何区别

phantomjs更像是webkit的封装,不仅仅是一个js引擎,包含了HTML解析展示部分。
nodejs和iojs是同一个东西,有些人觉得nodejs太保守了,开了个分支iojs,支持了一些的更新技术,例如ES6等待,现在iojs已经合并到nodejs分支了。

4. 为什么用c++写的v8引擎可以编译js

c++是底层语言系统,可以写出浏览器解析内核

5. 同样源自V8引擎的phantomjs,nodejs和iojs有何区别

phantomjs 是浏览器,只是没有界面而已。nodejs是基于v8的运行环境,一般运行于服务器端。iojs和nodejs很像,大部分的代码都兼容,维护的团队不同。

6. 如何查看javascript的源码

大名鼎鼎的Chrome浏览器的javascript引擎V8是开源的。你可以下载V8的源码看。

阅读全文

与v8引擎js源码解读相关的资料

热点内容
黑马程序员培训机构官网天津 浏览:903
mainjavasrc 浏览:57
如何买服务器挖矿 浏览:291
php批量上传文件夹 浏览:559
安卓固件怎么更新 浏览:168
单片机代码例程网站 浏览:922
UG编程如何多平面轮廓2D倒角 浏览:438
视频压缩渐变纹 浏览:852
什么app能看财经新闻 浏览:40
数学奇迹神奇运算法 浏览:360
大厂的程序员的水平如何 浏览:701
遗传算法入门经典书籍 浏览:879
源码炮台脚本 浏览:621
在位编辑命令 浏览:348
曲式分析基础教程pdf 浏览:15
php生成静态html页面 浏览:965
怎么分割pdf 浏览:813
压缩垃圾报警器 浏览:629
小公司一般都用什么服务器 浏览:968
java获取时间gmt时间 浏览:821