- 浏览: 3049273 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (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 2931既然装上了Visual Studio 20 ... -
用Iron-*语言来探索.NET
2009-05-15 23:21 3420刚才写代码的时候又是在不停查文档,甚是心烦。一怒,拿出Iron ... -
自己关于VM的帖的目录
2009-04-07 14:02 69536JavaEye的blog系统只允许把帖放到单一类别下,而不能用 ... -
MIX09上关于DLR解释器消息的一段听记(3月26更新IronPython 2.6A1消息)
2009-03-23 21:09 1858John Lam在MIX 09上做了一个关于动态语言与Silv ... -
通过get或set方法的MethodInfo获得相应的PropertyInfo的方式
2009-02-01 22:41 3558在IronPython 46307的MemberExpress ... -
同一个ParameterExpression被用在不同嵌套层次的lambda里会怎样?
2009-01-16 00:22 2610今天写代码的时候不小心写错了几个地方,把同一个Paramete ... -
CodePlex上放出DLR v0.9 beta
2008-11-27 14:34 2018之前提到过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 1461DLR官网:Dynamic Language Runtime ... -
IronPython放出RC1
2008-10-23 09:59 1853下载链接:http://www.codep ... -
新的DLR tree改变了Visitor的设计
2008-10-09 00:35 1631之前的一帖提到过访问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 1806先在Microsoft.Scripting.Actions.C ... -
LINQ与DLR的Expression tree(4):创建静态类型的LINQ表达式树节点
2008-09-27 00:18 9378(Disclaimer:如果需要转载请先与我联系;文中图片请不 ...
相关推荐
《.NET 4 的 DLR 高级编程》是一本深度探索 .NET 动态语言运行时(Dynamic Language Runtime,简称 DLR)的专著,由 Chaur Wu 撰写,出版于 2010 年 11 月。这本书针对 .NET 4 开发者,特别是那些对在 .NET 平台上...
7. **异步编程**:C# 5.0 引入了`async`和`await`关键字,改进了异步编程模型。虽然不是C# 2.0或3.0的内容,但书中可能也会涉及,因为它是现代C#开发的重要部分。 8. **动态类型与DLR**:C# 4.0 引入了动态类型,...
4. **异步编程**:C#的`async/await`关键字使得异步编程变得更加简洁。源码可能包括了网络请求、文件I/O等长时间运行操作的异步实现,以提高程序响应性。 5. **设计模式**:源码可能包含了常见的设计模式,如工厂...
知识点二:C# 4.0 C# 4.0是微软公司开发的面向对象的编程语言,它是.NET框架的一部分。C# 4.0引入了动态类型(dynamic),协变和逆变,可选参数,以及命名参数等新特性。这些新特性使得与动态语言如IronRuby的互操作...
### 关于《Pro DLR in .NET 4》的关键知识点 #### 一、Dynamic Language Runtime (DLR) 概述 动态语言运行时(Dynamic Language Runtime,简称 DLR)是 .NET Framework 的一个重要组成部分,它为 .NET 平台上的动态...
此为《C#与.NET 4高级程序设计:第5版》中文版一书的源码。 Amazon超级畅销书,权威新版王者归来 全面涵盖C# 2010,用IL深入揭示语言特性 多位微软MVP联手翻译,名著佳译相得益彰 本书是C# 领域久负盛名的经典著作...
C# DLR(Dynamic Language Runtime)是.NET框架中一个重要的组成部分,主要负责处理动态类型和动态操作。DLR是在C# 4.0版本引入的,它的出现是为了增强C#对动态编程的支持,使得C#可以更好地与动态语言如Python和...
7. **编译器错误和警告**:C# 5.0对编译器错误和警告进行了优化,提供了更清晰的错误信息和更多的警告选项,帮助开发者尽早发现和修复问题。 8. **性能优化**:在语言层面进行了一些优化,如更好的类型推断,提升了...
8. **动态编程**:涵盖了DLR(Dynamic Language Runtime)和C# 4.0引入的dynamic关键字,以及IronPython和IronRuby等动态语言在.NET中的实现。 9. **CLR扩展性**:讨论了如何利用CLR的扩展接口,如...
6. **动态类型**:C# 4.0引入了动态类型`dynamic`,允许在编译时未知类型的变量进行操作,通常用于与非托管代码交互或使用动态语言运行时(DLR)。 7. **特性(Attributes)**:特性是元数据的容器,可以附加到代码...
7. **动态语言运行时(DLR)集成**:C#4.0更紧密地集成了动态语言运行时(Dynamic Language Runtime),这使得C#与其他动态语言(如IronPython和IronRuby)之间的交互变得更加容易。 8. **性能优化**:C#4.0对编译器...
4. **LINQ(Language Integrated Query)**:C#的查询表达式,提供了一种直观的方式来查询数据源,可以操作集合、数据库、XML等。它允许我们使用SQL-like语法进行数据操作,但完全集成在C#语言中。 5. **异步编程**...
- **特征**:C#4.0的新增功能和改进,包括动态语言运行时(DLR)、并行LINQ(PLINQ)等。 ### 10. 语法结构 - **翻译的阶段**:编译器将源代码转换成中间语言的过程,包括词法分析、语法分析等阶段。 - **预处理...
4. Java 面试题目: * 何时使用 HashMap、何时使用 ConcurrentHashMap? * 如何实现一个红黑树? * 什么是赫夫曼树?如何应用于数据压缩? 本资源提供了详细的 Java 面试知识点,涵盖了 Java 基础、数据结构、...