导航:首页 > 源码编译 > jvmjit编译存在哪里

jvmjit编译存在哪里

发布时间:2023-12-27 09:52:56

A. 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未被使用。

阅读全文

与jvmjit编译存在哪里相关的资料

热点内容
bt种子能压缩吗 浏览:671
JAVA特点是什么 浏览:881
字幕网app怎么找 浏览:528
奥迪a4l压缩比 浏览:693
iis7服务器怎么安装 浏览:975
孩子上学压力太大怎么解压 浏览:236
javaurl格式 浏览:342
匀称app怎么用 浏览:61
pythonemail中文乱码 浏览:442
android访问html 浏览:88
做一个app或者网页用什么编程 浏览:778
一体机服务器运行失败怎么办 浏览:938
longjava比较大小 浏览:532
clojure编程pdf 浏览:22
一年级数学圈一圈的算法 浏览:111
完整的python 浏览:42
c51单片机数字钟 浏览:923
apk文件反编译后安装包损坏 浏览:816
app图标分别是什么 浏览:368
linux全选命令 浏览:365