Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
はじめてのRuby拡
         張ライブラリ
                   とみたまさひろ
                     2010-05-22

はじめてのRuby拡張ライブラリ         Powered by...
自己紹介
    ✓ とみた まさひろ
    ✓ プログラマー
    ✓ mailto:tommy@tmtm.org
    ✓ http://d.hatena.ne.jp/tmtms
    ✓ http://twitter.com/tm...
自己紹介

    ✓ 日本Rubyの会
    ✓ 日本MySQLユーザ会
    ✓ Ruby/MySQL ライブラリ
    ✓ Ruby歴, MySQL歴 十数年

                                   ...
自己紹介




                   こんな本書きました

                                          3/33
はじめてのRuby拡張ライブラリ               Power...
NSEG #1 で




                                          4/33
はじめてのRuby拡張ライブラリ               Powered by Rabbit 0.6.4
Ruby拡張
  ライブラリ
                              5/33
はじめてのRuby拡張ライブラリ   Powered by Rabbit 0.6.4
Ruby
   は遅い
はじめてのRuby拡張ライブラリ
                              6/33
                   Powered by Rabbit 0.6.4
こんなに遅い




                                       7/33
はじめてのRuby拡張ライブラリ            Powered by Rabbit 0.6.4
Rubyが遅いの
  ならCで書けば
   いいじゃない
                              8/33
はじめてのRuby拡張ライブラリ   Powered by Rabbit 0.6.4
Cのライブラ
  リをRubyか
  ら使いたい                       9/33
はじめてのRuby拡張ライブラリ   Powered by Rabbit 0.6.4
ということ
   で拡張ライ
    ブラリ
はじめてのRuby拡張ライブラリ
                           10/33
                   Powered by Rabbit 0.6.4
通常のライブラリ

    ✓ Ruby で書かれている
    ✓ 拡張子 .rb
    ✓ require 'hoge'
    ✓ require 'hoge.rb'

                                 ...
拡張ライブラリ
    ✓ C で書かれている
    ✓ 拡張子 .so (Linux の場合)
    ✓ require 'hoge' (.rb が優先)
    ✓ require 'hoge.o'
    ✓ require 'hog...
作り方
                           13/33
はじめてのRuby拡張ライブラリ   Powered by Rabbit 0.6.4
専用ディレクトリが必要


                   $ ls hoge/
                   extconf.rb
                   hoge.c


                    ...
hoge.c

   拡張ライブラリ本体
        /* require 'hoge' 時に呼ばれる関数 */
        void Init_hoge(void)
        {
          puts("Hello");...
extconf.rb

   拡張ライブラリを作るための
   Makefile を作る

              require 'mkmf'
              create_makefile 'hoge'

         ...
コンパイル&実行
             $ ruby ./extconf.rb
             creating Makefile
             $ make
               ...
          ...
クラス&メソッド
              #include <ruby.h>

              VALUE cHoge;   /* Hoge クラス */
              /* Hoge#xxx メソッド実行時に呼ば...
メソッド引数

       /* 引数なし */
       rb_define_method(cHoge, "xxx0", hoge_xxx0, 0);
       static VALUE hoge_xxx0(VALUE obj);
...
不定個引数
               rb_define_method(cHoge, "xxxx", hoge_xxxx, -1);

               ...

               /* def xxxx(arg1,...
データ変換
   RubyからC

        NUM2INT(n)       ->   int
        NUM2LONG(n)      ->   long
        NUM2DBL(n)       ->   doubl...
データ変換

   CからRuby
        INT2NUM(int)            -> Fixnum or Bignum
        LONG2NUM(long)          -> Fixnum or Bignum
...
真偽値


                   Ruby             C
     true                  Qtrue
     false                 Qfalse
     nil   ...
定義済みクラス

           Ruby              C
     Object           rb_cObject
     Module           rb_cModule
     Class      ...
Rubyオブジェクトの操作
             str.concat("hoge")
             → rb_str_cat(str, "hoge", 4)

             ary[n]
             ...
Rubyレベルのメソッド呼び出し
         も可



        rb_funcall(obj, rb_intern("methodname"), arg, ...);




                          ...
raise & rescue
       /* 例外を発生させる */
       rb_raise(rb_eRuntimeError, "%s: %d", "abc", 123);
       ...

       /* begin ...
クラスの一部のメソッドをCで書
      くこともできる

       [Ruby]
       class Hoge
         def xxx()
           ...
         end
       end

...
その他
  もろもろ
はじめてのRuby拡張ライブラリ
                           29/33
                   Powered by Rabbit 0.6.4
詳しくは
 README.EXT.ja
                           30/33
はじめてのRuby拡張ライブラリ   Powered by Rabbit 0.6.4
さらに知りたけ
    ればソース
  ruby-X.Y.Z/*.
      {h,c}                31/33
はじめてのRuby拡張ライブラリ   Powered by Rabbit 0.6.4
サンプルも多
 数あるよ ruby-
  X.Y.Z/ext/*
                           32/33
はじめてのRuby拡張ライブラリ   Powered by Rabbit 0.6.4
ご清聴あり
  がとうござ
   いました
はじめてのRuby拡張ライブラリ
                           33/33
                   Powered by Rabbit 0.6.4
Upcoming SlideShare
Loading in …5
×

はじめてのRuby拡張ライブラリ

7,590 views

Published on

  • Be the first to comment

はじめてのRuby拡張ライブラリ

  1. 1. はじめてのRuby拡 張ライブラリ とみたまさひろ 2010-05-22 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  2. 2. 自己紹介 ✓ とみた まさひろ ✓ プログラマー ✓ mailto:tommy@tmtm.org ✓ http://d.hatena.ne.jp/tmtms ✓ http://twitter.com/tmtms 1/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  3. 3. 自己紹介 ✓ 日本Rubyの会 ✓ 日本MySQLユーザ会 ✓ Ruby/MySQL ライブラリ ✓ Ruby歴, MySQL歴 十数年 2/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  4. 4. 自己紹介 こんな本書きました 3/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  5. 5. NSEG #1 で 4/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  6. 6. Ruby拡張 ライブラリ 5/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  7. 7. Ruby は遅い はじめてのRuby拡張ライブラリ 6/33 Powered by Rabbit 0.6.4
  8. 8. こんなに遅い 7/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  9. 9. Rubyが遅いの ならCで書けば いいじゃない 8/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  10. 10. Cのライブラ リをRubyか ら使いたい 9/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  11. 11. ということ で拡張ライ ブラリ はじめてのRuby拡張ライブラリ 10/33 Powered by Rabbit 0.6.4
  12. 12. 通常のライブラリ ✓ Ruby で書かれている ✓ 拡張子 .rb ✓ require 'hoge' ✓ require 'hoge.rb' 11/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  13. 13. 拡張ライブラリ ✓ C で書かれている ✓ 拡張子 .so (Linux の場合) ✓ require 'hoge' (.rb が優先) ✓ require 'hoge.o' ✓ require 'hoge.so' 12/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  14. 14. 作り方 13/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  15. 15. 専用ディレクトリが必要 $ ls hoge/ extconf.rb hoge.c 14/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  16. 16. hoge.c 拡張ライブラリ本体 /* require 'hoge' 時に呼ばれる関数 */ void Init_hoge(void) { puts("Hello"); } 15/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  17. 17. extconf.rb 拡張ライブラリを作るための Makefile を作る require 'mkmf' create_makefile 'hoge' 16/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  18. 18. コンパイル&実行 $ ruby ./extconf.rb creating Makefile $ make ... $ ls Makefile hoge.c hoge.so extconf.rb hoge.o $ ruby -e 'require "hoge"' Hello 17/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  19. 19. クラス&メソッド #include <ruby.h> VALUE cHoge; /* Hoge クラス */ /* Hoge#xxx メソッド実行時に呼ばれる関数 */ static VALUE hoge_xxx(VALUE obj) { ... } /* require 'hoge' 時に呼ばれる関数 */ void Init_hoge(void) { /* Object クラスを継承した Hoge クラスを作成 */ cHoge = rb_define_class("Hoge", rb_cObject); /* 引数0個のメソッド xxx を定義 */ rb_define_method(cHoge, "xxx", hoge_xxx, 0); } 18/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  20. 20. メソッド引数 /* 引数なし */ rb_define_method(cHoge, "xxx0", hoge_xxx0, 0); static VALUE hoge_xxx0(VALUE obj); /* 引数1個 */ rb_define_method(cHoge, "xxx1", hoge_xxx1, 1); static VALUE hoge_xxx1(VALUE obj, VALUE arg); /* 引数2個 */ rb_define_method(cHoge, "xxx2", hoge_xxx2, 2); static VALUE hoge_xxx2(VALUE obj, VALUE arg1, VALUE arg2); 19/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  21. 21. 不定個引数 rb_define_method(cHoge, "xxxx", hoge_xxxx, -1); ... /* def xxxx(arg1, arg2=nil, arg3=nil) とほぼ同じ */ static VALUE hoge_xxxx(int argc, VALUE *argv, VALUE obj) { VALUE arg1, arg2, arg3; /* 自分で引数を数えてもいいけど、専用関数あり */ /* 必須1個、オプション2個 */ rb_scan_args(argc, argv, "12", &arg1, &arg2, &arg3); } /* def xxxx(arg1, arg2=nil, *other) とほぼ同じ */ static VALUE hoge_xxxx(int argc, VALUE *argv, VALUE obj) { VALUE arg1, arg2; /* 必須1個、オプション1個、それ以上はここでは無視 */ rb_scan_args(argc, argv, "11*", &arg1, &arg2); /* argv[2]〜argv[argc-1] が残りの引数 */ } 20/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  22. 22. データ変換 RubyからC NUM2INT(n) -> int NUM2LONG(n) -> long NUM2DBL(n) -> double RSTRING_PTR(s) -> char* RSTRING_LEN(s) -> 文字列の長さ RARRAY_PTR(a) -> VALUE* RARRAY_LEN(a) -> 配列の要素数 21/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  23. 23. データ変換 CからRuby INT2NUM(int) -> Fixnum or Bignum LONG2NUM(long) -> Fixnum or Bignum DBL2NUM(double) -> Float rb_str_new(char*, long) -> String rb_ary_new() -> 空の配列 rb_ary_new3(long, ...) -> n個の要素を持つ配列 22/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  24. 24. 真偽値 Ruby C true Qtrue false Qfalse nil Qnil 23/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  25. 25. 定義済みクラス Ruby C Object rb_cObject Module rb_cModule Class rb_cClass String rb_cString Array rb_cArray 24/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  26. 26. Rubyオブジェクトの操作 str.concat("hoge") → rb_str_cat(str, "hoge", 4) ary[n] → rb_ary_at(ary, n) hash[key] → rb_hash_aref(hash, key) Hoge::Fuga → Hoge.const_get(:Fuga) → rb_const_get(cHoge, rb_intern("Fuga")) obj.instance_variable_get(:@name) → rb_iv_get(obj, "@name") 25/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  27. 27. Rubyレベルのメソッド呼び出し も可 rb_funcall(obj, rb_intern("methodname"), arg, ...); 26/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  28. 28. raise & rescue /* 例外を発生させる */ rb_raise(rb_eRuntimeError, "%s: %d", "abc", 123); ... /* begin func1(arg1) rescue func2(arg2) end みたいな */ VALUE func1(VALUE arg1) { ... } VALUE func2(VALUE arg2) { ... } ... rb_rescue(func1, arg1, func2, arg2) 27/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  29. 29. クラスの一部のメソッドをCで書 くこともできる [Ruby] class Hoge def xxx() ... end end [C] cHoge = rb_const_get(rb_cObject, rb_intern("Hoge")); rb_define_method(cHoge, "zzz", hoge_zzz, 0); 28/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  30. 30. その他 もろもろ はじめてのRuby拡張ライブラリ 29/33 Powered by Rabbit 0.6.4
  31. 31. 詳しくは README.EXT.ja 30/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  32. 32. さらに知りたけ ればソース ruby-X.Y.Z/*. {h,c} 31/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  33. 33. サンプルも多 数あるよ ruby- X.Y.Z/ext/* 32/33 はじめてのRuby拡張ライブラリ Powered by Rabbit 0.6.4
  34. 34. ご清聴あり がとうござ いました はじめてのRuby拡張ライブラリ 33/33 Powered by Rabbit 0.6.4

×