`
RednaxelaFX
  • 浏览: 3016538 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

JägerMonkey与Carakan动态更新

阅读更多
今天读了几篇与JavaScript引擎相关的帖。三篇关于Mozilla的新JavaScript JIT编译器——JägerMonkey的:
David Mandelin:
Starting JägerMonkey
David Anderson:
JaegerMonkey – Fast JavaScript, Always!
MozillaWiki:
JaegerMonkey

从这几篇的描述来看,JägerMonkey是在SpiderMonkey的解释器上的改进,与TraceMonkey中的trace compiler相辅。
JägerMonkey采用的本地代码生成方式是inline-threading,是代码复制(code replication)的一种应用。这是将解释器进化为“JIT编译器”的一种快捷而有效的方式;与纯解释相比,inline-threading消除了指令分派的开销,但并不会比原本的解释器难实现多少,只是比原本要吃更多内存而已。

以方法为单位做最简单的代码复制,概念上就像是这样:
假设有一个直观的字节码解释器来执行它,实现类似
// pc = program counter,字节码的程序计数器
// bytecode,字节码序列
// operand_stack,求值栈,或者叫操作数栈
// sp = stack pointer,求值栈指针
// ret_val = return value,返回值
// done,判断是否完成执行

while (!done) {
    opcode = bytecode[pc++];                     // 取下一条指令(fetch)
    
    switch (opcode) {                            // switch方式的指令分派(decode/dispatch)
    case PUSH_INT_0:
        operand_stack[sp++] = 0;
        break;
    case PUSH_INT_1:
        operand_stack[sp++] = 1;
        break;
    case ADD_INT:
        operand2 = operand_stack[--sp];          // pop
        operand1 = operand_stack[sp];            // peek
        operand_stack[sp] = operand1 + operand2; // set_top
        break;
    case RETURN_INT:
        ret_val = operand_stack[--sp];           // pop
        done = true;
        break;
    // ...其它指令的处理程序
    }
}

return ret_val;

(随便造了一种字节码,凑合看吧)
while循环里就是一个FDX循环(Fetch-Decode-eXecute),每轮循环就是一个“指令周期”;里面的switch是decode/dispatch,每个case就是对于的execute。

然后假设有个要被解释执行的方法,其中的字节码指令是:
push_int_0
push_int_1
add_int
return_int

如果在这个解释器的基础上应用inline-threading,则上面的方法就会在被解释执行前先通过代码复制被展开为:
operand_stack[sp++] = 0;                 // push constant 0
operand_stack[sp++] = 1;                 // push constant 1
operand2 = operand_stack[--sp];          // pop
operand1 = operand_stack[sp];            // peek
operand_stack[sp] = operand1 + operand2; // set_top
ret_val = operand_stack[--sp];           // set return value
return ret_val;                          // return

这样FDX循环就变成只剩X了,F与D都被“折叠”掉,与指令分派相关的开销自然就没了。展开的过程是一种抽象解释,就像是在实际解释之前把F与D执行并缓存下结果。
需求简单并且设计得当的话,PC也不需要自己维护了,相应开销也节省了下来。“需求简单”是指不需要让外界知道原解释器的状态;有时候会需要知道原PC的值,例如调试时,或者是原架构支持自我修改的代码时,不需要支持这些的话就简单很多。
每个被解释的方法都经过这种展开的话,需要占用的内存自然就比原本纯解释要多些。最基本的inline-threading只是单纯把每个字节码指令的处理程序复制了一份,而不对生成的代码做优化,所以生成出来的代码质量比做优化的编译器生成出来的差,冗余也比较多,“代码膨胀”比做了冗余削除的编译方法会严重些。

通过inline-threading,JägerMonkey就不再有解释器的“主循环”了;与TraceMonkey的trace compiler配合使用时,基准模式是inline-threading,热代码则被trace compiler编译为更快的、更特化的代码,比原本TraceMonkey在无法trace编译时要退回到纯解释要进了一步。可以说JägerMonkey的执行模式是从TraceMonkey的解释/编译混合模式进化为多层编译模式,启动开销会稍微增加,不过后面的执行速度会快不少。

JägerMonkey的代码今晚连抓三次都异常退出了,真郁闷。今天跟Mozilla的连接那么糟糕么 T T

说到inline-threading,JVM里Cacao VMSableVMJamVM等也有采用这类实现方式。

然后还读了篇去年年底的Carakan消息更新。才发现我居然已经半年没更新过Carakan的消息,完全是奥特曼了。原来2月中Opera 10.50又出了新的beta,得找时间抓下来分析一下。
Roberto Mateu:
Opera 10.5 pre-alpha for Labs
Jens Lindström:
Carakan Revisited
要是哪里有更详细的Carakan相关资料就好了。以前的一篇也只是不痛不痒的说了些优化方向而已,
Jens Lindström:
Carakan
基于寄存器的字节码指令集,本地代码生成,对象结构识别,编译代码缓存,按tab分离的GC堆(每个堆还是用基本的标记-清除式算法收集)。
既没有说明解释器具体使用的指令分派方式,也没有说寄存器分配器是用最近流行的线性扫描方式还是图着色方式还是什么别的。想拿它与开源的几种JavaScript引擎来比较实现方式颇困难,只能说感觉它的思路跟Nitro类似,但比Nitro的实现复杂。如果说它现在是最快的JavaScript引擎,那多半是以复杂为代价而获得的。V8则一直坚持“简单高效”的理念,感觉更轻便可靠些。

==================================================================

稍微更新:

抓到JägerMonkey代码后稍微看了下。在jaegermonkey/js/src/methodjit目录里的就是新增的JIT编译器。其中在Compiler.cpp,Compiler::Compile()方法里有个循环+switch,看上去就跟一个普通的switch-threading解释器的主循环一样。这就是前面我说JägerMonkey的实现是“从解释器进化为编译器很直观的方式”,同样有这种样子的主循环,只是解释器在循环中就直接把字节码执行掉了,而进化为编译器后在这个循环里做的是生成代码的工作——也就把指令分派开销一次过付清了。
目前(2010-03-04)JägerMonkey仍然采用基于栈的模型来生成代码,只是把很简单的操作直接通过MacroAssembler写成机器码;而稍微复杂一些的,例如JSOP_ADD就是通过stubCall调用到VM内的js::jsl_Add()去执行,感觉还是更像subroutine-threading……或许以后会有更多部分真正被inline?
分享到:
评论
2 楼 RednaxelaFX 2010-03-01  
@lwwin
我也想能写出“各个名字的简介”。不过最后写出来恐怕得是这类东西:http://www.memorymanagement.org/glossary/
这个以我现在的能力做不到……
1 楼 lwwin 2010-03-01  
贯通各个脚本之前我想很难理解你写BLOG时所引用的各种各样的东西来着^^

如果有机会真希望能够看到各个“名字”的简介^^ 不过我想那太麻烦了^^

相关推荐

    利用CNN进行无人售货机的商品识别.zip

    无人机最强算法源码,易于部署和学习交流使用

    node-v9.11.0-sunos-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    ch-PP-OCRv2-det.onnx

    PP-OCR det

    基于TensorFlow的无人机机动飞行LSTM 时序动作网络.zip

    无人机最强算法源码,易于部署和学习交流使用

    ISO 16750-1-2023中文.pdf

    ISO 16750-1-2023中文.pdf

    node-v6.11.3-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    infrared-remote-controller-master

    旅行商问题

    ch-PP-OCRv3-det.onnx

    PP-OCR det

    电赛第二次积分赛无人机,实现循迹、识别图形与其颜色、串口通讯等功能.zip

    无人机最强源码,无人机算法,易于部署和学习交流使用

    node-v10.1.0-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于TMS320VC5416 设计DSP最小系统开发板硬件(原理图+PCB)工程文件.zip

    基于TMS320VC5416 设计DSP最小系统开发板硬件(原理图+PCB)工程文,PCB硬件采用2层板设计,大小为99*75mm,USB D型接口供电,包括AD设计的原理图和PCB文件,可以做为你的学习及设计参考。

    node-v6.9.4-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip

    基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip 本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip 本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip 本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于OpenCV+MySQL+QT实现的人脸识别考勤系统源码.zip 本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。

    基于matlab实现的matlab中的通信工具箱中simulink搭建直接序列扩频系统并进行仿真.rar

    基于matlab实现的matlab中的通信工具箱中simulink搭建直接序列扩频系统并进行仿真.rar

    大疆无人机集成.zip

    无人机最强源码,无人机算法,易于部署和学习交流使用

    安卓无人机.zip

    无人机最强源码,无人机算法,易于部署和学习交流使用

    ch_ppocr_mobile_v2.0_rec.onnx

    PP-OCR rec

    node-v11.2.0-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v10.11.0-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    从ROS1到ROS2无人机编程实战指南.zip

    无人机最强源码,无人机算法,易于部署和学习交流使用

Global site tag (gtag.js) - Google Analytics