ソフトウェアサイエンス特別講義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
© Copyright 2024 ExpyDoc