Ruby and its evaluation

Ruby and its evaluation

プログラミング言語基礎勉強会 sponsored by @wantedly UIターン at 2016 June 11

9d2f78236e45a335301ba1195026105d?s=128

Urabe Shyouhei

June 11, 2016
Tweet

Transcript

  1. 3VCZͱ ͦͷղऍʹ͍ͭͯ 6SBCF 4IZPVIFJ !TIZPVIFJ

  2. 3VCZͱ ͦͷղऍʹ͍ͭͯ 6SBCF 4IZPVIFJ !TIZPVIFJ

  3. w ࠓ೔͸3VCZͰͳʹ͕Ͳ͏ͳͬͯϓϩάϥϜ͕࣮ߦ͞Ε͍ͯΔ͔ ͷ࿩Λ͠·͢ɻ w ͨͿΜ͕࣌ؒͳ͍ͷͰΑ͕ͦͲ͏ͳͬͯΔ͔ͷ࿩͸ແཧΆ͍ɻ w ֤Ґɺ஥ྑ͘ ͓͜ͱΘΓ

  4. w ࠓ೔͸3VCZͰͳʹ͕Ͳ͏ͳͬͯϓϩάϥϜ͕࣮ߦ͞Ε͍ͯΔ͔ ͷ࿩Λ͠·͢ɻ w ͨͿΜ͕࣌ؒͳ͍ͷͰΑ͕ͦͲ͏ͳͬͯΔ͔ͷ࿩͸ແཧΆ͍ɻ w ֤Ґɺ஥ྑ͘ ͓͜ͱΘΓ

  5. 3VCZͱ͸

  6. w ݹ͍ɻ+BWBಉ࣌ظ w ͳͷͰࠓ࣌ͬΆ͍ݴޠػೳ͸ݢฒΈܽ͘ w ࣮͸+*4ʹͳ͍ͬͯΔ w +*49 *40*&$ w

    ओʹ੓෎ௐୡͷ౎߹ʹΑΔ w ੲ͸ʮΦϒδΣΫτࢦ޲εΫϦϓτݴޠ3VCZʯͱ໊৐͍ͬͯͨ w ࠓ೔͸จ๏ͷ࿩͸͠ͳ͍͕ จ๏͕͍Ζ͍Ζม w L-0$QBSTFZXJUIDPOqJDUT w &NBDTʹର͢Δ௅ઓͱͯ͠࡞ΒΕ͍ͯΔ໘͕͋Δ 3VCZͱ͸
  7. None
  8. None
  9. None
  10. None
  11. http://www.slideshare.net/yukihiro_matz/how-emacs-changed-my-life

  12. 3VCZ͕ Ͳ͏ಈ͔͘

  13. 1+2

  14. 1+2 ΦϒδΣΫτ ԋࢉࢠ

  15.  "CTUSBDU4ZOUBY5SFFͷ࡞੒  7.*OTUSVDUJPO4FRVFODF΁ͷม׵  ͋Δछͷ࠷దԽ͕Ͱ͖Δͱ͖͸͢Δ ⬅ࠓ೔͸লུ   ॲཧܥʹΑΔղऍ

     ͷ࣮ߦͷྲྀΕ
  16. SVCZεΫϦϓτ 1+2

  17. "45ʹม׵  [:binary, [:@int, "1", [1, 0]], :+, [:@int, "2",

    [1, 2]]]
  18. [:binary, [:@int, "1", [1, 0]], :+, [:@int, "2", [1, 2]]]

    "45ʹม׵  ߦ൪߸ͱ͔ͳͷͰ ๨Εͯ0, ͜Εͱ͍ͬͯ ಛ௃ͷͳ͍ ڭՊॻ௨Γͷ ந৅ߏจ໦
  19. "45ʹม׵  @ NODE_CALL (line: 1) +- nd_mid: :+ +-

    nd_recv: | @ NODE_LIT (line: 1) | +- nd_lit: 1 +- nd_args: @ NODE_ARRAY (line: 1) +- nd_alen: 1 +- nd_head: | @ NODE_LIT (line: 1) | +- nd_lit: 2 +- nd_next: (null node)
  20. "45ʹม׵  @ NODE_CALL (line: 1) +- nd_mid: :+ +-

    nd_recv: | @ NODE_LIT (line: 1) | +- nd_lit: 1 +- nd_args: @ NODE_ARRAY (line: 1) +- nd_alen: 1 +- nd_head: | @ NODE_LIT (line: 1) | +- nd_lit: 2 +- nd_next: (null node)
  21. "45ʹม׵  @ NODE_CALL (line: 1) +- nd_mid: :+ +-

    nd_recv: | @ NODE_LIT (line: 1) | +- nd_lit: 1 +- nd_args: @ NODE_ARRAY (line: 1) +- nd_alen: 1 +- nd_head: | @ NODE_LIT (line: 1) | +- nd_lit: 2 +- nd_next: (null node) 「メソッド呼出し」 名前は「:+」 レシーバは リテラルで 値は「1」 引数は 配列で サイズは「1」 先頭は リテラルで 値は「2」 次の要素は なし
  22. *4FRʹม׵ == disasm: #<ISeq:<compiled>@<compiled>>== 0000 putobject 1 0002 putobject 2

    0004 send <mid:+, argc:1> 0006 leave
  23. *4FRʹม׵ == disasm: #<ISeq:<compiled>@<compiled>>== 0000 putobject 1 0002 putobject 2

    0004 send <mid:+, argc:1> 0006 leave ※スタックマシン
  24. *4FRʹม׵ == disasm: #<ISeq:<compiled>@<compiled>>== 0000 putobject 1 0002 putobject 2

    0004 send <mid:+, argc:1> 0006 leave 1 ※スタックマシン
  25. *4FRʹม׵ == disasm: #<ISeq:<compiled>@<compiled>>== 0000 putobject 1 0002 putobject 2

    0004 send <mid:+, argc:1> 0006 leave 1 2 ※スタックマシン
  26. *4FRʹม׵ == disasm: #<ISeq:<compiled>@<compiled>>== 0000 putobject 1 0002 putobject 2

    0004 send <mid:+, argc:1> 0006 leave ※スタックマシン 3
  27. SVCZεΫϦϓτ def foo 1+2 end

  28. *4FRʹม׵ == disasm: #<ISeq:foo@<compiled>>========= 0000 putobject 1 0002 putobject 2

    0004 send <mid:+, argc:1> 0006 leave == disasm: #<ISeq:<compiled>@<compiled>>== 0000 putobject RubyVM::FrozenCore 0002 putobject :foo 0004 putiseq #<ISeq:foo@<compiled>> 0006 send <mid:core#define_method, argc:2> 0008 leave
  29. *4FRʹม׵ == disasm: #<ISeq:foo@<compiled>>========= 0000 putobject 1 0002 putobject 2

    0004 send <mid:+, argc:1> 0006 leave == disasm: #<ISeq:<compiled>@<compiled>>== 0000 putobject RubyVM::FrozenCore 0002 putobject :foo 0004 putiseq #<ISeq:foo@<compiled>> 0006 send <mid:core#define_method, argc:2> 0008 leave
  30. ͍͍ͩͨ ͳΜͰ΋ send

  31. w ී௨ͷϝιουݺͼग़͠ w ී௨ͷԋࢉࢠ ൺֱͱ͔  w ྫ֎ͷraise • lambda

    w ϝιουఆٛ ݟͨͱ͓Γ sendͰ࣮ݱ͞Ε͍ͯΔࣄ ͱ͸͍͑શ෦͡Όͳ͍ɺͨͱ͑͹ifจͳͲ͸4NBMMUBMLͰ͸ϝιουͩ ͕3VCZͰ͸ҧ͏ɻ͜ͷΑ͏ͳΑ͍͑͘͹࣮ફతɺѱ͘ݴ͑͹೔࿨ݟͳ ࢟੎͸ྑ͘΋ѱ͘΋3VCZΛಛ௃෇͚͍ͯΔͱ͸ݴ͑Δɻ
  32. sendͷৼ෣͍ /** @c method/iterator @e invoke method. @j ϝιουݺͼग़͠Λߦ͏ɻci ʹඞཁͳ৘ใ͕֨ೲ͞Ε͍ͯΔɻ

    */ DEFINE_INSN send (CALL_INFO ci, CALL_CACHE cc, ISEQ blockiseq) (...) (VALUE val) // inc += - (int)(ci->orig_argc + ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0)); { struct rb_calling_info calling; vm_caller_setup_arg_block(th, reg_cfp, &calling, ci, blockiseq, FALSE); vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc)); CALL_METHOD(&calling, ci, cc); }
  33. sendͷৼ෣͍ /** @c method/iterator @e invoke method. @j ϝιουݺͼग़͠Λߦ͏ɻci ʹඞཁͳ৘ใ͕֨ೲ͞Ε͍ͯΔɻ

    */ DEFINE_INSN send (CALL_INFO ci, CALL_CACHE cc, ISEQ blockiseq) (...) (VALUE val) // inc += - (int)(ci->orig_argc + ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0)); { struct rb_calling_info calling; vm_caller_setup_arg_block(th, reg_cfp, &calling, ci, blockiseq, FALSE); vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc)); CALL_METHOD(&calling, ci, cc); }
  34.  ϒϩοΫҾ਺͕͋Δ͔ͳ͍͔ܾఆͯ͠ɺ͋Ε͹$Ϩϕϧߏ଄ମ struct calling_info ʹಥͬࠐΉ  ݺͿ΂͖ϝιουͷ࣮ମ struct method_entry ΛͳΜΒ͔

    ͷํ๏ʹܾͯఆ͢Δ  7.ελοΫϑϨʔϜΛੵΜͩΓͯ͠7.ϓϩάϥϜΧ΢ϯλΛ δϟϯϓ͢Δ sendͷৼ෣͍
  35.  ϒϩοΫҾ਺͕͋Δ͔ͳ͍͔ܾఆͯ͠ɺ͋Ε͹$Ϩϕϧߏ଄ମ struct calling_info ʹಥͬࠐΉ  ݺͿ΂͖ϝιουͷ࣮ମ struct method_entry ΛͳΜΒ͔

    ͷํ๏ʹܾͯఆ͢Δ  7.ελοΫϑϨʔϜΛੵΜͩΓͯ͠7.ϓϩάϥϜΧ΢ϯλΛ δϟϯϓ͢Δ sendͷৼ෣͍ ٯʹݴ͏ͱ͜ͷظ ʹٴͿ·Ͱܾఆ͠ ͳ͍ͱ͍͏͜ͱͰ ΋͋Δɻ
  36. ͳΜΒ͔ ͷํ๏

  37. ΦϒδΣΫτ ʹฉ͘

  38. w 3VCZʹ͓͚ΔΦϒδΣΫτࢦ޲ͱ͸ඟᰈɺTFOE w ʮ͍ΖΜͳ͜ͱΛ࠷ऴతʹsendʹؼணͤͯ͞ղܾ͍ͨ͠ʯͱ͍ ͏χʔζΛຬͨͨ͢Ίʹඞཁͳ࢓૊Έͱͯ͠ΦϒδΣΫτࢦ޲ ͕࠾༻͞Ε͍ͯΔ

  39. w 3VCZʹ͓͚ΔΦϒδΣΫτࢦ޲ͱ͸ඟᰈɺTFOE w ʮ͍ΖΜͳ͜ͱΛ࠷ऴతʹsendʹؼணͤͯ͞ղܾ͍ͨ͠ʯͱ͍ ͏χʔζΛຬͨͨ͢Ίʹඞཁͳ࢓૊Έͱͯ͠ΦϒδΣΫτࢦ޲ ͕࠾༻͞Ε͍ͯΔ

  40. ࠷ۙΑ͘Ԍ্͍ͯ͠Δ ΦϒδΣΫτࢦ޲ ʹ͍ͭͯ3VCZ͕Ͳ͏͍ͯ͠Δ͔ 6SBCF 4IZPVIFJ !TIZPVIFJ

  41. ࠶ܝ sendͷ࣮૷ /** @c method/iterator @e invoke method. @j ϝιουݺͼग़͠Λߦ͏ɻci

    ʹඞཁͳ৘ใ͕֨ೲ͞Ε͍ͯΔɻ */ DEFINE_INSN send (CALL_INFO ci, CALL_CACHE cc, ISEQ blockiseq) (...) (VALUE val) // inc += - (int)(ci->orig_argc + ((ci->flag & VM_CALL_ARGS_BLOCKARG) ? 1 : 0)); { struct rb_calling_info calling; vm_caller_setup_arg_block(th, reg_cfp, &calling, ci, blockiseq, FALSE); vm_search_method(ci, cc, calling.recv = TOPN(calling.argc = ci->orig_argc)); CALL_METHOD(&calling, ci, cc); }
  42. static void vm_search_method(const struct rb_call_info *ci, struct rb_call_cache *cc, VALUE

    recv) { VALUE klass = CLASS_OF(recv); #if (தུ) #endif cc->me = rb_callable_method_entry(klass, ci->mid); VM_ASSERT(callable_method_entry_p(cc->me)); cc->call = vm_call_general; #if (தུ) #endif }
  43. const rb_callable_method_entry_t * rb_callable_method_entry(VALUE klass, ID id) { VALUE defined_class;

    rb_method_entry_t *me = method_entry_get(klass, id, &defined_class); return prepare_callable_method_entry(defined_class, id, me); }
  44. static rb_method_entry_t * method_entry_get(VALUE klass, ID id, VALUE *defined_class_ptr) {

    #if (தུ) #endif return method_entry_get_without_cache(klass, id, defined_class_ptr); }
  45. /* * search method entry without the method cache. *

    * if you need method entry with method cache (normal case), use * rb_method_entry() simply. */ static rb_method_entry_t * method_entry_get_without_cache(VALUE klass, ID id, VALUE *defined_class_ptr) { VALUE defined_class; rb_method_entry_t *me = search_method(klass, id, &defined_class); if (ruby_running) { if (OPT_GLOBAL_METHOD_CACHE) { struct cache_entry *ent; ent = GLOBAL_METHOD_CACHE(klass, id); ent->class_serial = RCLASS_SERIAL(klass); ent->method_state = GET_GLOBAL_METHOD_STATE(); ent->defined_class = defined_class; ent->mid = id; if (UNDEFINED_METHOD_ENTRY_P(me)) {
  46. static inline rb_method_entry_t* search_method(VALUE klass, ID id, VALUE *defined_class_ptr) {

    rb_method_entry_t *me; for (me = 0; klass; klass = RCLASS_SUPER(klass)) { if ((me = lookup_method_table(klass, id)) != 0) break; } if (defined_class_ptr) *defined_class_ptr = klass; return me; }
  47. w ·ͣrecv͕͋ͬͯ w klass = CLASS_OF(recv)Λج४ʹ w klass = RCLASS_SUPER(klass)ΛͨͲΓͳ͕Β

    w lookup_method_table(klass, id)͕ώοτ͢Δ·Ͱݕࡧ Λଓ͚Δ ·ͱΊΔͱ
  48. ·ͱΊΔͱ recv klass klass klass klass klass klass klass klass

  49. klass͸ʮΫϥεʯ͔ a = "foo" def a.+(other) return sprintf("<%s|%s>", other, self)

    end a + "bar" # => "<bar|foo>" "bar" + a # => "barfoo"
  50. ͦ͏Ͱ΋ͳ͍ײ a = "foo" def a.+(other) return sprintf("<%s|%s>", other, self)

    end a + "bar" # => "<bar|foo>" "bar" + a # => "barfoo"
  51. w 3VCZͰ͸ಛఆͷΦϒδΣΫτʹݻ༗ͷϝιου ͱ͔ Λఆٛ͢ Δ͜ͱ͕Ͱ͖Δɻ w ͔࣮͠͠૷্͸ϝιου͸Ϋϥεͷߏ଄ମʹ͍͍ͬͭͯ͘Δͨ Ίɺ͜ΕΛ࣮ݱ͢ΔͨΊʹதؒతͳΫϥεߏ଄ମ͕ ඞཁʹͳͬ ͨͱ͖ʹ͸͡Ίͯɺಈతʹ

    ࡞੒͞ΕΔ w ͜Ε͕ಛҟΫϥε ಛҟΫϥε
  52. ಛҟΫϥεͷ࣮૷ a = "foo" def a.foo 1+2 end

  53. *4FRʹม׵ == disasm: #<ISeq:foo@<compiled>>========================== 0000 putobject 1 0002 putobject 2

    0004 send <callinfo!mid:+, argc:1, ARGS_SIMPLE> 0008 leave == disasm: #<ISeq:<compiled>@<compiled>>=================== 0000 putstring "foo" 0002 setlocal a 0005 putobject RubyVM::FrozenCore 0007 getlocal a 0010 putobject :foo 0012 putiseq #<ISeq:foo@<compiled>> 0014 send <callinfo!mid:core#define_singleton_method, argc:3, ARGS_SIMPLE> 0018 leave
  54. VALUE *const saved_sp = th__->cfp->sp; \ th__->cfp->sp = curr_sp; \

    expr; \ (th__->cfp--)->sp = saved_sp; \ } while (0) static VALUE m_core_define_method(VALUE self, VALUE sym, VALUE iseqval) { REWIND_CFP({ vm_define_method(GET_THREAD(), Qnil, SYM2ID(sym), iseqval, FALSE); }); return sym; } static VALUE m_core_define_singleton_method(VALUE self, VALUE cbase, VALUE sym, VALUE iseqval) { REWIND_CFP({ vm_define_method(GET_THREAD(), cbase, SYM2ID(sym), iseqval, TRUE); }); return sym; } static VALUE m_core_set_method_alias(VALUE self, VALUE cbase, VALUE sym1, VALUE sym2) { REWIND_CFP({ rb_alias(cbase, SYM2ID(sym1), SYM2ID(sym2));
  55. VALUE *const saved_sp = th__->cfp->sp; \ th__->cfp->sp = curr_sp; \

    expr; \ (th__->cfp--)->sp = saved_sp; \ } while (0) static VALUE m_core_define_method(VALUE self, VALUE sym, VALUE iseqval) { REWIND_CFP({ vm_define_method(GET_THREAD(), Qnil, SYM2ID(sym), iseqval, FALSE); }); return sym; } static VALUE m_core_define_singleton_method(VALUE self, VALUE cbase, VALUE sym, VALUE iseqval) { REWIND_CFP({ vm_define_method(GET_THREAD(), cbase, SYM2ID(sym), iseqval, TRUE); }); return sym; } static VALUE m_core_set_method_alias(VALUE self, VALUE cbase, VALUE sym1, VALUE sym2) { REWIND_CFP({ rb_alias(cbase, SYM2ID(sym1), SYM2ID(sym2));
  56. static void vm_define_method(rb_thread_t *th, VALUE obj, ID id, VALUE iseqval,

    int is_singleton) { VALUE klass; rb_method_visibility_t visi; rb_cref_t *cref = rb_vm_cref(); if (!is_singleton) { klass = CREF_CLASS(cref); visi = rb_scope_visibility_get(); } else { /* singleton */ klass = rb_singleton_class(obj); /* class and frozen checked in this API */ visi = METHOD_VISI_PUBLIC; } if (NIL_P(klass)) { rb_raise(rb_eTypeError, "no class/module to add method"); } rb_add_method_iseq(klass, id, (const rb_iseq_t *)iseqval, cref, visi); if (!is_singleton && rb_scope_module_func_check()) { klass = rb_singleton_class(klass);
  57. VALUE rb_singleton_class(VALUE obj) { VALUE klass = singleton_class_of(obj); /* ensures

    an exposed class belongs to its own eigenclass */ if (RB_TYPE_P(obj, T_CLASS)) (void)ENSURE_EIGENCLASS(klass); return klass; }
  58. static VALUE singleton_class_of(VALUE obj) { VALUE klass; if (FIXNUM_P(obj) ||

    FLONUM_P(obj) || STATIC_SYM_P(obj)) { (中略) } klass = RBASIC(obj)->klass; if (!(FL_TEST(klass, FL_SINGLETON) && rb_ivar_get(klass, id_attached) == obj)) { klass = rb_make_metaclass(obj, klass); } if (OBJ_TAINTED(obj)) { OBJ_TAINT(klass); } else { FL_UNSET(klass, FL_TAINT); } if (OBJ_FROZEN(obj)) OBJ_FREEZE_RAW(klass); return klass;
  59. static VALUE singleton_class_of(VALUE obj) { VALUE klass; if (FIXNUM_P(obj) ||

    FLONUM_P(obj) || STATIC_SYM_P(obj)) { (中略) } klass = RBASIC(obj)->klass; if (!(FL_TEST(klass, FL_SINGLETON) && rb_ivar_get(klass, id_attached) == obj)) { klass = rb_make_metaclass(obj, klass); } if (OBJ_TAINTED(obj)) { OBJ_TAINT(klass); } else { FL_UNSET(klass, FL_TAINT); } if (OBJ_FROZEN(obj)) OBJ_FREEZE_RAW(klass); return klass; ϝλΫϥεͱ͸ʜʁ
  60. VALUE rb_make_metaclass(VALUE obj, VALUE unused) { if (BUILTIN_TYPE(obj) == T_CLASS)

    { return make_metaclass(obj); } else { return make_singleton_class(obj); } }
  61. static inline VALUE make_singleton_class(VALUE obj) { VALUE orig_class = RBASIC(obj)->klass;

    VALUE klass = rb_class_boot(orig_class); FL_SET(klass, FL_SINGLETON); RBASIC_SET_CLASS(obj, klass); rb_singleton_class_attached(klass, obj); SET_METACLASS_OF(klass, METACLASS_OF(rb_class_real(orig_class))); return klass; } ίϯετϥΫλؔ਺ ϙΠϯλॻ͖׵͑ͯΔ
  62. Α͏͢Δʹ obj orig_class その親

  63. Α͏͢Δʹ obj orig_class その親 特異クラス

  64. Α͏͢Δʹ obj orig_class その親 特異クラス

  65. ݁ہ͜Ε͸Կʁ static inline VALUE make_singleton_class(VALUE obj) { VALUE orig_class =

    RBASIC(obj)->klass; VALUE klass = rb_class_boot(orig_class); FL_SET(klass, FL_SINGLETON); RBASIC_SET_CLASS(obj, klass); rb_singleton_class_attached(klass, obj); SET_METACLASS_OF(klass, METACLASS_OF(rb_class_real(orig_class))); return klass; }
  66. w ʮΫϥεͷΫϥεʯ w ࣮͸3VCZʹ͓͍ͯ͸Ϋϥε΋ΦϒδΣΫτͷҰछͰɺ::Class ͱ͍͏ม਺໊ͰΞΫηεͰ͖ΔΫϥε ҎԼClassΫϥε ͷΠϯ ελϯεɻ w ͔͠͠ݟ͖ͯͨΑ͏ʹɺ3VCZʹ͸ಛҟΫϥεͱ͍͏֓೦͕͋

    Γɺ͜Ε͸౰વΫϥεͷΦϒδΣΫτࣗ਎ʹ΋ద༻͞ΕΔ ϝλΫϥε
  67. ϝλΫϥε obj 通常の意味の クラス その親 特異クラス

  68. ϝλΫϥε obj 通常の意味の クラス その親 特異クラス Classクラス

  69. ϝλΫϥε obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス

  70. ϝλΫϥε obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス

  71. ϝλΫϥε obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス

  72. ϝλΫϥε

  73. w ʮಛҟΫϥε͸Ϋϥεʹ΋ద༻͞ΕΔʯ ϝλΫϥε

  74. w ʮಛҟΫϥε͸Ϋϥεʹ΋ద༻͞ΕΔʯ w ʮಛҟΫϥεʯͦΕࣗ਎͸ΦϒδΣΫτͰ͔͢ʁ ϝλΫϥε

  75. w ʮಛҟΫϥε͸Ϋϥεʹ΋ద༻͞ΕΔʯ w ʮಛҟΫϥεʯͦΕࣗ਎͸ΦϒδΣΫτͰ͔͢ʁ w ˠ͸͍ ϝλΫϥε

  76. w ʮಛҟΫϥε͸Ϋϥεʹ΋ద༻͞ΕΔʯ w ʮಛҟΫϥεʯͦΕࣗ਎͸ΦϒδΣΫτͰ͔͢ʁ w ˠ͸͍ w ʮಛҟΫϥεʯͷΫϥε͸ͳΜͰ͔͢ʁ ϝλΫϥε

  77. w ʮಛҟΫϥε͸Ϋϥεʹ΋ద༻͞ΕΔʯ w ʮಛҟΫϥεʯͦΕࣗ਎͸ΦϒδΣΫτͰ͔͢ʁ w ˠ͸͍ w ʮಛҟΫϥεʯͷΫϥε͸ͳΜͰ͔͢ʁ w ˠʮClassΫϥεʯͰ͢

    ϝλΫϥε
  78. w ʮಛҟΫϥε͸Ϋϥεʹ΋ద༻͞ΕΔʯ w ʮಛҟΫϥεʯͦΕࣗ਎͸ΦϒδΣΫτͰ͔͢ʁ w ˠ͸͍ w ʮಛҟΫϥεʯͷΫϥε͸ͳΜͰ͔͢ʁ w ˠʮClassΫϥεʯͰ͢

    w ʮಛҟΫϥεʯʹ͸ಛҟΫϥε͸͋Γ·͔͢ʁ ϝλΫϥε
  79. w ʮಛҟΫϥε͸Ϋϥεʹ΋ద༻͞ΕΔʯ w ʮಛҟΫϥεʯͦΕࣗ਎͸ΦϒδΣΫτͰ͔͢ʁ w ˠ͸͍ w ʮಛҟΫϥεʯͷΫϥε͸ͳΜͰ͔͢ʁ w ˠʮClassΫϥεʯͰ͢

    w ʮಛҟΫϥεʯʹ͸ಛҟΫϥε͸͋Γ·͔͢ʁ w ˠ͸͍ ϝλΫϥε
  80. ϝλΫϥε obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス

  81. ϝλΫϥε obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス

  82. ϝλΫϥε obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス 特異2クラス メタ2クラス

    メタClassクラス
  83. ϝλΫϥε obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス 特異2クラス メタ2クラス

    メタClassクラス
  84. ϝλΫϥε obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス 特異2クラス メタ2クラス

    メタClassクラス
  85. obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス 特異2クラス メタ2クラス メタClassクラス

  86. obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス メタClassクラス

  87. obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス メタClassクラス Moduleクラス Objectクラス

  88. obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス メタClassクラス Moduleクラス Objectクラス

    メタModuleクラス メタObjectクラス
  89. obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス メタClassクラス Moduleクラス Objectクラス

    メタModuleクラス メタObjectクラス
  90. obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス メタClassクラス Moduleクラス Objectクラス

    メタModuleクラス メタObjectクラス
  91. obj 通常の意味の クラス その親 特異クラス メタクラス Classクラス メタClassクラス Moduleクラス Objectクラス

    メタModuleクラス メタObjectクラス メタ2Module メタ2Object
  92. ͻͲ͍ ΧΦε

  93. w ʮΫϥε΋ΦϒδΣΫτʯͱ͍͏ͷ͕ࠜຊతޡΓͩͬͨ w Ϋϥε ܕ ͷܕͦͷ΋ͷ͕Ϋϥεͱಉ͡֊૚ʹଘࡏ͢Δ͜ͱΛڐ ͢ͱɺ(JSBSETQBSBEPY͕ಋೖ͞Εͯ͠·͏ɻ w ʮܕͷܕ໰୊ʯͰ͙͙Ε Ͳ͏ͯ͜͠͏ͳͬͨ

  94. w ʮΫϥε΋ΦϒδΣΫτʯͱ͍͏ͷ͕ࠜຊతޡΓͩͬͨ w Ϋϥε ܕ ͷܕͦͷ΋ͷ͕Ϋϥεͱಉ͡֊૚ʹଘࡏ͢Δ͜ͱΛڐ ͢ͱɺ(JSBSETQBSBEPY͕ಋೖ͞Εͯ͠·͏ɻ w ʮܕͷܕ໰୊ʯͰ͙͙Ε Ͳ͏ͯ͜͠͏ͳͬͨ

  95. w 3VCZͷΦϒδΣΫτࢦ޲͸ΧΦε w ܕγεςϜʹύϥυοΫεΛؚΜͰ͍ΔͬΆ͍ w ΂ͭʹܕ͕Ϳͬ͜ΘΕͯΔͷ͸3VCZʹݶͬͨಛ௃͡Όͳ͍͕ w ଞࢁͷੴͱ͍ͯͩ͘͠͞ʂʂ̍ ·ͱΊ

  96. ͓ΘΓ 3VCZ6OEFSB.JDSPTDPQF͸ୡਓग़൛ձͰങ͑·͢ɻങ͍·͠ΐ͏ɻ ࠓ೔ͷ࿩͸ࡌͬͯͳ͍͚Ͳɻ