随着Ruby开发者从Ruby 1.8迁移到Ruby 1.9,新的Ruby实现正在日趋成熟。最近,IBM的Antonio Cangiano写了一篇有趣的文章,比较了Windows上Ruby 1.8、1.9和IronRuby的性能,结果出乎许多人的意料。
不幸的是,IronRuby在Rails社区中还不是很有名。
本次采访IronRuby的首席开发者Jimmy Schementi,希望能为您提供一些见解。

Matt:您好Jimmy,非常感谢您抽出宝贵时间回答我们的问题。您能先介绍一下自己吗?
Jimmy:
感谢您提出问题;很高兴看到大家对IronRuby的兴趣日益增长!我住在西雅图,在微软工作,在一个小型团队中开发一个名为“IronRuby”的开源Ruby实现。我个人主要致力于改进IronRuby的代码库,将IronRuby与Silverlight或ASP.NET MVC等.NET相关技术集成,确保我们每月的二进制版本发布顺利,与社区讨论IronRuby,并让微软管理层了解Ruby的优秀之处。当然,核心团队并非我一人。John Lam通过RubyCLR项目激发了对.NET-Ruby实现的兴趣,并启动了IronRuby项目。Tomas Matousek是IronRuby编译器的核心人物,他负责所有编译器代码和近期性能提升的工作。Jim Deville是负责维护IronRuby与大量测试以及出色测试基础设施的关键人物。Shri Borde是我们的经理,他利用业余时间修复库并主持臭名昭著的
“IronRuby结对编程”会议。当然,过去两年里所有IronRuby的贡献者都提供了巨大的帮助。
Matt:关于您最近的博文,您能否告诉我们您是如何学习Ruby的,并为想学习Ruby的人提供一些建议或重要的要点?
Jimmy:我从我的计算机科学教授/导师Gary Pollice那里听说了Ruby,他教授伍斯特理工学院的所有编程语言课程。当时我正在寻找一种富有表现力的编程语言来制作游戏,Ruby非常适合。几年后,我在同一所大学工作,负责构建一个名为Assistment的计算机辅导系统。我和其他几个人受够了Java代码库,将其移植到了Ruby on Rails。这次移植非常成功,现在
http://assistment.org已经是一个Rails系统。在那里,我真正学到了关于Ruby的一切,并对Ruby的工作原理产生了极大的兴趣。当我有一个实质性的Ruby项目可以处理时,我学到的最多,因为我看到了它的表现力如何在大型项目上提高我的工作效率。我仍然建议尝试在一些小事情上学习Ruby,但当您将其用于更大型的项目时,您会真正惊叹。
Matt:IronRuby看起来确实非常有趣,它能运行Rails吗?
Matt:在开始使用IronRuby进行开发之前,我们的读者应该注意哪些局限性?
Jimmy:主要的局限性在于IronRuby不支持任何基于C的Ruby库,只有在1.0之后我们才会考虑在Ruby C API和IronRuby之间构建互操作层。在此期间,人们一直在将他们喜欢的基于C的Ruby库移植到C#,以便可以从IronRuby中使用,例如
Hpricot。虽然这看起来是一个很大的局限性,但Ruby代码依赖的大多数基于C的库在.NET框架中都有等效的API,IronRuby与之直接集成,使得使用或移植非常容易。例如,我在RailsConf上展示的Rails应用程序直接使用System.Windows.Drawing API进行图像缩放,而不是ImageMagick。如果您的代码不依赖于Ruby标准库之外的任何基于C的内容,您应该不会遇到问题。请查看关于在IronRuby上运行Rails的文档,以确保一切顺利:
http://ironruby.net/Documentation/Rails。
Matt:在Windows上使用IronRuby与标准Ruby(Ruby1.8或Ruby1.9)相比,有哪些优缺点?
Jimmy:IronRuby是一个非常快速的Ruby解释器/编译器,这归功于我们自己用于提高Ruby速度的技巧、DLR用于加速动态语言的技巧,以及CLR的即时编译器生成的代码非常高效。我们的目标无疑是成为Windows上最快的Ruby实现。我们最近进行的性能工作仅限于核心库(“Array”、“Hash”等),这帮助IronRuby在Windows上超越了Ruby 1.8.6,并且更接近Ruby 1.9.1。IronRuby将继续探索在每个版本中提高性能的方法。IronRuby也是一个非常符合1.8.6标准的Ruby实现。对于您可能需要的任何1.9特定功能,有一个“-19”标志,对于我们可能包含的任何Ruby 2.0功能,有一个“-20”标志,但这些都没有保证;我们今天只测试1.8.6的行为。我们通过了约85%的RubySpec测试套件,这是用于验证Ruby实现正确性的最佳测试套件。然而,我更关心的是特定Ruby库的测试套件是否有效。我们通过了Rails、RubyGems、Rake和RSpec的测试套件的90%以上,并在被问及时修复兼容性问题,所以如果您遇到任何兼容性问题,请告诉我们。除了我在上一个问题中提到的局限性之外,您应该不会遇到问题。我希望大家尝试在GitHub上托管的最新IronRuby版本上运行Rails应用程序,并请将您发现的任何问题报告到
http://ironruby.codeplex.com。
Matt:使用IronRuby还有其他额外的好处吗?
Jimmy:最显著的优势在于IronRuby可以在Silverlight中运行,Silverlight是.NET框架的一个子集,作为浏览器插件安装在Mozilla类浏览器(如Mac和Windows上的Firefox)、Webkit类浏览器(如Windows上的Safari)以及IE(在Windows上,不用说)中。Mono项目正在实现Silverlight的开源版本,名为“Moonlight”,因此Linux开发者可以运行Silverlight应用程序,我在OSCON 2009上就此进行了演讲
OSCON 2009。这使得您可以在浏览器中使用Ruby而不是JavaScript来控制HTML或矢量图形。目前最好的文档/示例是Gestalt网站
Gestalt网站,这是一个旨在提高Ruby和Python在Silverlight中知名度的小型门户:http://visitmix.com/labs/gestalt。IronRuby网站目前正在变动中,但更清晰的文档即将推出。我还构建了一个名为
“Silverline”的小型Ruby on Rails插件,以便从Rails中轻松使用Silverlight。如果您想使用Ruby作为客户端脚本语言,值得一看。IronRuby与.NET框架直接集成,因此.NET框架中的任何内容或在.NET框架上运行的内容都可以直接从IronRuby中使用。.NET命名空间被公开为Ruby模块,.NET类被公开为Ruby类,您可以像调用Ruby方法一样调用它们。这使得使用静态语言构建系统的一部分(如果适用,例如高性能消息队列、游戏引擎等)然后通过Ruby与其交互变得非常容易。
Matt:为什么微软会对Ruby项目感兴趣?赞助这样一个项目能带来什么好处?
Jimmy:我认为这是一种“你帮我,我帮你”的情况。微软赞助IronRuby有助于Ruby社区,使Ruby成为Windows和.NET上的第一等语言,同时也让.NET开发者可以选择使用Ruby,反过来,IronRuby项目有助于促进驱动Visual Studio销售(C#、VB.NET和F#)的语言的创新。作为一点相关的附加说明:有些人认为Ruby有这么多实现是不好的,就像MRI太糟糕以至于其他人必须修复它一样,但我完全不同意。IronRuby、JRuby、MacRuby以及大多数其他实现都为各自的社区完成了同样的事情;在Ruby开发者和它们之间建立一座桥梁。大多数项目没有必要重新创建MRI,而是受到它的启发,并希望将这种语言带到自己的平台。这对Ruby社区来说是一件好事,因为它比任何其他语言都能提供更多平台、操作系统和库的访问。总之,回到问题:作为IronRuby促进语言创新的一个例子,下一版本的C#将有一个“dynamic”关键字,这意味着静态类型为“dynamic”的变量(=P)应该对任何方法调用执行动态分派,而不是在编译时验证方法调用。这个基础设施直接使用Dynamic Language Runtime,所以C#可以像定义在C#中的Ruby对象一样使用它们,或者任何其他启用动态的对象。
Matt:IronRuby将如何让Rails开发者的生活更轻松?IronRuby的未来计划是什么?
Jimmy:我希望IronRuby能够通过使Windows成为开发和部署的绝佳选择来使现有Rails开发者受益。通过为IronRuby和IIS构建一个Rack适配器(就像我在RailsConf上展示的那样),Rails应用程序可以直接连接到ASP.NET使用的相同Web服务器管道,从而大大减少了通过IIS+FCGI进行部署所带来的开销。这使得在IIS上部署Rails应用程序就像部署ASP.NET应用程序一样,因此系统管理员不必学习全新的框架;对他们来说,这只是ASP.NET。那么,任何希望为其客户提供Rails应用程序的现有ASP.NET商店都可以使用相同的基础设施和部署知识。这为在Windows上部署的技术选择带来了多样性,就像微软帮助PHP在IIS上运行良好一样。IronRuby唯一的明确未来计划是继续在性能和兼容性方面取得进展,并继续支持最新版本的Silverlight和Mono。当社区对这些指标的状态满意时,将发布1.0版本,未来的工作应由IronRuby用户想要的内容驱动。如果您开始使用IronRuby并希望在1.0之前或之后获得某个功能,请将您的请求发布到邮件列表或CodePlex。我们对IronRuby未来的潜力充满希望和梦想,所以请来帮忙!
Matt:您还有什么想补充或与读者分享的吗?