- 浏览: 3024548 次
- 性别:
- 来自: 海外
-
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
今天读了几篇与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消除了指令分派的开销,但并不会比原本的解释器难实现多少,只是比原本要吃更多内存而已。
以方法为单位做最简单的代码复制,概念上就像是这样:
假设有一个直观的字节码解释器来执行它,实现类似
(随便造了一种字节码,凑合看吧)
while循环里就是一个FDX循环(Fetch-Decode-eXecute),每轮循环就是一个“指令周期”;里面的switch是decode/dispatch,每个case就是对于的execute。
然后假设有个要被解释执行的方法,其中的字节码指令是:
如果在这个解释器的基础上应用inline-threading,则上面的方法就会在被解释执行前先通过代码复制被展开为:
这样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 VM、SableVM跟JamVM等也有采用这类实现方式。
然后还读了篇去年年底的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?
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 VM、SableVM跟JamVM等也有采用这类实现方式。
然后还读了篇去年年底的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
1 楼
lwwin
2010-03-01
贯通各个脚本之前我想很难理解你写BLOG时所引用的各种各样的东西来着^^
如果有机会真希望能够看到各个“名字”的简介^^ 不过我想那太麻烦了^^
如果有机会真希望能够看到各个“名字”的简介^^ 不过我想那太麻烦了^^
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
基于LLVM实现VM的JIT的一些痛点
2014-01-07 17:25 0同事Philip Reames Sanjoy Das http ... -
tailcall notes
2013-12-27 07:42 0http://blogs.msdn.com/b/clrcode ... -
《自制编程语言》的一些笔记
2013-11-24 00:20 0http://kmaebashi.com/programmer ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22290(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局 (0): 拿在手上的是什么
2013-11-04 18:22 21411(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
Function.prototype.bind
2013-09-24 18:07 0polyfill http://stackoverflow. ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
也谈类型: 数据, 类型, 标签
2013-08-18 01:59 0numeric tower http://en.wikiped ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ...
相关推荐
chromedriver-win64_116.0.5840.0.zip
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
计算机毕业设计资源包含(项目部署视频+源码+LW+开题报告等等),所有项目经过助教老师跑通,有任何问题可以私信博主解决,可以免费帮部署。
Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描视频QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
瘢痕挛缩护理规定(医院规章制度管理文件).docx
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
html网页制作 行为代码 事件效果 特写脚本代码
chromedriver-win64_116.0.5842.0.zip
长亭网络通信基础详情了解word
资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom124.0.6344.0 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver124.0.6344.0 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)
32位alu设计实验logisim
变量名的命名直接影响到程序的易读性,好的变量名应该简洁、易于理解。 一、单字符变量名 数学中通常用x,y来表示坐标,同样的,在命名变量时,可以使用一些具有特定含义的单个字符。这样的变量名兼具有意义和极简两大优点,作为编程人员应熟记。 具体列举如下。 i、j、k:数值(integer(整数))。 s:字符串(string)。 c:字符(char)。 p:指针(pointer)。 a:数组(array)。 x、y、z:坐标。 l:长度(length)。 n:数字、数量(number)。 二、常用变量名 1.计数器和循环: count:用于计数或记录数量的变量。 i、j、k:常用于循环中的迭代变量,尤其在嵌套循环中。 index:常用于循环或数组中的索引。 loop:表示循环的次数或循环控制变量(相当于前面的i) 2.布尔型变量: flag:用于表示某种状态或条件是否满足。 status:表示状态或结果。 isOpen:表示某个对象或功能是否开启。 isValid:表示某个条件是否有效或成立。 isFound:表示是否找到了某个元素或条件。
chromedriver-win64_117.0.5938.35.zip
chromedriver-win64_119.0.6039.0.zip
一、顾客功能点: 注册功能:用户可以注册账号,注册成功后可以登录系统。 登录功能:已注册用户可以登录系统,从而管理自己的信息以及进行洗衣预约等功能的使用。 查看与修改个人信息:用户有个人的主页和个人信息展示,允许用户对自己的信息进行修改。 修改密码:用户可以修改自己的密码。 店铺预约与查看:用户可以查看店铺详情并且预约。 洗衣信息管理:用户预约完毕之后可以对自己的预约信息进行查看,并且支付。 订单信息查看:用户可以查看依旧完成的订单信息和进行中的订单。 二、店家功能点: 店铺信息管理:店家可以对店铺信息进行增删改查。 衣服类型管理:店家可以管理自己可以清洗的衣服类型。 洗衣信息管理:店家可以管理用户的预约订单,进行审核和删除订单。 订单信息管理:店家可以管理订单信息,对订单信息的进度进行管理。 三、管理员功能点: 顾客信息管理:管理员可以对所有顾客进行管理,进行增删改查操作。 店家信息管理:管理员可以管理所有的店家,对店家进行增删改查和审核操作。 店铺信息管理:管理员可以管理所有的店铺信息,对店铺进行删改查以及审核操作。 衣服类型管理:管理员可以管理所有的衣服类型,并且进行删除操作
HID Mouse Classic
主要施工机械实有、完好情况表.docx
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
java论坛管理系统设计(源代码+论文)
chromedriver-win64_116.0.5845.4.zip