BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

全新安装器大幅提升Windows平台Ruby性能

| 作者 Mirko Stocker 关注 0 他的粉丝 ,译者 杨晨 关注 0 他的粉丝 发布于 2009年8月30日. 估计阅读时间: 7 分钟 | CNUTCon 了解国内外一线大厂50+智能运维最新实践案例。

Antonio Canginano的最新Ruby基准测试表明,IronRuby的性能优于Ruby 1.8.6。Luis Lavena对此不以为然,他认为Antonio只是“将IronRuby的性能和一个在官方一键式安装中使用的那个12岁的老旧编译器(VC6)进行对 比”。Luis的工作即是开发一键式安装器的替代品,这个替代品的性能将会像在第二次基准测试中那么优秀。

InfoQ采访了Luis Lavena以期了解更多信息,而我们最想知道的,是Ruby 1.8.6和1.9的新Windows安装器。

虽然Ruby社区感到非常有用,但是事实上肯定有比写一个安装器更加激动的事情吧?

是的,事实上有更多比构建和重新构建Ruby以及其依赖直到正常运行更加有意思的事情可以做。但是这件事情对我来说如芒在背,不做不行。

个人来说,在开发时,我在Windows下将Ruby作为连接C、C++甚至是汇编语言的连接工具和脚本工具。Ruby在关注和自动化某些任务方面帮了我大忙。

我认为有必要分享我这么多年来在这个开放和包容的社区所获得的知识和经验。

新的安装器和旧有的有何不同呢?

新的安装器关注于正确地安装使用Ruby,以及更加紧密方便地和Windows整合在一起。

另一个重点是它减少了Linux和Windows用户之间的隔阂。大多数Windows用户缺乏在Windows下构建程序的知识,他们只能等到gem的作者或者其他人发布Windows的原生gem。

现在有个大麻烦了:因为Ruby创建扩展以及它与编辑器集成的方式迫使其不得不使用这个有12年历史的老编译器(Visual C 6.0)。

这个安装器将是全新的,而不是由一些Ruby核心开发者发布的程序组成,因此我们能够更加深入地调整配置和选择捆绑的插件等。

并不仅仅是这些,我们将会替代一些依赖程序,例如使用纯净的ruby版readline(叫做rb)来替代GNU的Readline。

为了加快发布周期,新版的安装器不会包含任何第三方库,而这些第三方库在加入到安全器之前通常都会耗费大量的时间来检查和维护。

用户能够得到一个包含Ruby、RubyGems和文档的最小安装器,而且用户可以安装所需的gems,而不用担心大量冗余的下载。

为什么创建一个全新的安装器是如此重要呢?你为啥不能仅仅重编译一下Ruby然后进行处理呢?

也许听起来简单,但是我们并不是简单地打包Ruby然后发布。

Ruby依赖于其他的包,例如ZLib、OpenSSL、Readline和其他需要外部库的包。有一些外部库很难在Windows下找到预编译版本。

当这些程序不存在的时候,我们就不得不自己编译。一个典型的例子就是我们使用的这个还不算太旧的OpenSSL版本,因为它在这个平台下没有最新的版本,并且从源代码编译是一个非常复杂的任务。

有些时候我们不仅仅只是处理Ruby,而且还要升级和调整整个Ruby系统的包和扩展。

如果我们已经安装了一个新Ruby Windows版本,那么会对那些原生扩展的Gems有什么影响呢?我能在新版的RubyInstaller上使用为旧版Ruby编译的Gems和原生扩展吗?

当你试图这样做的时候,你会发现有时候强制使一个gem工作在这个版本的Ruby上是行不通的。这就是RubyInstaller这些年一直在开发的原因之一。

对于那些熟悉C语言的开发者来说,Ruby是全内建的,他们知道当他们编译C程序的时候,他们需要连接到一个叫做CRT的C Runtime库,这个库提供了一些底层服务,例如内存分配、字符串处理和IO等。

Windows下到GCC和VC6编译器都是连接到同一个CRT(MSVCRT.DLL)(更多信息请参见Luis的博客)。

明白这个的话,问题的一部分就解决了,另外一部分是Ruby代码。

现在的情况是,当编译Ruby的时候,它在内部和一些配置文件中保存了编译器的选项,所以,当使用VC6构建的时候,它定义宏RUBY_PLATFORM为“mswin32”,当使用GCC的时候定义为“mingw32”。
理论上,两种都是二进制兼容的,但是现在需要明白的是,使用某些库的Ruby代码是如何和这些库交互的。

有些开发者在他们的库中包含了平台相关的代码,并且决定这个库是否工作在Windows下,他们检查RUBY_PLATFORM,看看是否是“mswin”,“mswin32”或者是比较少见的“win”。

这些库的RUBY_PLATFORM的“mingw32”部分都有问题, 这些代码会让这些库认为你的运行平台是Linux,结果当然是失败的。

所以现在是让这些开发者改正这些坏习惯的时候了。

我曾经建议使用RUBY_PLATFORM =~ /mingw|mswin/这种形式来保护Windows代码。

你决定好了大概什么时候发布第一版吗?

这几个目标已经达到:

  1. 自动获取Ruby 1.8.6以及1.9.1。
  2. 能够将这些程序绑定到安装器中。
  3. 简化使用开发工具包的用户的开发工作。
  4. 使用rake-compiler,使gem作者更加容易地发布Windows版本。

我已经在项目的TODO上写出了一些大致的任务。我将会重新安排它们,然后在RubyInstaller的Wiki上写出来。

一旦我们完成了文档和安装器的大部分任务,我相信我们就要准备发布第一个稳定版了。

更多关于RubyInstaller的信息以及preview 1版可以在Luis的博客上找到。RubyInstaller的代码库位于GitHub。

查看英文原文:New Installer Provides a Much Faster Ruby for Windows

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT