MacRubyとLLVMを導入してRubyでネイティブGUIアプリを作る

2011.01.23 / ruby

(2011/1/23 23:00追記) macrubycはLLVMから入れなくてもmacrubyをインストールするだけで一緒にインストールされます。下記内容は誤りを含んでいますのでご注意ください。ご指摘いただいたwatson1978さん、ありがとうございました。

最近Macアプリケーションが気になっていて、Cocoa周りの話を調べています。その一環でRubyでMacアプリを作る方法についての話です。

MacRuby

Mac上でRubyでアプリケーションを作る場合、最初からインストールされてあるRubyCocoaと、最近盛り上がっているMacRubyの2通りの手段があります。 どちらもCocoaを含むいろんなフレームワークをRubyから直接叩けるのですが、RubyCocoaはプロキシオブジェクトを介してCocoaフレームワークを叩くのに対して、MacRubyはプロキシを必要とせずに直接Objective-Cのメソッドにアクセスできるのが大きな特徴です。 実装方法として、MacRubyはRubyランタイムからObjective-Cのランタイム関数を直接呼び出すことで実現しているようです。 感覚的に考えてもRubyCocoaと比べて、MacRubyの方がパフォーマンスが大きく改善されていることが期待できるので、MacRubyで遊んでみたいと思います。

rvmの利用

MacRubyの本家サイトにはインストーラのpackageファイルがあるのですが、もっと手軽に試してみるにはrvmの利用がおすすめです。rvmは複数のRubyを共存させるツールで、いろんなバージョンのRubyを切り替えて使いたいときは必須ツールです。 同僚のmirakuiさんが詳しい記事を書いているので、rvm自身のインストールなど詳細な情報はそちらを参照ください。

ではMacRubyをrvmでインストールしてみます。MacRubyの最新バージョンは2011年1月22日現在で0.8なのですが、rvmのバージョンを最新にしないとバージョン指定でインストールできないようです。

  $ rvm update --head
  $ rvm reload
  $ rvm install macruby-0.8
  $ rvm use macruby-0.8
  

バージョンを確認してみて、次のような出力が得られるとインストール成功です。

  $ ruby -v
  MacRuby 0.8 (ruby 1.9.2) [universal-darwin10.0, x86_64]
  

あとGUI系のライブラリを利用するためにHotCocoaのgemもインストールしておきます。

  $ gem install hotcocoa
  

Hello World!

まずは簡単なHello Worldアプリをつくってみます。「ruby hello_world.rb で」ウィンドウ上にボタンを表示し、ボタンクリックでHello Worldをputsさせます。

1st MacRuby App

MacRubyはKernelモジュールにframeworkメソッドを追加しているので、このメソッドでCocoa機能を呼び出します。 あとのコードも大体読めばわかる程度のレベルだとおもいます。Objective-Cだと抵抗あるRubyエンジニアもこれだとMacアプリも怖くないですね!

MacRubyコンパイラを利用してネイティブアプリ化する

このままだとただのRubyスクリプトなので、これをネイティブアプリ化します。 (2011/1/23 23:00追記、macrubycはmacrubyに梱包されているので、LLVMからインストールする必要はありません。一応、備忘録のために導入方法だけ残しておきます。) ネイティブアプリ化を行うためには、LLVMが提供するツールのmacrubycを利用します。macrubycはMacRubyをインストールするだけだと使えないので、LLVMのビルド、インストールが必要です。

LLVMはバージョンに依存するようで、僕の場合はrvmのサイトの内容を参考にして、次の手順で導入できました。

  $ svn co -r 106781 https://llvm.org/svn/llvm-project/llvm/trunk llvm-trunk
  $ cd llvm-trunk
  $ env UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" CC=/usr/bin/gcc CXX=/usr/bin/g++ ./configure --enable-bindings=none --enable-optimized --with-llvmgccdir=/tmp
  $ env UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" CC=/usr/bin/gcc CXX=/usr/bin/g++ make -j2
  $ sudo env UNIVERSAL=1 UNIVERSAL_ARCH="i386 x86_64" CC=/usr/bin/gcc CXX=/usr/bin/g++ make install
  

makeのときに追加しているj2オプションの「2」の値はビルドを行うCPUのコア数に合わせて最適化を行ってみてください。なお、このビルドは1時間近くかかるので、時間があるときに試すのをおすすめします。

  $ which macrubyc
  /usr/local/bin/macrubyc
  

のようにエラーがなく結果が返ってくればインストール成功です。

では、早速先ほどつくったhello_world.rbをコンパイルしてみましょう。コンパイルは簡単で次のコマンドでコンパイルできます。

  $ macrubyc hello_world.rb -o hello_world
  

これでhello_worldという名前の実行可能ファイルができるので、

  $ ./hello_world
  

で、実行できます。無事、ウィンドウが表示されましたね!

まとめ

rvmでMacRubyは簡単に導入することができるので、Objective-Cを諦めていて人もRubyで手軽にMacアプリの作成を試すことが確認できました。 また、LLVMを導入することでネイティブアプリも作成することができるので、RubyでのMacアプリケーション開発の可能性の大きさも伺えますね!