第3回:Rubyの拡張によるアプローチの違い (3/3)

Toward Integration/システム統合への道
Toward Integration/システム統合への道

第3回:Rubyの拡張によるアプローチの違い
著者:IONA Technologies  Steve Vinoski
訳者:日本アイオナテクノロジーズ  江川 潔   2006/12/27
前のページ  1  2  3
Extension部分のコーディング

   連携用のコードや拡張用のコードをCやC++でRuby向けに作成することは難しくありません。しかし拡張用コードの中から利用するRuby C APIの機能を詳細に解説したものを見つけることは難しいことでしょう。その中でも「Programming Ruby3」は推奨したい1冊です。この本ではCによるRuby拡張のコーディングの一般的な方法に加えて、拡張用のAPI機能についての記述が数多く掲載されています。もし独自の拡張用コードを書くのであれば、必読ともいえるでしょう。

   例えば、拡張用のコードでC++やCのミドルウェア用ライブラリへ直接アクセスするとします。そのときRubyのパッケージにあるモジュールの多くはRubyではなく、Cで書かれてOSの機能にアクセスすることもあります。そのためミドルウェア用に行う拡張では、ミドルウェアの機能をラッピングする新しいRubyのモジュールを作ることになります。

   これは、前述のRubyモジュールがOSの機能をラッピングするようなものです。Rubyアプリケーションは、作成したミドルウェアモジュールをRubyモジュールと同様に利用できます。それらはRubyもしくはC、その他の言語で書かれていても関係ありません。

   もし「Programming Ruby3」に必要なRuby APIの記述がなくても、インストール済みのRubyモジュールの機能で使えるものが数多くあります。またRubyのソースコードを調べることで、どのような機能でも動作を理解することができるでしょう。

   Rubyのmkmfモジュールは、拡張コードを簡単に作成します。次のような内容で、名前がexconf.rbというRubyファイルを作るだけです。

require 'mkmf'
create_makefile('myextension')

   ここで、myextensionという文字列は作成するRubyモジュールの名前です。そして次のコマンドを実行します。

ruby extconf.rb

   これでMakefileを生成することができます。その後「make」を起動することで拡張機能をビルドできます。なお、ちょっとしたオプションをextconf.rbファイルに追加することでビルドのカスタマイズが可能です。例えばincludeパスやライブラリや関数の存在を検証することもできます。

   extconf.rbは現在のディレクトリにあるすべてのC++とCのソースファイルをMakefileに設定します。「make」によって共有ライブラリやダイナミックリンクライブラリ(DLL)を作成し、必要となったモジュールをRubyがアプリケーションの中へロードします。

   myextensionという名前のモジュールの場合は、共有ライブラリの中にInit_myextensionという名前のC関数が存在することが前提なので、共有ライブラリをロードする際にRubyはこの関数を呼び出して拡張機能の初期設定を行います。この関数の中で、拡張機能のRubyモジュールやクラス/関数をセットアップするのに必要なRuby API関数を呼び出します。

   難しいところは、Rubyのレイヤの機能を公開するために設計し、コードを書く実装の部分です。先述したように、インピーダンスのミスマッチの問題のために、機械的に生成したコードに頼るよりも、何をRubyのレイヤで公開したいかということを設計することが必要です。


ダイナミック言語が作るレイヤ

   話をMacのIOKitフレームワークの例に戻すと、ノートPCの電源やバッテリ情報にアクセスするCの関数を闇雲に公開するのではなく、必要となる様々なデータ型をサポートするためだけに、それらをラップするC関数を書くことにしました。この機能だけRuby下のレイヤで実現することで、不必要な細かいことをRubyコード外に置くことができるのです。

   このRuby/C++ミドルウェア統合では、Rubyで書かれたモジュールをRubyのアプリケーションが利用する多重のレイヤ構造を採用しました。このモジュールは、順次Cで書いたモジュールをラッピングし、ミドルウェアシステムに直接アクセスしています。このレイヤ構造のアプローチは、いくつかの利点があります。

   例えばアプリケーションレイヤはRubyとCの境界ではなく、RubyとRubyの間にあります。これによって、多くをRubyで実装することによってアプリケーションインターフェースの開発を単純化でき、C言語のみの場合よりも容易に開発が行えます。

   またRubyモジュールがRubyとCの境界を包含することで、アプリケーションの直接のアクセスから隠蔽することもできます。アプリケーションインターフェースや既存のアプリケーションに影響を与えることなしに、境界を跨いで機能の配置を変えることができます。

   これによりRubyからCへの境界が隠蔽されるので、Cのコードだけでインピーダンスミスマッチの問題を解決する必要はなくなります。インピーダンスミスマッチの一部をCのレイヤで解決し、一部をRubyモジュールで解消します。必要があれば、Rubyアプリケーションに影響を与えないようなCのレイヤを作るためにRubyモジュールには、慣用的なプログラミング方法をしないようなコードを作成します。

   このようにSOAの開発において、SOAネットワーク上のアプリケーションが利用できる特定のサービス機能の開発要件は、設計のプロセスと正確に一致する必要があることが必須です。あるテクノロジーの上でオブジェクトを直接公開するようにサービスを作る方法は、実装のための多くの細かい情報がサービス利用者に見えたり影響を与えてしまうために、一般的に良い方法とはいえません。

   SOA開発担当者がサービス設計に注力すべきことは明らかであり、そのためにもエンキャプスレーション(包含関係)をはじめとして、テクノロジー同士の境界線やカップリング(組み合わせ)、結合の方法についての課題を検討する必要があるのです。

   これまで説明してきたように、ミドルウェア統合のためにRubyを拡張することは比較的簡単に行えます。もしかしたら最初は大変だと感じるかもしれませんが、書籍やオンラインドキュメント、サンプルコード、「comp.lang.list」のようなRubyコミュニティ、そしてUsenetグループとRubyのソースコードそのものなどを利用することで、開発のスピードを上げることは容易でしょう。

   Rubyを利用することにより生産性が向上し、結果的に統合プロジェクトを実施する価値も高いものとなるのです。

参考文献
  1. M. Schmidt, Enterprise Integration with Ruby, Pragmatic Bookshelf, 2006.
  2. S. Vinoski, "RPC Under Fire," IEEE Internet Computing, vol. 9, no. 5, 2005, pp. 93-95.
  3. D. Thomas, Programming Ruby, second ed., Pragmatic Bookshelf, 2005.
  4. S. Vinoski, "Old Measures for New Services," IEEE Internet Computing, vol. 9, no. 6, 2005, pp. 72-74.

前のページ  1  2  3

Translated from the original English version and reprinted with permission, from "Ruby Extension" IEEE Internet Computing September/October 2006 issue of the "Toward Integration" column, by Steve Vinoski, vol. 10, no. 5, 2006, pp. 81-83. (c) 2006 IEEE.

This material is posted here with permission of the IEEE. Such permission of the IEEE does not in any way imply IEEE endorsement of any of Think It's products or services. Internal or personal use of this material is permitted. However, permission to reprint/republish this material for advertising or promotional purposes or for creating new collective works for resale or redistribution must be obtained from the IEEE by writing to pubs-permissions@ieee.org.

By choosing to view this document, you agree to all provisions of the copyright laws protecting it.
IONA Technologies,Plc. Steve Vinoski
著者プロフィール
IONA Technologies,Plc.   Steve Vinoski
IONA Technologiesの主管エンジニア。
17年以上にわたりミドルウェアの仕事に従事し、Object Management Group(OMG)やWorld Wide Web Consortium(W3C)においてミドルウェアの標準化に貢献している。IEEE Internet Computing Magazine の"Toward Integration"コラムを執筆しているほか、IEEE Internet Computing MagazineとInternational Journal of Web Service Researchの編集委員を勤めている。
日本アイオナテクノロジーズ株式会社 江川 潔
訳者プロフィール
日本アイオナテクノロジーズ株式会社
テクニカルセールスマネージャ  江川 潔

株式会社富士通SSLでNTT仕様のオペレーティング・システムの開発に従事したのち、日本ディジタルイクイップメント株式会社でNTT向けシステムの開発、その後、ソフトウェアとハードウェアのプリセールス活動を展開した。DECの合併を経て、現職のミドルウェア製品のマーケティング、アライアンス、プリセールスなどに従事。


INDEX
第3回:Rubyの拡張によるアプローチの違い
 Rubyをエンタープライズで使う
 2つのアプローチ
Extension部分のコーディング
Toward Integration/システム統合への道
第1回The Social Side of Services/サービスの社会的な側面
第2回Rubyを使ったエンタープライズ・インテグレーション
第3回Rubyの拡張によるアプローチの違い

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored