ソフトウェアサイエンス特別講義C Ruby インタプリタの構成に見る 実際の

ソフトウェアサイエンス特別講義C
Ruby インタプリタの構成に見る
実際のシステムソフトウェア
笹田耕一
Heroku, Inc.
Ruby 拡張ライブラリ
Rubyの拡張ライブラリとは
• RubyをC言語を使って拡張
• Rubyでは出来ないことをCを利用して記述
•
•
•
•
OSとの連携
既存のライブラリとの連携
Ruby処理系へのアクセス
Cの速度の必要な処理
3
拡張ライブラリの利用
extconf.rb
Makefile
Ruby C APIで
Cメソッドを記述
Cファイル
(C)
C ビルド環境
(C compiler, etc)
Cファイルで定義した
Cメソッドを利用するように記述
rbファイル
(Ruby)
soファイル
(C拡張ライブラ)リ
実行に必要なファイル
読込・実行
CRuby
4
拡張ライブラリ基礎
• hello というライブラリを作りましょう
• hello.c を用意(ext/hello/ に作りましょう)
• hello.c に void Init_hello(void) を定義
• ここに、Rubyにどんなクラス、メソッドか定義
• VALUE cHello = rb_define_class(“Hello”, rb_cObject);
• rb_define_method(cHello, “hello”, hello_m, 0);
• hello_m(VALUE self) という関数を定義
• printf(“Hello world¥n”); するだけ
• extconf.rb というファイルを作成
• create_makefile(‘hello’) と書くだけ
• make すると .ext/i686-linux に hello.so
• make install すると、hello.so もインストール
• ruby –r hello –e “Hello.new.hello” で実行
5
拡張ライブラリ演習
• Hello#hello() を Hello#hello(str) にしてみよう
• 仕様は自由に決めて下さい
• ヒント:RSTRING_PTR()
6
使う知識
• README.EXT, README.EXT.ja に拡張ライブラリ仕
様
• これが基本
• include/ruby/ruby.h にデータ構造関係
• RNantoka は一通り見ておくと良い
• その他は、必要に応じて
• include/ruby/intern.h に C API 関係
• Ruby に知識を教えてあげる方法
• Ruby のメソッド・ブロックなどを呼び出す方法
• Ruby のメソッドで出来る操作を C から呼び出す方法
• あと,RHG
7
使う知識
• C の構造体を wrap するための機能
• T_DATA、RData
• Data_Wrap_Struct, Data_Make_Struct で wrap
• mark, free 関数を定義(GCのため)
• 最近、RTypedData を追加(T_DATA)
• 型の identity がない
• T_DATA は拡張性がない
• 発展課題:どんな拡張が考えられるか?
8
使う知識(発展)
• Rubyの組込メソッド、組込クラスはこの仕組みで実装
• string.c, array.c などが参考に
• ext/* も、もちろん参考に
• VM など、コア機能の一部もこの延長
• 初期化前は使えない
• 自己再帰にならないように注意
• 例:メソッド呼び出しの実装にメソッド呼び出し C API は使えな
い(厳密には、使えるところと使えないところがある)
9
拡張ライブラリの仕組み
• 動的リンクライブラリを利用
• 手順
• dlopen で xxx.so を開く
• dlsym で Init_xxx の関数ポインタを探す
• Init_xxx() を呼ぶ
10
拡張ライブラリのメモリ管理(基礎)
• 保守的マーク&スイープガーベージコレクション
• 保守的:ポインタっぽいものは全部マーク
• VALUE がスタックに残っていればよい
• 何も考えずにそのまま C で処理を書けばよい
• 他の言語処理系では、オマジナイが必要だったり
• そもそも、許さない、という処理系も
• C だけどメモリ管理考えなくてOK!
• 来週詳細
11
発展
拡張ライブラリでのメモリ管理(応用)
• メモリ管理考えなくてOK! なんてことはない
• VALUE の指し先だけが必要な場合、VALUE は残らない
ことがある(コンパイラによる)
• RSTRING_PTR() の値だけ使っている場合など
• Cコンパイラの tail call optimization で VALUE が消えちゃ
うことがある
• GCバグは、その場で発現しない&再現性があまり
ないので困難
• なんとかならないか?(発展課題)
12