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

答复: C# 4 DLR & Java 7 Invokedynamic

    博客分类:
  • DLR
阅读更多
原帖地址: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……
分享到:
评论

相关推荐

    .net4的DLR高级编程 Apress.Pro.DLR.in.NET.4.Nov.2010

    《.NET 4 的 DLR 高级编程》是一本深度探索 .NET 动态语言运行时(Dynamic Language Runtime,简称 DLR)的专著,由 Chaur Wu 撰写,出版于 2010 年 11 月。这本书针对 .NET 4 开发者,特别是那些对在 .NET 平台上...

    深入理解c#英文版

    7. **异步编程**:C# 5.0 引入了`async`和`await`关键字,改进了异步编程模型。虽然不是C# 2.0或3.0的内容,但书中可能也会涉及,因为它是现代C#开发的重要部分。 8. **动态类型与DLR**:C# 4.0 引入了动态类型,...

    C#-22个高级源码.rar

    4. **异步编程**:C#的`async/await`关键字使得异步编程变得更加简洁。源码可能包括了网络请求、文件I/O等长时间运行操作的异步实现,以提高程序响应性。 5. **设计模式**:源码可能包含了常见的设计模式,如工厂...

    [IronRuby] C# 4.0调用ActiveRecord

    知识点二:C# 4.0 C# 4.0是微软公司开发的面向对象的编程语言,它是.NET框架的一部分。C# 4.0引入了动态类型(dynamic),协变和逆变,可选参数,以及命名参数等新特性。这些新特性使得与动态语言如IronRuby的互操作...

    Pro DLR in .NET 4

    ### 关于《Pro DLR in .NET 4》的关键知识点 #### 一、Dynamic Language Runtime (DLR) 概述 动态语言运行时(Dynamic Language Runtime,简称 DLR)是 .NET Framework 的一个重要组成部分,它为 .NET 平台上的动态...

    《C#与.NET 4高级程序设计:第5版》源码

    此为《C#与.NET 4高级程序设计:第5版》中文版一书的源码。 Amazon超级畅销书,权威新版王者归来 全面涵盖C# 2010,用IL深入揭示语言特性 多位微软MVP联手翻译,名著佳译相得益彰 本书是C# 领域久负盛名的经典著作...

    一文带你了解 C# DLR 的世界(DLR 探秘)

    C# DLR(Dynamic Language Runtime)是.NET框架中一个重要的组成部分,主要负责处理动态类型和动态操作。DLR是在C# 4.0版本引入的,它的出现是为了增强C#对动态编程的支持,使得C#可以更好地与动态语言如Python和...

    C# 语言规范 版本 5.0

    7. **编译器错误和警告**:C# 5.0对编译器错误和警告进行了优化,提供了更清晰的错误信息和更多的警告选项,帮助开发者尽早发现和修复问题。 8. **性能优化**:在语言层面进行了一些优化,如更好的类型推断,提升了...

    CLR via C# 第四版

    8. **动态编程**:涵盖了DLR(Dynamic Language Runtime)和C# 4.0引入的dynamic关键字,以及IronPython和IronRuby等动态语言在.NET中的实现。 9. **CLR扩展性**:讨论了如何利用CLR的扩展接口,如...

    c#高级技术

    6. **动态类型**:C# 4.0引入了动态类型`dynamic`,允许在编译时未知类型的变量进行操作,通常用于与非托管代码交互或使用动态语言运行时(DLR)。 7. **特性(Attributes)**:特性是元数据的容器,可以附加到代码...

    C#4.0完全参考手册(英)

    7. **动态语言运行时(DLR)集成**:C#4.0更紧密地集成了动态语言运行时(Dynamic Language Runtime),这使得C#与其他动态语言(如IronPython和IronRuby)之间的交互变得更加容易。 8. **性能优化**:C#4.0对编译器...

    Advanced:高级C#

    4. **LINQ(Language Integrated Query)**:C#的查询表达式,提供了一种直观的方式来查询数据源,可以操作集合、数据库、XML等。它允许我们使用SQL-like语法进行数据操作,但完全集成在C#语言中。 5. **异步编程**...

    C#4.0语法大全(中文版)

    - **特征**:C#4.0的新增功能和改进,包括动态语言运行时(DLR)、并行LINQ(PLINQ)等。 ### 10. 语法结构 - **翻译的阶段**:编译器将源代码转换成中间语言的过程,包括词法分析、语法分析等阶段。 - **预处理...

    2018京东java面试详解

    4. Java 面试题目: * 何时使用 HashMap、何时使用 ConcurrentHashMap? * 如何实现一个红黑树? * 什么是赫夫曼树?如何应用于数据压缩? 本资源提供了详细的 Java 面试知识点,涵盖了 Java 基础、数据结构、...

Global site tag (gtag.js) - Google Analytics