- 浏览: 3017563 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (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 22264(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局 (0): 拿在手上的是什么
2013-11-04 18:22 21377(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* ...
相关推荐
项目规划与设计: 确定系统需求,包括商品管理的功能(如添加商品、编辑商品、删除商品、查看商品列表等)。 设计数据库模型,包括商品表、类别表、库存表等。 确定系统的技术栈,如使用Spring MVC作为MVC框架、Hibernate或MyBatis作为ORM框架、Spring Security进行权限控制等。 环境搭建: 搭建开发环境,包括安装JDK、配置Servlet容器(如Tomcat)、配置数据库(如MySQL)等。 创建一个Maven项目,添加所需的依赖库。 数据库设计与创建: 根据设计好的数据库模型,在数据库中创建相应的表结构。 后端开发: 创建Java实体类,对应数据库中的表结构。 编写数据访问层(DAO)代码,实现对商品信息的增删改查操作。 编写服务层(Service)代码,实现业务逻辑,如商品管理的各种操作。 开发控制器层(Controller),实现与前端页面的交互,接收请求并调用相应的服务进行处理。 前端开发: 使用HTML、CSS和JavaScript等前端技术,设计并实现商品管理页面的界面。 通过Ajax技术,实现前后端的数据交互,如异步加载商品列表、实
变频器 母线电容计算 mathcad
2022年中国大学生计算机设计大赛国赛优秀作品点评微课与教学辅助&数媒静态设计专业组视频提取方式是百度网盘分享地址
如果您想要在程序中输出月份的英文名称,并且提到了“pta”,但这里的“pta”与月份名称的输出没有直接关系(除非您是在特定的上下文中使用它作为一个变量名或标识符)。不过,我将直接给出如何输出月份英文名称的代码示例。 在Python中,您可以使用一个列表(list)或字典(dictionary)来存储月份的英文名称,并根据需要输出它们。以下是一个简单的示例: python # 使用列表存储月份的英文名称 months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] # 假设我们要输出第5个月份(即May) month_index = 4 # 注意列表索引从0开始,所以5月份是索引4 print(months[month_index]) # 输出: May # 或者,如果您想要通过月份的数字(1-12)来输出名称,可以稍作调整 def get_mo
单片机C语言Proteus仿真实例万年历提取方式是百度网盘分享地址
base.apk
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
母亲节祝福html源码 由于HTML是一种标记语言,主要用于网页的结构和内容展示,它本身并不包含大量的文本内容。但我可以为你提供一个简单的HTML页面模板,该模板包含一个针对母亲节的祝福页面,并给出一些建议和提示,以便你可以根据此模板扩展内容至接近2000字(这主要通过在页面中添加文本内容来实现,而不仅仅是HTML代码)。 以下是一个简单的HTML模板: html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>母亲节祝福</title> <style> body { font-family: Arial, sans-serif; background-color: #f2f2f2; ma
贪吃蛇.cpp
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
2024年5月全国大众点评美食店铺信息,共550万余家 。此处仅展示1万家,全量也有。 2024年5月最新大众点评店铺基础信息采集。含美食、休闲娱乐、结婚、电影演出赛事、丽人、酒店、亲子、周边游、运动健身、购物、家装、学习培训、医疗健康、爱车、宠物等十几大类共几千万家店铺信息。
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
个人学习上海交大郑益慧老师网课手写的笔记,同时结合自己学校老师的笔记资源。
照明系统电缆设计软件
Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
公司财务部绩效考核表.xlsx
Python源码-不那么枯燥的猜数游戏
k8s之安装中用于配置cni
五子棋游戏想必大家都非常熟悉,游戏规则十分简单。游戏开始后,玩家在游戏设置中选择人机对战,则系统执黑棋,玩家自己执白棋。双方轮流下一棋,先将横、竖或斜线的5个或5个以上同色棋子连成不间断的一排者为胜。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes