InfoQ

News

MacRuby - Ruby 1.9のObjective-Cへの移植

作者 Werner Schuster, 翻訳者 James Neoman 投稿日 2008年3月10日 午後6時12分

コミュニティ
Ruby
トピック
スクリプティング,
プログラミング,
パフォーマンス&スケーラビリティ

Apple社は、MacOS X上のRubyの改善を目的にした新しいプロジェクトを始めました。MacRuby(サイト・英語)プロジェクトは、Ruby1.9Objective-C実行環境への移植です。

MacRubyプロジェクトのLaurent Sansonetti氏に、それがどのようなプロジェクトで、どのように進んでいるかについてインタビューしました。

 InfoQ: MacRubyプロジェクトは、Apple社の支援を受けていますか?

Laurent Sansonetti: MacRubyは、Apple社が始めたフリーソフトウェアプロジェクトです。今のところ、プロジェクトのメンバは、Apple社の社員です。しかしながら、我々は、もちろん外部の人たちの支援も欲しいと思っていますので、そのために、プロジェクトの開発をMacOSForgeでオープンにする事にしましたし、公開形式で進めています。
InfoQ:  MacRubyは、Ruby 1.9/YARVをベースにされたようですが、元のRuby1.9にどれくらい手を加える必要がありましたか?修正は、オブジェクトの生成方法をRubyのやり方から、Objective-Cのやり方にかえるのに必要なものがほとんどでしたか?ほかには何か修正の必要はありましたか?

Laurent Sansonetti: RubyのオブジェクトをObject-CのオブジェクトとしてC言語のレベルでキャストできるように、Rubyのオブジェクトのデータ構造を、Objective-Cのオブジェクトのデータ構造と整合性を持たせるように変更する必要がありました。

そのほかにも、オブジェクトアロケータをRubyのものから、Objective-Cのものを使うように変更しました。これによって、すべてのオブジェクトが、RubyのものもObjective-Cのものも、同じメモリプールから割り当てられるようになりました。

最後に、もともとのRubyガベージコレクタを取り除き、代わりにObjective-Cのガベージコレクタを使うようにしました。この変更は、簡単ではありませんでした。それは、ガベージコレクタは、デフォルトで世代別モードで動作すること、また、"write-barrier"の情報に基づいて若い世代のオブジェクトを回収するため、オブジェクトが格納領域に登録されるたびに、"write-barrier"が正しく設定されることを想定しているからです。

InfoQ: RubyのクラスにあたるObjective-Cのクラスの生成は、どのようにしているのでしょうか?実行時にすべてのクラスを動的に生成しているのですか?

Laurent Sansonetti: Objecttive-Cのクラスの生成は、Rubyのクラスが定義されると同時に行っています。また、MacRubyからObjective-Cのクラスがアクセスされた場合には、そのクラスは、実際に必要になった時点でYARVにインポートされます。

InfoQ:Rubyのオブジェクトからは、Objective-Cのメソッドは見えますか?

Laurent Sansonetti: もちろん見えます。その反対も同様です。RubyのメソッドもObjective-C側から見えるようになっています。

InfoQ: Rubyで議論になっているものにObjectSpaceがあります。JRuby1.1では、デフォルトでは使えないようになっていますが、Objective-Cでは、どのようしてにObjectSpaceの機能を性能上の問題が出ないように実現しているかご存じですか?
Laurent Sansonetti:  すべてのMacRubyオブジェクトは、同じメモリプールから割り当てられます。より正確には、単一のmalloc領域(詳しくは、/usr/include/malloc/malloc.hヘッダファイル参照のこと)からです。そのため、その領域を調べたり、その中にオブジェクトを生成するのは、大変容易です。この機能の実現には、労力は必要ありません。
しかしながら、手を加えていない元々のRubyに比べてMacRubyでのObjectSpace#each_object呼び出しは、かなり遅いことは覚えておいてください。MacRubyでは、要求されたオブジェクトだけではなく、フレームワークで作成されたObjective-Cの純オブジェクトを含むすべてのオブジェクトを返します。

$ ruby -ve "p ObjectSpace.each_object {}"
ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
310

$ /usr/local/bin/ruby -ve "p ObjectSpace.each_object {}"
MacRuby version 0.1 (ruby 1.9.0 2008-02-18 revision 0)
 [i686-darwin9.2.0]
8759

$ /usr/local/bin/ruby -ve "framework 'cocoa'; p ObjectSpace.each_object {}"
MacRuby version 0.1 (ruby 1.9.0 2008-02-18 revision 0) [i686-darwin9.2.0]
48425
InfoQ: 互換性の点では、いかがでしょうか?Stringsは、NSStringsによるもののようですが、これに関して、互換性の問題はないでしょうか?ネイティブな拡張は、互換ですか?
Laurent Sansonetti: 現時点では、RubyのStringクラスは、NSStingを継承しており、String、NSStringの変換を高速に行います。従って、今のところ互換性の問題はありません。

しかしながら、非常に近い将来、Rubyの基本的なクラス(String、Array、Hash)に関しては、CoreFoundationの等価なもの(CFString、CFArray、CFDictionary)を使って実装し直すことを予定しています。これによって、機能を統一するとともに、双方のランタイムの間でコストをかけずに変換ができるようになります。内部的な経験から、典型的なアプリケーションでは、ランタイムを越えてやりとりが必要なオブジェクトは、ほとんどが基本的なものだとわかっているのもその理由です。

この変更が、もしかしたら、互換性上の問題を引き起こすかもしれませんが、Ruby 1.9とCの拡張部が互換性を保つよう最大限の努力をおこなうつもりです。

InfoQ: MacRubyの今後の計画はどのようになっていますか?
Laurent Sansonetti: MacRubyプロジェクトの最大の目的は、開発者の方々が、Rubyの環境下で非常に効率よく実行できるCocoaのアプリケーションを書けるようにすることです。それは、(今後もサポートは続ける予定ではありますが)Max
OS X Leopardで提供を開始したテクノロジーであるRubyCocoaでは不可能なことです。その目的を達成するためには、まだまだやることがあります。MacRubyが他のユースケースでもうまく動くようにしたいとも思っていますが、今回の変更や近い将来に予定している変更によって、そういったことも可能になるでしょう。マイルストーンの計画とファーストリリースを近日中に予定しておりますので、お見逃しのないよう。

MacRubyプロジェクトの状況確認をしたり、MacOSForgeでMacRubyのソースコード(source)をのぞいてみたりして下さい。Laurentのアナウンスは、ruby-coreリストのMacRubyや、キー付き引数の特殊な文法などのディスカッション(source)をご覧下さい。MacRubyがどう動くかについての詳しい情報に関しては、HowDoesMacRubyWork(source)wikiページをご覧下さい。

原文はこちらです:http://www.infoq.com/news/2008/03/macruby-objectivec

ブックマーク
digg+,
reddit+,
del.icio.us+,
dzone+,
Hatena

No comments

返信

特集コンテンツ一覧

Typemock: その過去・現在・未来

Eli Lopian氏率いるTypemock社の過去・現在・未来について、インタビュー形式にて記します。

企業とSaaSの仮想化がもたらすのは、迅速性(アップ)だけではない

この論文では、仮想化やクラウドサービスの複雑なメリットと実世界における応用を検討します。さらに重要なこととして、Contegixが複雑な問題の解決に仮想化を実装している方法や、仮想化を使うべきではないケースについて詳細を提供します。

RubyのFiberを非同期I/Oに使うNeverBlockとRevactor

Fiberはユーザに試練を課すことなくこの考えを実装する有益な並行性ツールとして、ライブラリが2つあります。まさにこのためのソリューションとしてあるのがNeverBlockライブラリです。私たちはNeverBlockプロジェクトのMohammad A. Ali氏とRevactorライブラリのTony Arcier氏に話を聞きました。

拡張性に関する悪習慣

システムの保守容易性や拡張性を確保するためのベスト・プラクティスに関する記事は数多くありますが、この記事では避けた方がいい、いくつかの悪習慣(ワースト・プラクティス)を強調します。

トップスポーツチームの監督に教わる秘訣

この論文では、氏が発見した原則を要約し、その原則をいかにしてソフトウェア開発に応用するかを説明します。

事例研究:Dutch Railwaysのプロジェクトにおける分散拠点でのスクラム・プロジェクト

この記事では、私達がどのようにして大規模(240人月、10万行強)でインドとオランダの開発者も参加したスクラム・プロジェクトを成功させたのかを示しています。

Agile2008チーム参加レポート - 帰国そして変化

Agileカンファレンスに「参加者としてだけでなく、発表者として参加しよう」を掲げたチームgoyattomは、サブミッションを提出し、7つのセッションが日本から選択されました。参加者はカンファレンスで各々の発表や、各セッションへの参加、諸外国のエンジニアとの出会い、ステージ上で DearXPを熱演などの様々な思い出を抱えて、無事日本に戻ってきました。

SilverlightとJavaのインターオペラビリティ

マイクロソフトのRobert Bellが、SilverlightとJavaを使用したインターオペラビリティのシナリオを紹介し、サンプルコードを例にとってアーキテクチャの手引きを提供します。