- 浏览: 3016018 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (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分享的概要
原帖地址:C# 4 DLR & Java 7 Invokedynamic
呵呵,正好我也关注着这方面的内容。有兴趣的话楼主可以看看去年我写的些记录,这篇:LINQ与DLR的Expression tree(2):简介DLR。
invokedynamic有机会比DLR具备更高的运行效率,主要是因为JVM的许多实现都比.NET的CLR要更“动态”。
以Hotspot JVM的运行模式为例,Java程序被装载进来后一开始主要是以解释模式执行,等到一定时间之后,某些方法变得比较“热”(执行密度高),就有机会被JIT为本地代码。根据JVM启动参数和程序运行状况的不同,Hotspot可能采取不同的JIT和优化策略。JVM可以假定程序大部分时间某些条件满足某些条件(例如持有某个锁的几乎总是同一个线程),并采用激进优化;如果运行到某一时刻,假定的条件不再满足了,HotSpot也可以退回到解释模式继续执行。整个过程中实际被执行的代码的状况是非常动态的。
CLR这边则总是在程序刚开始的就将每个调用到的方法都JIT为本地代码再执行。这样,唯一“动态”的地方就是:JIT之后的代码是放在一个所谓“代码堆”上的(与分代式GC管理的对象/大对象堆相互独立);当这个堆的大小达到某个阈值时,CLR就会将JIT过的代码清空,然后重新开始托管方法调用->JIT->以本地代码执行的流程。(注:实际上桌面上的CLR在当前实现中是不抛弃代码的。.NET Compact Framework版的CLR倒是会抛弃JIT编译得到的代码)
CLR的指令集,MSIL(或者叫CIL)的设计使得它并不太适合于解释执行,因为指令本身是多态的。于此相对,JVM的指令集有许多是单态的,指令本身就包含了类型信息,更有利于解释执行时的效率。未来的CLR转向更动态的执行模型的可能性也因此受到了一些by-design的限制。
DLR为了支持动态语言中可能发生的方法重定义,或者是同一个方法调用点可能要调用不同类型对象的同名方法等状况,不得不提高运行时的动态性。与JVM增加invokedynamic指令不同,DLR的实现并不依赖CLR的任何改变;底下的CLR跟.NET 2.0时的CLR并没有大的变化。那怎么实现代码的动态性呢?DLR采用了更高层的抽象模型作为执行模型:Expression Tree。
DLR中每个方法调用点(CallSite)都保存着一些Expression Tree;基于DLR的动态语言实现也是将源码编译到Expression Tree之后交给DLR。这些Expression Tree可以被编译为MSIL变成动态方法(DynamicMethod),由CLR执行。DLR也会对代码做一些假设,满足假设的时候就重用以前编译好的动态方法,假设不成立的时候就重新构建Expression Tree,然后编译为MSIL得到动态方法,然后由CLR执行。
所以为什么invokedynamic有机会比DLR有更高的运行效率呢?因为JVM在底层实现了更多的动态性,以C++来实现了调用点的link/relink过程,Java一边只要说明link target是哪里,要满足的条件是什么就行;DLR则完全靠C#来实现调用点的link/relink过程,也靠C#或者其它.NET语言来说明link target与对应的条件。除非哪天C#能在速度上完胜C++,不然……嗯,呵呵。
不过实际东西出来之前谁也说不准。我也只能说invokedynamic有机会比DLR快,并不保证一定如此。至少,非Sun Hotspot JVM对invokedynamic的支持能有多好也得放入考虑之中。目前的DLR还有很大的改良余地,而invokedynamic也还只有prototype,还没达到最佳状态。让时间来告诉我们结果就是了~
P.S. 话说回来,使用更高级的语言来编程,长远来说倒也是更有潜力的;think Squeak,think Rubinius,think PyPy……
呵呵,正好我也关注着这方面的内容。有兴趣的话楼主可以看看去年我写的些记录,这篇:LINQ与DLR的Expression tree(2):简介DLR。
invokedynamic有机会比DLR具备更高的运行效率,主要是因为JVM的许多实现都比.NET的CLR要更“动态”。
以Hotspot JVM的运行模式为例,Java程序被装载进来后一开始主要是以解释模式执行,等到一定时间之后,某些方法变得比较“热”(执行密度高),就有机会被JIT为本地代码。根据JVM启动参数和程序运行状况的不同,Hotspot可能采取不同的JIT和优化策略。JVM可以假定程序大部分时间某些条件满足某些条件(例如持有某个锁的几乎总是同一个线程),并采用激进优化;如果运行到某一时刻,假定的条件不再满足了,HotSpot也可以退回到解释模式继续执行。整个过程中实际被执行的代码的状况是非常动态的。
CLR这边则总是在程序刚开始的就将每个调用到的方法都JIT为本地代码再执行。这样,唯一“动态”的地方就是:JIT之后的代码是放在一个所谓“代码堆”上的(与分代式GC管理的对象/大对象堆相互独立);当这个堆的大小达到某个阈值时,CLR就会将JIT过的代码清空,然后重新开始托管方法调用->JIT->以本地代码执行的流程。(注:实际上桌面上的CLR在当前实现中是不抛弃代码的。.NET Compact Framework版的CLR倒是会抛弃JIT编译得到的代码)
CLR的指令集,MSIL(或者叫CIL)的设计使得它并不太适合于解释执行,因为指令本身是多态的。于此相对,JVM的指令集有许多是单态的,指令本身就包含了类型信息,更有利于解释执行时的效率。未来的CLR转向更动态的执行模型的可能性也因此受到了一些by-design的限制。
DLR为了支持动态语言中可能发生的方法重定义,或者是同一个方法调用点可能要调用不同类型对象的同名方法等状况,不得不提高运行时的动态性。与JVM增加invokedynamic指令不同,DLR的实现并不依赖CLR的任何改变;底下的CLR跟.NET 2.0时的CLR并没有大的变化。那怎么实现代码的动态性呢?DLR采用了更高层的抽象模型作为执行模型:Expression Tree。
DLR中每个方法调用点(CallSite)都保存着一些Expression Tree;基于DLR的动态语言实现也是将源码编译到Expression Tree之后交给DLR。这些Expression Tree可以被编译为MSIL变成动态方法(DynamicMethod),由CLR执行。DLR也会对代码做一些假设,满足假设的时候就重用以前编译好的动态方法,假设不成立的时候就重新构建Expression Tree,然后编译为MSIL得到动态方法,然后由CLR执行。
所以为什么invokedynamic有机会比DLR有更高的运行效率呢?因为JVM在底层实现了更多的动态性,以C++来实现了调用点的link/relink过程,Java一边只要说明link target是哪里,要满足的条件是什么就行;DLR则完全靠C#来实现调用点的link/relink过程,也靠C#或者其它.NET语言来说明link target与对应的条件。除非哪天C#能在速度上完胜C++,不然……嗯,呵呵。
不过实际东西出来之前谁也说不准。我也只能说invokedynamic有机会比DLR快,并不保证一定如此。至少,非Sun Hotspot JVM对invokedynamic的支持能有多好也得放入考虑之中。目前的DLR还有很大的改良余地,而invokedynamic也还只有prototype,还没达到最佳状态。让时间来告诉我们结果就是了~
P.S. 话说回来,使用更高级的语言来编程,长远来说倒也是更有潜力的;think Squeak,think Rubinius,think PyPy……
发表评论
-
对象的重量
2011-08-21 17:15 0http://domino.research.ibm.com/ ... -
IronRuby 1.1系的自适应执行(解释/编译的混合模式)
2010-10-29 14:12 0IronRuby自身的compiler部分基本上还是保持不变的 ... -
Expression Tree中的Constant被编译后放到哪里去了?
2010-02-28 16:21 0Expression.Constant()可以放任意对象进去作 ... -
拿ETv2来生成方法体的两种阳春办法
2009-09-22 06:03 0System.Type System.Reflection.E ... -
C#的语言结构到Expression Tree v2的映射
2009-05-21 03:11 0在.NET Framework 4 Beta 1中,Expre ... -
.NET Framework 4.0 Beta 1里的Expression Tree一例
2009-05-20 10:23 2876既然装上了Visual Studio 20 ... -
用Iron-*语言来探索.NET
2009-05-15 23:21 3345刚才写代码的时候又是在不停查文档,甚是心烦。一怒,拿出Iron ... -
自己关于VM的帖的目录
2009-04-07 14:02 68798JavaEye的blog系统只允许把帖放到单一类别下,而不能用 ... -
MIX09上关于DLR解释器消息的一段听记(3月26更新IronPython 2.6A1消息)
2009-03-23 21:09 1799John Lam在MIX 09上做了一个关于动态语言与Silv ... -
通过get或set方法的MethodInfo获得相应的PropertyInfo的方式
2009-02-01 22:41 3501在IronPython 46307的MemberExpress ... -
同一个ParameterExpression被用在不同嵌套层次的lambda里会怎样?
2009-01-16 00:22 2557今天写代码的时候不小心写错了几个地方,把同一个Paramete ... -
CodePlex上放出DLR v0.9 beta
2008-11-27 14:34 1939之前提到过DLR会在CodePlex上拥有自己独立的项目页面, ... -
IronRuby (r170)中respond_to?的实现
2008-11-13 23:29 0IronRuby.Libraries/Builtins/Ker ... -
DLR中的binder的演变
2008-11-11 23:29 0从模糊的“标准消息”转变为明确完整的MetaObject Pr ... -
DLR即将在Codelex开设独立的站点
2008-10-29 23:01 1406DLR官网:Dynamic Language Runtime ... -
IronPython放出RC1
2008-10-23 09:59 1788下载链接:http://www.codep ... -
新的DLR tree改变了Visitor的设计
2008-10-09 00:35 1582之前的一帖提到过访问DLR tree所使用的visitor的实 ... -
对比DLR
2008-10-08 04:32 0Managed JScript: // // AST: E ... -
目前DLR执行一棵DLR tree的过程(针对10月3日的ChangeSet 41087)
2008-10-07 01:46 1734先在Microsoft.Scripting.Actions.C ... -
LINQ与DLR的Expression tree(4):创建静态类型的LINQ表达式树节点
2008-09-27 00:18 9310(Disclaimer:如果需要转载请先与我联系;文中图片请不 ...
相关推荐
Pro DLR in .NET 4 begins with the fundamentals of the DLR, showing how they work to provide interoperability support for dynamic languages. You’ll learn to mix and match objects and functions from ...
此为《C#与.NET 4高级程序设计:第5版》中文版一书的源码。 Amazon超级畅销书,权威新版王者归来 全面涵盖C# 2010,用IL深入揭示语言特性 多位微软MVP联手翻译,名著佳译相得益彰 本书是C# 领域久负盛名的经典著作...
在很久之前,我写了一片文章详解C# 匿名对象(匿名类型)、var、动态类型 dynamic,可以借鉴。因为那时候是心中想当然的认为只有反射能够在运行时解析对象的成员...C#4动态功能是Dynamic Language Runtime(动态语言运
.net4的DLR高级编程 Apress.Pro.DLR.in.NET.4.Nov.2010
python库。资源全名:downward_dlr-19.6.0.tar.gz
Pro DLR in .NET 4 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
Serial: sLR8ZC-855575-66525457680638618 Name: niuren Serial:aLR8ZC-855575-6652545851831340 ...Your key is: 10580-3FEYM-BZFXI-UA9NE-98BIX-EV827 ...Subscription Code: nLR7ZL-655342-54657656405281154
《c#与.net 4高级程序设计:第5版》是c# 领域久负盛名的经典著作,深入全面地叙述了c# 编程语言和.net 平台核心,并以大量示例剖析相关概念。书中介绍了c# 的各种语言构造、.net 2.0 的类、核心api、公共中间语言...
dlr-618最新升级固件
《C#与.NET4高级程序设计(第5版)》是C#领域久负盛名的经典著作,深入全面地叙述了C#编程语言和.NET平台核心,并以大量示例剖析相关概念。书中介绍了C#的各种语言构造、.NET2.0的类、核心API、公共中间语言(CIL)...
《C#与.NET4高级程序设计(第5版)》是C#领域久负盛名的经典著作,深入全面地叙述了C#编程语言和.NET平台核心,并以大量示例剖析相关概念。书中介绍了C#的各种语言构造、.NET2.0的类、核心API、公共中间语言(CIL)...
新版更透彻阐述了C# 2010和.NET 4新功能,包括动态语言运行时(DLR)、任务并行库(TPL,包括PLINQ)、ADO.NET实体框架(包括LINQ to EF)、扩展的WPF API,以及改进的COM互操作。 与同类图书不同,全书由世界级C#...
AB PLC设备级环网交换机应用案例http://u.download.csdn.net/images/btn_submit.png
此为C#4.0捷径教程 一书的...联合使用动态类型和ExpandoObject 这样的DLR 类型,你可以在C# 里创建并实现真正的动态类型,本书所探讨的技术也适用于任何针对.NET 运行时的语言。 本书适合有一定编程经验的程序员阅读。