Rubyの拡張ライブラリーを書いた
お仕事で必要に迫られ C言語で書かれたライブラリーをRubyから使えるようにできる拡張ライブラリーを初めて書きました。
ネット上を探してみると Ruby用拡張ライブラリをCで作る --- Little Penguin や Ruby拡張ライブラリ作成チュートリアル などの拡張ライブラリーの書き方を説明したページがあり、どんなふうにすれば作れるのかを知るのに役立ちます。 ありがとうございます!
しかし、今は廃止されたマクロが使われている例などもあり、本当に拡張ライブラリーを作る際には正式な文書である README.EXT.ja を読みましょう。 (このファイルはRubyのソースファイルに含まれています)
また、青木さんの書かれた LoveRubyNet Wiki: RubyExtensionProgrammingGuideもRubyのオブジェクトの構造の解説なども書かれていて良いドキュメントだと思います。
作ってみて気がついた事
- Ruby文字列からC文字列を取得する STR2CSTR(value) マクロは廃止になっているので使わない事
- 拡張ライブラリーで定義する関数の第一引数は self です・・・ これを見落とし30分くらい時間をつぶした ^^;
- 拡張ライブラリーが必要なライブラリーをMakefileに追加するには extconf.rb に have_library("ssl", "SSL_library_init")のようにライブラリーを指定する。
- 「Rubyで書ける事は、全てC言語で書ける」どこかは忘れましたが、どこかに書いてありました。 Ruby処理系の関数を呼び出す事でメソッド以外、変数、定数、クラス、モジュール・・・ なんでもC言語で定義できる。
- rubyの添付ライブラリーのソースや extconf.rb は参考になる。
- rubyでテストコードを書きテストしながら作ると良い
- 簡単なメソッドから始め、少しづつ勉強しながら作ると良い