Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微软在动态语言支持上超越了Java?

微软在动态语言支持上超越了Java?

作者头像
张善友
发布于 2018-01-30 09:51:54
发布于 2018-01-30 09:51:54
9310
举报
文章被收录于专栏:张善友的专栏张善友的专栏

当.NET在2000/2001年第一次发布的时候,Java社区认为它仅仅是从语言以及标准库上对Java的一个“克隆”。我们把二者的简单实例代码进行比较以后就可以很轻易地得出这样一个感受。不过,微软从它多年的Java经验中获益匪浅,并且成功解决了一些Sun现在才后知后觉的问题。Java社区也有人开始认为,.NET和CLR要比Java发展得更加快速。Neil Bartlett称

我认为微软在CLR上的创新速度更快是非常明显的。举例来说:LINQ就是一个极其强大的新特性(补充一下,它基于Haskell语言的monads);泛型(Generics)在C#中也比在Java中得到更早、更良好的支持(两者的泛型风格都受到Haskell的多态类型类[Polymorphic Type Classes]的启发……嗯!);CLR提供比JVM更好的多语言支持,而且现在它又有了DLR,而JVM上还需要两年时间才能出现能够相提并论的产品。

其它的例子有:模块化以及版本控制,对此.NET采用了Assembly(一些类的集合)离作为基本的部署单元来解决这个问题。Assembly包含了诸如版本信息之类的元数据,与之相反的是Java的Jar文件是缺乏这些版本信息的元数据的。这个缺陷会为那些加载了许多类库,不断增大的大型项目带来许多麻烦。目前,OSGi为这个问题提供了解决方案,而Sun也正在为将类似的解决方案加入Java 7中而忙碌着。

通过增加泛型、自动装箱(AutoBoxing)、枚举类型(Enumerated types)和Annotations等特性,Java语言正在不停地追赶.NET,C#现在提供了对匿名表达式的支持,这个特性是LINQ技术的基础组成之一。LINQ可以被认为是一种针对多种不同数据源的静态类型查询语言,这里说的数据源可以是XML,可以是关系数据库,甚至可以是任意的对象图。与此同时,Java社区还在争论语言的琐碎问题,比如说语言支持的属性(Properties),以及到底四种匿名方法(闭包)的哪一种应该被语言内建支持。

随着DLR的发布,微软再次领先了,这一次是在CLR对动态语言或者脚本语言的支持领域再次开始领跑。Java领域目前还没有能够相对应的措施。Mono项目是一个非常纯净的.NET实现,它的发起者Miguel de Icaza对DLR的特点概括如下

  • 一个针对动态语言的共享式类型系统;
  • 一个共享的AST,可以被语言开发人员用来创建新的动态语言;
  • 针对编译器开发人员的辅助/工具类;
  • 一个通用的宿主接口,从而可以将通用脚本语言的接口嵌入你的程序中,并且允许开发人员用一种货多种动态语言扩展系统;
  • 控制台支持,DLR甚至提供了一个简单的控制台接口,用于进行交互式编程。

共享式类型系统(Shared Type System)是使动态语言之间能够互动及交换对象重要因素。Jim Hugunin揭示了隐藏在这之后的机制,并且演示了Java是如何处理这种情况,以及DLR是如何独辟蹊径的Jim Hugunin肯定明白之间的区别的,毕竟他开发了Jython项目,一个基于JVM的Python实现。最近他转向微软平台,并且开发了IronPython(基于CLR的Python实现)。Jim Hugunin是这样解释其中一个问题的:

使用Wrapper(包装器)的方式也可能会有更深层次的问题,挑战之一就是确定需要传递的对象。举例来说:如果Python有一个PyString对象并且它调用了一个需要Object的C#方法,是应该传递PyString对象呢,还是应该将它解包成一个String对象呢?这些非常难以捉摸的类型问题永远都没有一个完美的答案。更糟糕的是,想在程序员不知情的情况下对对象进行包装或者解包,而导致对象标识的丢失而引起的一些超级棘手的问题。

这些问题毫无疑问也存在于Java领域中,比如说JRuby 1.0在Java和Ruby代码间处理字符串传递的方式:

  • 传入Ruby代码的Java字符串将被编码为UTF-8,这暗示了你应该在接收参数的代码中用UTF-8 byte[]来工作。
  • Ruby 字符串传出到Java时也被假定为UTF-8,Java端调用的返回结果应该符合该假定。

Java领域并没有实现我们上面提到的那些东西,除了宿主接口(Hosting Interface),它将在Java 6中按照JSR 233的规范实现。(Java中的)宿主接口只是一个框架,该框架提供添加新的语言运行时,并对其进行初始化和访问的标准方式。

Jim Hugunin进一步揭示了动态方法分派是如何被处理的,这个过程利用了扩展方法(Extension Methods)以及其它已有的CLR系统。在Java方面,唯一可以相提并论的努力就是JSR 292,其中要做到的一件事就是为了加入一种新的字节码invokedynamic。这个想法来源于Gilad Bracha,他在创建了这个JSR之后很快离开了Sun公司,现在他并不看好这个项目会在短期内有任何解决方案出台

JSR 292是我为了解决这些问题所发起的一项努力。我希望在缺席的情况下它仍能继续下去,但这个项目还需要若干年才能出成果(如果可能的话)。坦白地说,向JVM为这些特性添加支持,然后使Strongtalk变得更稳定是更为困难的一件事情。

注:Strongtalk是一个Smalltalk实现,其VM是HotSpot技术的基础,而HotSpot技术已经随着Sun的JVM发布很长一段时间了。

JSR 292的规范负责人Danny Coward则对在性能上带来的改善更有信心

动态语言引擎的创造者们正在忙于将Ruby代码转换成Java的字节码。当JRuby的引擎尝试着将方法调用转化成字节码时,就必须创建一个合成的接口来表现返回类型。这并不是开发人员创建出来的接口,而是由JRuby引擎所创建的,所以引擎可以处理这个方法调用,并且将其转化成字节码。而那就是返回的类型——对于方法参数和异常也是同样一个道理。 JSR 292消除了对这种合成接口的需要。在今天,动态语言解释器必须输出方法调用的字节码,即使是在解释执行比如说一段Ruby代码的时候。明天,有了JSR 292,解释器将会用到invokedynamic版本。这将使动态语言引擎实现变得更加简单,因为现在的许多引擎对创建新的合成接口以及做许多簿记工作烦恼不已:当一个方法在七八个不同的地方被调用时,引擎就必须在所有(调用的)地方重用那些合成接口。

值得关注的是,这些改进都将被写入JVM规范中,这就意味着这些特性都将被内建支持(被硬编码进去)并且在将来就不容易升级了。基于类库的方法好处在于:当处理这些系统更好的方法出现时,这个方法可以很快被采用。基于JVM的方法将在很长一段时间内保持不变,因为JVM常常会有一个很长的使用周期(作为参考:Java 1.3现在还在被许多公司所采用)。JVM真的会采用这种字节码,并且改进动态方法调用的速度吗?这也还有待观察。

另一个问题是官方对基于JVM的语言的支持和认可。目前,JRuby有两名开发人员在领着Sun的薪水。其中一位是Charles O. Nutter,他已经加入了Jython和Groovy的社区当中,这些努力是否会开始还有待于观察。考虑到微软有致力于IronPython、IronRuby、JavaScript以及动态VB支持等各种动态语言的紧密合作的开发团队,微软在这方面具有一定的优势。毕竟,DLR是一个不同团队合作的产品,这些团队在分享他们的经验并将这些经验融入一个通用的类库和知识库中,与之相反的是,基于JVM的开发团队经常不得不重复吸取重要的教训。

举例而言,JRuby的特色之一就是它的即时(Just In Time,JIT)编译器,这个编译器将在运行期将Ruby代码转化为Java字节码。问题在于:在当前版本中,这样的代码会使基于set_trace_func的调试器(这些调试器使用回调的方法来实现调试器功能)不能正常工作,因为代码不再调用这个回调。这意味着,JRuby的调试要受到这种方式的影响。而同样的问题肯定要在每种语言中得到处理和解决,因此,共享哪怕是这样的一小部分经验或者代码,都会帮助其他人节省时间和工作。

补充观点:微软的DLR还有待证明自己,目前集成了IronPython的DLR已经可以在网上下载到。IronRuby还没有发布,并且它的真实速度以及通用互操作能力还有待检验。比起.NET,Java仍然还有被认为是更加开放,并且能运行在更多平台上的优势。不过,Miguel de Icaza看起来确信,Mono在今年结束之前将能提供对Silverlight的支持

查看英文原文:Microsoft Surpasses Java's Dynamic Language Support?

         中文原文:http://www.infoq.com/cn/news/2007/06/java-dlr

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2007-07-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微软发布IronRuby
微软公司在其MIX07大会上宣布了IronRuby,一个运行在.NET CLR之上的Ruby实现的发布。其中,IronRuby与Java VM上的JRuby类似,但与Ruby/.NET Bridge之类的工具不同,这类工具只是将Ruby解释器于.NET VM相连接。 IronPython是运行在.NET之上的Python实现,其开发人员Jim Hugunin向我们阐述了IronRuby、IronPython和另外一些动态语言之下的技术的更进一步信息: 新的动态语言运行时(Dynamic Language R
张善友
2018/01/30
9650
Silverlight for linux 和 DLR(Dynamic Language Runtime)
Mono之父Miguel de Icaza 参会微软Mix 07大会。在他的blog有这篇短文: 摘录如下: Dynamic Language Runtime: Let the Speculation Begin For the last couple of weeks news started tricklying over IM and email that Microsoft was going to announce some Dynamic Language Runtime at Mix 07.
张善友
2018/01/30
6300
是开始学习IronPython 的时候了
Dino's Blog 上写一篇文章介绍了IronPython 2.6的Final版本已经发布。IronPython就是优雅的python编程语言和强大的.NET平台的有机结合, IronPython
张善友
2018/01/22
1.5K0
Dynamic Language Runtime 微软打出的王牌
      Dynamic Language Runtime(DLR)。DLR和IronPython全部开源,如果你微软这样的动作吃惊,请看看Microsoft 的 OpenSource Licence,可以到codeplex下载。新的动态语言运行时(Dynamic Language Runtime,DLR)向CLR中加入了一小部分核心特性,使之得到显著改善。它向平台中加入了一系列明确为动态语言需求所设计的服务,包括同享的动态类型系统、标准托管模型(Standard Hosting Model),以及轻松生
张善友
2018/01/30
1.1K0
.NET 基金会项目介绍-DLR/IronPython2/IronPython3
DLR/IronPython2/IronPython3 是属于 .Net 基金会的一个项目,本文将简要介绍该项目相关的信息。
newbe36524
2020/03/16
8100
❤你确定不来看看?JVM青铜段位笔记(一)❤
    大部分Java开发人员,除会在项目中使用到与Java平台相关的各种高精尖技术,对于Java技术的核心Java虚拟机了解甚少,一些有一定工作经验的开发人员,打心眼儿里觉得SSM、微服务等上层技术才是重点,基础技术并不重要,这其实是一种本末倒置的“病态”。如果我们把核心类库的API比做数学公式的话,那么Java虚拟机的知识就好比公式的推导过程。
上分如喝水
2021/08/16
5370
❤你确定不来看看?JVM青铜段位笔记(一)❤
JVM支持动态语言的技术难点和解决策略
动态语言是一种在运行时可以改变其结构的编程语言,与静态语言相对。JVM(Java虚拟机)最初是为解释执行Java语言而设计的,但随着时间的推移,JVM也逐渐提供了对动态语言的支持。
一凡sir
2023/08/17
4180
JVM支持动态语言的技术难点和解决策略
《Kotlin极简教程》第一章 Kotlin简介100% interoperable with Java™
JetBrains开源其Kotlin语言 基于JVM的新编程语言。 Kotlin,类似 Xtend 一样,旨在提供一种更好的 Java 而非重建整个新平台。这两种语言都向下编译为字节码(虽然 Xtend 是首先转换成相应的 Java 代码,再让 Java 编译器完成繁重的工作),而且两者都引入了函数和扩展函数(在某个有限范围内静态地增加一个新方法到某个已有类型的能力)。Xtend 是基于 Eclipse 的,而 Kotlin 是基于 IntelliJ 的,两者都提供无界面构建。能够首先演变到其他 IDE 的语言有可能成为最后的赢家。
一个会写诗的程序员
2018/08/20
8750
《Kotlin极简教程》第一章 Kotlin简介100% interoperable with Java™
JS引擎(2):Java平台上JavaScript引擎—Rhino/Nashorn概述
Rhino和Nashorn都是用Java实现的JavaScript引擎。它们自身都是普通的Java程序,运行在JVM上
周陆军博客
2023/04/09
3.5K0
JVM 优点与缺点的深入分析
Java 最初诞生的时候,它可以说是其他语言的进化版。不仅因为Java很简单,而且这一进化的语言还是一个可以运行第三方硬件字节码的虚拟机。它还是垃圾收集站,从而令存储管理和内核转储(core dump)不再是麻烦。当然还有它相当全面的类库。虽然它没有什么惊世的新性能,但它把许多语言的优点基于一身。
阳光岛主
2022/01/10
1.3K0
JVM 优点与缺点的深入分析
动态语言满足动态数据库开发
     在微软的Web 2.0大会上,官员们开始介绍“Jasper”。在一场名为“用Dynamic ADO.Net快速建立数据驱动网页”的活动中,微软的官员们开始介绍如何同时使用动态语言的概念和ADO.Net来开发“数据驱动网页”,“这即使是对于最复杂的数据库都是可升级的。”      Jasper是微软ADO.Net Entity Framework的一系列扩展。ADO.Net Entity Framework帮助开发者在数据库中建立数据模型。微软希望将整个ADO.Net Entity Framewor
张善友
2018/01/30
1.1K0
各种 Python 实现的简单介绍与比较
来源:Python开发者 ID:PythonCoder 当谈到Python时,一般指的是CPython。但Python实际上是一门语言规范,只是定义了Python这门语言应该具备哪些语言要素,应当能完成什么样的任务。这种语言规范可以用不同的方式实现,可以用C实现,也可以用C++、Java、C#、JavaScript,甚至使用Python自己实现。这篇文章就是简要介绍并比较不同的Python实现,并且今后还会不断的扩充。 CPython CPython是标准Python,也是其他Python编译器的参考实现
小小科
2018/06/20
1.1K0
Python语言与其他语言对比
python作为一门高级编程语言,它的诞生虽然很偶然,但是它得到程序员的喜爱却是必然之路,以下是Python与其他编程语言的优缺点对比:
py3study
2020/01/19
1.2K0
原子性、可见性以及有序性
虚拟机 何为虚拟机呢?虚拟机是模拟执行某种指令集体系结构(ISA)的软件,是对操作系统和硬件的一种抽象。其软件模型如下图所示: 计算机系统的这种抽象类似于面向对象编程(OOP)中的针对接口编程泛型(
xiangzhihong
2018/01/26
1.4K0
DLR 的扩展库 Dynamitey
.NET 在 CLR 对动态语言或者脚本语言的支持是通过DLR 完成的, Miguel de Icaza对 DLR 的特点概括如下:
张善友
2022/12/02
3430
Java极客眼中的WebAssembly
作者 | EDOARDO VACCHI 译者 | 冬雨 策划 | Tina   不少 Java 开发人员在面对 WebAssembly 一词时,首先会想到这是一种“浏览器技术”,之后可能会认为“还是归结为 JVM”。毕竟浏览器内应用对他们而言是一种“史前生物”。 最近数周内,围绕 WebAssembly,多项技术呈密集发布,例如 Docker+wasm 技术预览等。作为一名 Java 极客,我认为不应视 WebAssembly 为一时风尚而置若罔闻。 文如其名,WebAssembly(wasm)的确
深度学习与Python
2023/04/01
9550
Java极客眼中的WebAssembly
关于跨平台的一些认识
前段时间看了 周志明的那本 《深入理解java虚拟机》。对于平台无关性问题,有了一些新的认识。所以特写一篇博客来进行总结。
大道七哥
2019/08/23
5880
关于跨平台的一些认识
使用动态语言来制作silverlight
在silverlight beta 2 中已经支持了动态语言.但是在Visual Studio 和 Experssion Blend中还没有使用动态语言的模版.我们目前只可以手动建立. ok  开始吧
用户1172164
2018/01/16
9430
使用动态语言来制作silverlight
JDK7新特性概览JSR292:支持动态类型语言(InvokeDynamic)G1 垃圾回收器(Garbage-First Collector)JSR334:小的语言改进(Project Coin)核
JSR292:支持动态类型语言(InvokeDynamic) 图 1. 项目图标--达芬奇设计的直升机 近年来越来越多的基于 JVM 的动态语言的出现,对于 JVM 提出了新的需求和挑战。其实在 JD
JavaEdge
2018/05/16
2.4K0
为什么java不是最强的语言而JVM确可以叫做最强的虚拟机呢?
关于java虚拟机 jvm 我们很多人都在开发中或多或少听到过这个词语,凡事java程序需要调优性能的提升一定绕不过java虚拟机的这关
冷环渊
2021/12/27
6030
为什么java不是最强的语言而JVM确可以叫做最强的虚拟机呢?
相关推荐
微软发布IronRuby
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档