Your SlideShare is downloading. ×
0
はじめての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拡張ライブラリ

6,233

Published on

0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
6,233
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
35
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Transcript of "はじめての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
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×