IronRuby 初览
【原文地址】 First Look at IronRuby
【原文发表日期】 Monday, July 23, 2007 8:45 AM
过去的几年里,我们一直致力于使得.NET和CLR成为出色的动态语言环境。大概14个月前,在我的开发团队内,我们组成了一个专门的开发组,专注于增加对动态语言的丰富CLR运行时支持,以及推出流行动态语言的第一流.NET实现。
DLR 背景知识
今年春天,我们发布了我们称之为“动态语言运行时(Dynamic Language Runtime)”(简称为DLR)的新.NET库的第一个预览版。该库提供了一组建立在CLR基础之上,特为动态语言场景而设计的特性。这些特性包括,一个共享的动态类型系统,语言宿主模型,以及能产生快速动态代码的基础设施支持。这些特性极大地简化了高质量的动态语言的.NET实现的构建。这些实现可以访问和使用.NET框架中的任何API,还可以轻松地与用任何一门.NET语言编写的代码进行互操作。譬如,你可以编写一个Ruby类,在其中调用一个C#类,这个C#类进而调用一个Python类。
今年春天,在MIX 07大会上,我们宣布了微软将发布四门动态语言的.NET实现:
- IronPython
- IronRuby (新)
- Javascript
- 动态 VB (新)
我们的IronPython实现的源代码,以及底层的DLR库的源代码四月份已经在CodePlex上发布。你现在就可以在IronPython codeplex网站上下载这2者的源代码。所有的源代码都是在MSPL permissive license许可下发布的,该许可提供了完全的商业性和非商业性改动代码的权利。
IronRuby Pre-Alpha 发布
今天,我们发布了我们的IronRuby实现的第一个公开预览版。你可以在John Lam这里的博客贴子里进一步了解如何下载源代码,如何编译,以及如何试验这个预览版。
今天这个IronRuby预览版还是一个非常早期的版本,几个语言特性和大部分的库还没有实现(所以我们称之为“pre-alpha”版呢)。但它确实实现了大部分的核心语言支持,而且可以使用标准的.NET类型和API。
IronRuby是被设计来利用一个我们称之为“Dynamic Sites”的新DLR特性的,该特性提供了一个快速的,可适应性的(adaptive) call-site方法缓存的实现。它还使用了CLR的轻量级代码生成特性。轻量级代码生成允许动态语言的实现在运行时创建内存中的IL,继而JIT为本机代码,而不用在硬盘上保存什么东西。这可以导致比解释性代码好得多的运行时性能,轻量级代码生成特性确保了一旦用完JIT过的代码之后,我们可以将其垃圾回收以避免内存泄漏。
我们今天发布的这个预览版主要是针对那些对语言实现有兴趣的开发人员的,这样他们可以开始研究IronRuby源代码,以及了解它是如何实现的。有兴趣把玩Ruby的.NET实现早期版本的开发人员也可以下载相应代码,尝试一下它的功能。
IronRuby 项目计划
下个月,我们将把IronRuby源码库移到RubyForge上。同时我们也将开放这个项目,允许非微软开发人员加入这个项目的开发,以及贡献源码。然后我们将继续实现剩下的语言特性,修正随着更多的库和源代码移植过来时发现的兼容性问题。
其结果将是一个建立在.NET之上的,任何人都可以免费使用的,兼容性良好的,快速的,和灵活的Ruby实现。
IronRuby "Hello World" 控制台例程
如果你下载和编译了IronRuby源码,你大概在想“我该如何开始使用它呢”?
想上手的最简单的方法就是运行rbx.exe,一个交互性控制台应用,默认情形下是编译在\bin\release目录里的:
这个控制台shell提供了交互性编写Ruby代码的功能。在写完每一行后,这个shell就会立刻执行相应代码。
例如,我们可以键入 puts "Hello World" 来输出“hello world”:
想连续输出这个字符串10次,我们可以键入下列代码:
要在IronRuby中使用Windows Forms功能的话,我们可以键入一个require语句,来引用System.Windows.Forms程序集,然后使用MessageBox.Show方法来在一个模态对话框里显示消息:
IronRuby "Hello World" WPF 例程
在.NET之上实现一门语言的一个好处是,它允许使用该语言的开发人员完整地访问.NET框架提供的丰富的框架库。
作为对这个好处的一个简单示范,我将建一个HelloWPF.rb文本文件,在其中输入下列Ruby代码:
上面的代码使用了WPF UI框架,建立一个窗口,内含一个StackPanel布局管理器,开始时只包含一个按钮。按钮被点击后,创建了一个新的标签控件,加到StackPanel中 (导致该控件在Window中自动流动到相应位置)。
然后我可以将HelloWPF.rb文件作为参数传给rbx.exe来运行上面这个应用:
当我运行它时,我将得到一个内含一个WPF按钮的窗口(注意上面,我在上面的代码里给这个按钮加了一个好看的DropShadowBitmapEffect效果):
我每按一下这个按钮,一个新的标签控件就会添加进上面的窗口中:
可以使用所有的.NET API自然威力无比,但你也可以注意到,在我们编写的代码中,是如何自然地将.NET API集成进其他的语言句法的:
在上面的代码片段里,我使用了Ruby的block语言特性(类似于C# 3.0和VB9中的Lambda表达式),来实现WPF按钮的Click事件处理方法。注意在该block里,是如何使用标准的Ruby命名模式来访问任何.NET API的。比如,不是使用WPF Label控件的“FontSize”属性,我们用了“font_size”作为属性访问名字来访问该属性。IronRuby自动处理这样的命名转换,允许开发人员使用一致的命名模式来编程,而不用管他们所选择的语言。
结语
如果你有兴趣试验一下IronRuby这个早期版本的话,你可以在这里下载和编译其源码。
然后,你可以在这里下载我上面的WPF例程,自己运行一下(注:你必须预先安装了.NET 3.0 或 3.5,因为这些版本才提供WPF API)。想进一步了解WPF的话,我强烈推荐Adam Nathan的优秀著作《WPF Unleashed》(阅读一下Amazon上该书的评语就知道我推荐的理由了)。
希望本文对你有所帮助,
Scott