他言語ライブラリの利用 (立石 孝彰)
- スピーカー
- 立石 孝彰
- プロフィール
- 研究員
- 講演時間
- 14:10〜14:40
- 講演者による資料
- http://ttsky.net/ruby/RubyKaigi2007/UsingNonRubyLibs-v2.pdf
自己紹介
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についても。
既存のライブラリを使ってデータの変換を考えるか、新規にライブラリを使うか、場合による。限定された簡単なことをするには、ブリッジライブラリが良いだろう。
Keyword(s):
References:[RubyKaigi2007速報ログ]