RHGを読みながらRuby1.9のソースコードを追いかける会 にいってきた

  • 肉々しいバーベキュウから脱出して移動
  • 最初は時間通りに来る人が多い訳ですよ
  • 新しい名札を作った id:dominion525++
    • 出席毎にシールを増やすとか?
  • とりあえず,svn co http://svn.ruby-lang.org/repos/ruby/tags/v1_9_1_0 ruby-v1_9_1_0 とか?
  • 参加者の半数くらいは,出版されたものを持ってきた
  • 最初は,内部でオブジェクトをどう表現しているのかを見るよ
  • 対象は,include/ruby/ruby.h, variable.c, object.c, class.c, (vm_method.c)
  • VALUE がオブジェクトだよ
  • VALUE の中身はstruct R* だったりする
    • その場合,共通のstruct RBasic basic メンバーを持つ
  • VALUE は値の場合もある->変換するマクロ (VALUE埋め込みオブジェクト)
    • VALUE が埋め込みオブジェクトであるかどうかは,マクロで判定できる
    • Qnil のQ って何じゃ
      • emacs の Qnil 由来らしい.
  • VALUE->basic.klass は,VALUE が所属するクラスオブジェクトを保持する
    • VALUE->basic.flags にも,型情報が入ってたりするよ
      • TYPE マクロで取り出せる
    • struct RClass からRCLASS_M_TBL マクロで取り出せる m_tbl にはメソッドが入っている
    • struct RClass からRCLASS_SUPER マクロでsuper が取り出すせるようになっている
    • クラス階層として,super が NULL の場合そのクラスは最上位(Object)である
    • 逆にObject 以外は全てがsuper を持っている
  • インスタンス変数
    • struct RObject とかの struct st_table *iv_tbl に配置するかも
    • variable.c:1005:rb_ivar_set を見る
    • iv_tbl が無い型もあるので,その場合は,generic_ivar_set でstruct 外部に保存する.
  • スーパーコンピュータプログラマな話をした
  • Haskell を復習したいみたいな意見が出た
  • ディスプレイを持ってきたのに使わないメソッド
  • id:gabuchan からシリコンバリカンファの話を聞いた
    • 色々聞いたけど食事の話しか覚えていない
      • 続きはweb
  • sapid を紹介して頂いた

おえかき(途中で面倒になった)

Ruby v1_9_1_0 より

$ egrep -n '^struct R' include/ruby/ruby.h
518:struct RBasic {
524:struct RObject {
554:struct RClass {
568:struct RFloat {
578:struct RString {
607:struct RArray {
635:struct RRegexp {
645:struct RHash {
658:struct RFile {
663:struct RRational {
669:struct RComplex {
675:struct RData {
706:struct RStruct {
729:struct RBignum {
$ egrep -A3 -n '^struct RBa' include/ruby/ruby.h|head
518:struct RBasic {
519-    VALUE flags;
520-    VALUE klass;
521-};
$ egrep -A1 -n '^struct R[^B]' include/ruby/ruby.h|head
524:struct RObject {
525-    struct RBasic basic;
--
554:struct RClass {
555-    struct RBasic basic;
--
568:struct RFloat {
569-    struct RBasic basic;
--
578:struct RString {
$ perl -lne 'print "$.:$_" if /#define\s\w*2.*VALUE/' include/ruby/ruby.h
179:#define INT2FIX(i) ((VALUE)(((SIGNED_VALUE)(i))<<1 | FIXNUM_FLAG))
250:#define FIX2LONG(x) RSHIFT((SIGNED_VALUE)x,1)
251:#define FIX2ULONG(x) ((((VALUE)(x))>>1)&LONG_MAX)
260:#define ID2SYM(x) (((VALUE)(x)<<RUBY_SPECIAL_SHIFT)|SYMBOL_FLAG)
405:#define NUM2ULONG(x) rb_num2ulong((VALUE)x)
409:#define FIX2INT(x) ((int)rb_fix2int((VALUE)x))
452:#define NUM2DBL(x) rb_num2dbl((VALUE)(x))
495:#define STR2CSTR(x) rb_str2cstr((VALUE)(x),0)
792:#define FL_USER2     (((VALUE)1)<<(FL_USHIFT+2))
802:#define FL_USER12    (((VALUE)1)<<(FL_USHIFT+12))
$ egrep -n -A19 '^search_method' *.c
vm_method.c:221:search_method(VALUE klass, ID id, VALUE *klassp)
vm_method.c-222-{
vm_method.c-223-    st_data_t body;
vm_method.c-224-
vm_method.c-225-    if (!klass) {
vm_method.c-226-        return 0;
vm_method.c-227-    }
vm_method.c-228-
vm_method.c-229-    while (!st_lookup(RCLASS_M_TBL(klass), id, &body)) {
vm_method.c-230-        klass = RCLASS_SUPER(klass);
vm_method.c-231-        if (!klass)
vm_method.c-232-            return 0;
vm_method.c-233-    }
vm_method.c-234-
vm_method.c-235-    if (klassp) {
vm_method.c-236-        *klassp = klass;
vm_method.c-237-    }
vm_method.c-238-
vm_method.c-239-    return (NODE *)body;
vm_method.c-240-}

emacs 22.3 ソース

$ egrep -nH 'Qnil = ' *.c
lread.c:3627:  Qnil = Fmake_symbol (make_pure_string ("nil", 3, 3, 0));
$ egrep -A2 'DEFUN.*Fmake_symbol,' *.c
alloc.c:DEFUN ("make-symbol", Fmake_symbol, Smake_symbol, 1, 1, 0,
alloc.c-       doc: /* Return a newly allocated uninterned symbol whose name is NAME.
alloc.c-Its value and function definition are void, and its property list is nil.  */)
$ egrep 'define EQ\(' *.[hc]
lisp.h:#define EQ(x, y) ((x) == (y))
lisp.h:#define EQ(x, y) ((x).i == (y).i)
$ egrep -A5 'union Lisp_Object' *.[ch]|head -7
lisp.h:union Lisp_Object
lisp.h-  {
lisp.h-    /* Used for comparing two Lisp_Objects;
lisp.h-       also, positive integers can be accessed fast this way.  */
lisp.h-    EMACS_INT i;
lisp.h-
--

DEFUN は,emacs 上の関数とC での関数をマッピングするマクロっぽい.*1
そんで,make-symbol は,なんか順番に連番を割り当ててるだけみたい.

emacs は,以下を参考にさせて頂きました.

あと,自分がC 言語を学んだときの本

二番目に読んだ本
http://www.amazon.co.jp/dp/4756102700/search042-22/ref=nosim/C言語入門 (ASCII SOFTWARE SCIENCE Language)

おもろいな.と思った本
http://www.amazon.co.jp/dp/4774111422/search042-22/ref=nosim/C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

*1:普通にetags とかで探したらみつからなくて焦ったのは秘密だ.