Ruby のコードを読んでみよう       ( 入門編 )
まずは DOWNLOAD今回は ruby2.0... ではなくて、 ruby-1.9.3-p374で解説します環境は mac でまずはソースコードをダウンロードhttp://www.ruby-lang.org/ja/downloads/Tar ...
解凍してみるarray.c      dmyversion.c     inits.c    parse.c       ruby.c          variable.cbignum.c      encoding.c       io.c...
なんか色々ファイルあったけど
「 array.c 」とか「 string.c 」とかあるから          多分 C 言語だよねっ!
とりあえず「 array.c 」を開いてみよう
とりあえず Array.c の内側 とりあえず上からそれっぽい関数名を拾っていくと なんだか”動きの予想できそう”な関数がたくさんあるstatic VALUE ary_new(VALUE klass, long capa)static VALU...
とりあえず Array#push を 今回のテーマにします
Array#push の内容VALUErb_ary_push(VALUE ary, VALUE item){   rb_ary_modify(ary);   return rb_ary_push_1(ary, item);}static VAL...
Array#push の内容VALUErb_ary_push(VALUE ary, VALUE item){   rb_ary_modify(ary);   return rb_ary_push_1(ary, item);}static VAL...
Array#push の内容VALUErb_ary_push(VALUE ary, VALUE item){   rb_ary_modify(ary);   return rb_ary_push_1(ary, item);}static VAL...
Array#push の内容VALUErb_ary_push(VALUE ary, VALUE item){   rb_ary_modify(ary);   return rb_ary_push_1(ary, item);}static VAL...
Array#push の内容VALUErb_ary_push(VALUE ary, VALUE item){   rb_ary_modify(ary);   return rb_ary_push_1(ary, item);}static VAL...
… 読めるぞ!私にもコードが読めるッ!!
メソッドの対応付けの箇所ファイル末尾の void Init_Array(void) 関数を参照してみると実際の method をココで紐付けているrb_define_method(rb_cArray, "initialize", rb_ary_...
読めるので実際に書き換えてみるobject.c の nil_inspect という関数を書き換える    ( どう見ても Object#inspect メソッド )
書き換え (object.c)998 static VALUE999 nil_inspect(VALUE obj)1000 {1001 return rb_usascii_str_new2("nil");1002 }
書き換え998 static VALUE999 nil_inspect(VALUE obj)1000 {1001 return rb_usascii_str_new2("hogeobj");1002 }             ( 表示を ho...
実行してみるmake./ruby -e  p nil.inspect コンソールに "hogeobj" が表示される
今回は、 aray.c と object.c の内側を   ちょっと覗きましたが
実は、 ruby 組み込みの60クラスのうち、29クラスは同じファイル名を ruby のコード中に持っていたりするobject ARGF                 module Errno             module Marsh...
まとめruby は C 言語、しかも教科書的実装でとっても読みやすい♪
Upcoming SlideShare
Loading in...5
×

Rubyのソースコードを読んでみよう(入門編)

1,629
-1

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,629
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Rubyのソースコードを読んでみよう(入門編)

  1. 1. Ruby のコードを読んでみよう ( 入門編 )
  2. 2. まずは DOWNLOAD今回は ruby2.0... ではなくて、 ruby-1.9.3-p374で解説します環境は mac でまずはソースコードをダウンロードhttp://www.ruby-lang.org/ja/downloads/Tar ボールを展開したら普通に./configureでビルドできますmake (※gcc 必須 )
  3. 3. 解凍してみるarray.c dmyversion.c inits.c parse.c ruby.c variable.cbignum.c encoding.c io.c prelude.c safe.c version.cclass.c enum.c iseq.c proc.c signal.c vm.ccompar.c enumerator.c lex.c process.c sprintf.c vm_dump.ccompile.c error.c load.c random.c st.c vm_eval.ccomplex.c eval.c main.c range.c strftime.c vm_exec.ccont.c eval_error.c marshal.c rational.c string.c vm_insnhelper.cdebug.c eval_jump.c math.c re.c struct.c vm_method.c......
  4. 4. なんか色々ファイルあったけど
  5. 5. 「 array.c 」とか「 string.c 」とかあるから 多分 C 言語だよねっ!
  6. 6. とりあえず「 array.c 」を開いてみよう
  7. 7. とりあえず Array.c の内側 とりあえず上からそれっぽい関数名を拾っていくと なんだか”動きの予想できそう”な関数がたくさんあるstatic VALUE ary_new(VALUE klass, long capa)static VALUE rb_ary_push_m(int argc, VALUE *argv, VALUE ary)VALUE rb_ary_pop(VALUE ary)
  8. 8. とりあえず Array#push を 今回のテーマにします
  9. 9. Array#push の内容VALUErb_ary_push(VALUE ary, VALUE item){ rb_ary_modify(ary); return rb_ary_push_1(ary, item);}static VALUErb_ary_push_1(VALUE ary, VALUE item){ long idx = RARRAY_LEN(ary); if (idx >= ARY_CAPA(ary)) { ary_double_capa(ary, idx); } RARRAY_PTR(ary)[idx] = item; ARY_SET_LEN(ary, idx + 1); return ary;}
  10. 10. Array#push の内容VALUErb_ary_push(VALUE ary, VALUE item){ rb_ary_modify(ary); return rb_ary_push_1(ary, item);}static VALUErb_ary_push_1(VALUE ary, VALUE item){ long idx = RARRAY_LEN(ary); // 長さを調べる if (idx >= ARY_CAPA(ary)) { ary_double_capa(ary, idx); } RARRAY_PTR(ary)[idx] = item; ARY_SET_LEN(ary, idx + 1); return ary;}
  11. 11. Array#push の内容VALUErb_ary_push(VALUE ary, VALUE item){ rb_ary_modify(ary); return rb_ary_push_1(ary, item);}static VALUErb_ary_push_1(VALUE ary, VALUE item){ long idx = RARRAY_LEN(ary); // 長さを調べる if (idx >= ARY_CAPA(ary)) { ary_double_capa(ary, idx); } RARRAY_PTR(ary)[idx] = item; ARY_SET_LEN(ary, idx + 1); return ary;}
  12. 12. Array#push の内容VALUErb_ary_push(VALUE ary, VALUE item){ rb_ary_modify(ary); return rb_ary_push_1(ary, item);}static VALUErb_ary_push_1(VALUE ary, VALUE item){ long idx = RARRAY_LEN(ary); if (idx >= ARY_CAPA(ary)) { // 長さが足りないときは ary_double_capa(ary, idx); // 拡張 } RARRAY_PTR(ary)[idx] = item; ARY_SET_LEN(ary, idx + 1); return ary;}
  13. 13. Array#push の内容VALUErb_ary_push(VALUE ary, VALUE item){ rb_ary_modify(ary); return rb_ary_push_1(ary, item);}static VALUErb_ary_push_1(VALUE ary, VALUE item){ long idx = RARRAY_LEN(ary); if (idx >= ARY_CAPA(ary)) { ary_double_capa(ary, idx); } RARRAY_PTR(ary)[idx] = item; // 配列の要素をセット ARY_SET_LEN(ary, idx + 1); return ary;}
  14. 14. … 読めるぞ!私にもコードが読めるッ!!
  15. 15. メソッドの対応付けの箇所ファイル末尾の void Init_Array(void) 関数を参照してみると実際の method をココで紐付けているrb_define_method(rb_cArray, "initialize", rb_ary_initialize, -1);rb_define_method(rb_cArray, "to_a", rb_ary_to_a, 0);rb_define_method(rb_cArray, "push", rb_ary_push_m, -1);
  16. 16. 読めるので実際に書き換えてみるobject.c の nil_inspect という関数を書き換える ( どう見ても Object#inspect メソッド )
  17. 17. 書き換え (object.c)998 static VALUE999 nil_inspect(VALUE obj)1000 {1001 return rb_usascii_str_new2("nil");1002 }
  18. 18. 書き換え998 static VALUE999 nil_inspect(VALUE obj)1000 {1001 return rb_usascii_str_new2("hogeobj");1002 } ( 表示を hogeobj に変更 )
  19. 19. 実行してみるmake./ruby -e p nil.inspect コンソールに "hogeobj" が表示される
  20. 20. 今回は、 aray.c と object.c の内側を ちょっと覗きましたが
  21. 21. 実は、 ruby 組み込みの60クラスのうち、29クラスは同じファイル名を ruby のコード中に持っていたりするobject ARGF module Errno module Marshal module Process::UIDclass Array class FalseClass class MatchData class Randomclass BasicObject class Fiber module Math class Rangeclass Bignum class File class Method class Rationalclass Binding module File::Constants class Module class Regexpclass Class class File::Stat class Mutex module Signalmodule Comparable module FileTest class NilClass class Stringclass Complex class Fixnum class Numeric class Structclass Data class Float class Object class Struct::Tmsclass Dir module GC module ObjectSpace class Symbolobject ENV module GC::Profiler class Proc class Threadclass Encoding class Hash module Process class ThreadGroupclass Encoding::Converter class IO module Process::GID class Timemodule Enumerable class Integer module Process::Status class TrueClassclass Enumerator module Kernel module Process::Sys class UnboundMethod
  22. 22. まとめruby は C 言語、しかも教科書的実装でとっても読みやすい♪
  1. A particular slide catching your eye?

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

×