他言語ライブラリの利用 (立石 孝彰)

スピーカー
立石 孝彰
プロフィール
研究員
講演時間
14:10〜14:40
講演者による資料
http://ttsky.net/ruby/RubyKaigi2007/UsingNonRubyLibs-v2.pdf
rubykaigi_some1.jpg

自己紹介

Rubyを触ってかれこれ10年 - システム管理、日常の定型処理。 コンセプトを示すためにライブラリを作って捨てている。 dlも捨てる予定だったけれど標準添付になったのでメンテしている。

興味は言語設計などの基礎理論。

他言語ライブラリ

Ruby以外の言語のライブラリ。ここではこれらのライブラリをRubyから使うという話

なぜ必要か

  • 企業が他言語には提供している機能を使いたい場合
    • Javaや.Netが羨しい?
    • ライブラリではなく仕様が欲しいことはない?
      • 仕様、ファイルフォーマット、プロトコル…
  • 拡張ライブラリを書かなくちゃいけない場合

Rubyにおける外部ライブラリの利用方法

  • 拡張ライブラリを作成する (RubyInlineを含む)
    • ビルド環境が必要
    • 基本的にはC/C++が対象
  • 他言語へのライブラリへアクセスするライブラリを利用
    • ビルド環境が必要ない
    • この講演で説明する
  • XML-RPC、Soap…

FFIとブリッジ・ライブラリ

  • Foreign Function Launguage
    • スタブ(データ変換と関数呼び出し)を生成する
  • ブリッジライブラリ
    • スタブの作成をできるだけ動的に行う

ブリッジライブラリの例としては

  • Ruby/DL (C/C++)
    • 交換可能なデータ: 基本データ(整数など)、構造体、コールバック
      • マージしてないパッチもありますが
    • 型を明示的に指定する必要がある
    • ライブラリをロード、シグネチャを指定、関数をRubyのメソッドにマップして、実行
  • Rjb (Java)
    • 基本データやJavaオブジェクトを扱えます
    • コールバックも可能(インターフェースを実装したオブジェクトをRuby側で作れる)
    • シグネチャを指定するのはオーバーロードされたメソッドなど一部
  • Ruby/JS (JavaScript)
    • JavaScriptのインタプリタをRubyの中で動かす
    • 交換可能なデータ: 基本データのみ
    • JavaScriptのライブラリを使いたいことはあまりないでしょうが
  • Ruby/Python
  • Ruby/Tk Tcl/Tk

Ruby以外の言語では?

  • Perl C::DynaLibモジュール (C/C++)
    • 交換可能なデータ: 基本データ、コールバック、構造体
  • Python dlモジュール (C/C++)
    • 交換可能なデータ: 整数と文字列のみ
      • それ以外はpackを使う
    • 関数の返り値はlongでなければならない
    • どのような用途に使うのかよくわからない
  • Gauche c-wrapper (C/C++/ObjectiveC)
    • 交換可能なデータ: 基本データ、コールバック、構造体
    • Cヘッダファイルをパースして自動的にシグネチャを判断する
    • libffiを利用していて先進的
      • Windowsでは実行するのが大変だった
  • ライブラリ/ファイルのロードが必要
  • シグネチャの定義が必要な場合が多い
    • 自動的に定義されると、言語内のデータと他言語のデータの変換の方法を選択できない、という問題もある
  • コールバックのためのスタブが必要
    • 対象言語上に、自言語へアクセスするためのオジェクトやスケルトンコードを静的/動的に用意する必要がある

こんなことができるとうれしい?

Rubyからライブラリを直接requireするとか、Javaのメソッドをコールバック関数としてCの関数を呼び出すとか。後者を実現するには、規約や共通のプラットフォームが必要だが。

 module MicedLib
   import 'libc' of C
   import 'org.example.MyComparator' of Java
 end

みたいな。今後はこのようなブリッジライブラリのための共通のフレームワークあるいはライブラリを実装したい。また、ブリッジライブラリのための文法やDSLについても。

既存のライブラリを使ってデータの変換を考えるか、新規にライブラリを使うか、場合による。限定された簡単なことをするには、ブリッジライブラリが良いだろう。

Last modified:2007/06/17 04:53:51
Keyword(s):
References:[RubyKaigi2007速報ログ]

Login