2009 年 8 月 11 日,星期二

社区风云:IronRuby

投稿人:Matt Aimonetti

随着 Rubyist 从 Ruby 1.8 迁移到 Ruby 1.9,新的 Ruby 实现逐渐成熟。最近,IBM 的 Antonio Cangiano 撰写了一篇有趣的文章,比较了 Windows 上 Ruby 1.8、1.9 和IronRuby之间的性能,让人大跌眼镜。

不幸的是,IronRuby 在 Rails 社区中还不是非常知名。

以下为 IronRuby 首席开发人员Jimmy Schementi的采访,帮助我们略窥一二。

iron ruby logo

Matt:Hi 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 的 Rails。这是一次成功,而且 http://assistment.org 现在是一个 Rails 系统。那正是我真正学到 Ruby 相关知识的地方,还开始对 Ruby 的工作原理极感兴趣。我从 Ruby 中学习到最多的东西是,当我有一个要处理的重大 Ruby 项目时,因为我得以看到其表现力,使我在大规模方面更加高效。我仍然建议尝试在这里和那里的小事情上学习 Ruby,但如果你用在较大的事情上,你一定会惊叹。
Matt: IronRuby 看起来当然非常有趣,你能在它上面运行 Rails 吗?
Jimmy: 是的,在 2009 年的 RailsConf 上,我展示了 IronRuby 正在运行非平凡 Rails 应用程序。IronRuby 可以在 WEBrick 上运行 Rails,还可以运行 Windows 附带的 Web 服务器 IIS。对于数据库,你可以使用 SQLServer Express(它是免费的),也可以使用任何基于 .NET 的数据库,例如最近的 cshars-sqlite 端口。以下在 2009 年 RailsConf 上刊登的 IronRuby on Rails 演讲的详细帖子:http://blog.jimmy.schementi.com/2009/05/ironruby-at-railsconf-2009.html
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 的任何内容,那么你应该没有任何问题。 ознакомьтесь с документацией по запуску Rails в IronRuby, чтобы убедиться, что все идет гладко: http://ironruby.net/Documentation/Rails.
马特:在 Windows 上,与标准 Ruby(Ruby1.8 或 Ruby1.9)相比,使用 IronRuby 的优缺点是什么?
吉米:IronRuby 是一款非常快的 Ruby 解析器/编译器,因为它利用我们自己的技巧来让 Ruby 运行得更快,DLR 利用这些技巧来让动态语言运行得更快,而 CLR 的 JIT 编译器则会生成非常高效的代码。我们的明确目标是成为 Windows 上最快的 Ruby 实现。我们近期进行的性能工作只涉及核心库(“数组”、“散列”等),因而帮助 IronRuby 超越 Windows 上的 Ruby 1.8.6,并更加接近 Ruby 1.9.1。IronRuby 将持续探索在每个版本中提升性能的方法。此外,IronRuby 还是一个非常符合 1.8.6 的 Ruby 实现。你可以使用“-19”标志获得任何你可能需要的特定 1.9 功能,以及“-20”标志获得我们可能已经拥有的任何 Ruby 2.0 功能,但这些标志并未得到保证;我们今天只测试 1.8.6 行为。我们通过了约 85% 的 RubySpec 测试套件,这是验证 Ruby 实现是否正确的最佳测试套件。不过,更让我关心的数字是特定 Ruby 库的测试套件是否有效。我们通过了 Rails、RubyGems、Rake 和 RSpec 的测试套件,通过率超过 90%,并且在收到询问后修复了兼容性问题,因此请告知我们你的应用程序是否遇到了任何兼容性问题。除了我之前的一个问题中提到的限制之外,你应该不会遇到任何问题。我很高兴看到人们在 GitHub 上托管的最新 IronRuby 代码上试运行他们的 Rails 应用程序,并请在http://ironruby.codeplex.com上报告你发现的任何问题。
马特:使用 IronRuby 还存在任何其他优势吗?
Jimmy: 最为突出的优势是 IronRuby 可以在 Silverlight 中运行,Silverlight 是 .NET 框架的一个子集,可作为浏览器插件安装在基于 Mozilla 的浏览器(例如,Mac 和 Windows 上的 Firefox),基于 Webkit 的浏览器(例如,Windows 上的 Safari)和 IE(在 Windows 上)中。Mono 项目正在实施一个名为“Moonlight”的 Silverlight 开源版本,以便 Linux 开发人员可以运行 Silverlight 应用程序,我在 OSCON 2009 上对此进行了讨论。该版本使您可以直接通过 Ruby 编写浏览器代码,替代 JavaScript,以控制 HTML 或矢量图形。目前有关于文档/示例的最佳位置为 Gestalt 网站,这是一个旨在促进在 Silverlight 中使用 Ruby 和 Python 的小型门户网站:http://visitmix.com/labs/gestalt。IronRuby 网站目前正在变更中,但更清晰的文档即将推出。我还构建了一个小巧的 Ruby on Rails 插件,称为 "Silverline",以便从 Rails 中轻松使用 Silverlight。如果您想要将 Ruby 用作客户端脚本语言,值得一试。IronRuby 与 .NET 框架直接集成,因此可以从 IronRuby 直接使用任何位于 .NET 框架中或在 .NET 框架上运行的内容。.NET 命名空间公开为 Ruby 模块,.NET 类公开为 Ruby 类,您可以像调用 Ruby 方法一样调用这些方法。这使得您可以在静态语言中轻松构建系统组件(如果使用有道理,例如用于高性能消息队列、游戏引擎等),然后通过 Ruby 与其进行交互。
Matt: 为什么 Microsoft 对 Ruby 项目感兴趣?赞助此类项目对他们来说有什么好处?
Jimmy: 我看这就像“你帮我,我帮你”的情况。微软赞助 IronRuby,有助于让 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# 可以使用 Ruby 对象,就像它们在 C# 中定义的一样,或者任何其他启用动态的对象。
Matt: IronRuby 将如何使 Rails 开发人员的生活更轻松,以及 IronRuby 的未来计划是什么?
Jimmy: 我的希望是,IronRuby 通过使 Windows 成为开发和部署的一大选择,让现有 Rails 开发人员受益。通过专门为 IronRuby 和 IIS 构建 Rack 适配器(就像我在 RailsConf 中展示的那样),Rails 应用程序可以直接连接到 ASP.NET 所使用的相同的 Web 服务器管道,从而显著减少了当今通过 IIS+FCGI 部署给你的开销。这使在 IIS 上部署 Rails 应用程序就像部署 ASP.NET 应用一样,因此系统管理员不必学习全新的框架;对他们来说,这只是 ASP.NET。然后,任何现有的 ASP.NET 商店都可以向其客户提供 Rails 应用程序,并拥有相同的基础设施和部署专业知识。这为在 Windows 上部署的技术提供了选择,就像微软帮助 PHP 在 IIS 上运行良好一样。IronRuby 唯一的明确未来计划是继续提高性能兼容性,并继续支持最新版本的 Silverlight 和 Mono。当社区对这些指标现况感到满意时,1.0 将发布,未来的工作应该由 IronRuby 用户的需求驱动。如果您开始使用 IronRuby,并希望在 1.0 之前或 1.0 之后使用某项功能,请将请求发布到邮件列表或 CodePlex。对于 IronRuby 未来可以做什么,我们有很多希望和憧憬,所以请来提供帮助!
Matt: 是否还有什么想要补充或与读者分享?
Jimmy:感谢 Matt 接受采访,感谢读者们的支持!前往 http://ironruby.net/download 获取 0.9 版本,或从 http://github.com/ironruby/ironruby 获取最新源代码,并告知我们您在使用时是否遇到任何问题。希望您能帮助 IronRuby 达到 1.0 版本。