Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

3VCZͱ͸

Slide 6

Slide 6 text

w ݹ͍ɻ+BWBಉ࣌ظ w ͳͷͰࠓ࣌ͬΆ͍ݴޠػೳ͸ݢฒΈܽ͘ w ࣮͸+*4ʹͳ͍ͬͯΔ w +*49 *40*&$ w ओʹ੓෎ௐୡͷ౎߹ʹΑΔ w ੲ͸ʮΦϒδΣΫτࢦ޲εΫϦϓτݴޠ3VCZʯͱ໊৐͍ͬͯͨ w ࠓ೔͸จ๏ͷ࿩͸͠ͳ͍͕ จ๏͕͍Ζ͍Ζม w L-0$QBSTFZXJUIDPOqJDUT w &NBDTʹର͢Δ௅ઓͱͯ͠࡞ΒΕ͍ͯΔ໘͕͋Δ 3VCZͱ͸

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

http://www.slideshare.net/yukihiro_matz/how-emacs-changed-my-life

Slide 12

Slide 12 text

3VCZ͕ Ͳ͏ಈ͔͘

Slide 13

Slide 13 text

1+2

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

SVCZεΫϦϓτ 1+2

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

[:binary, [:@int, "1", [1, 0]], :+, [:@int, "2", [1, 2]]] "45ʹม׵ ߦ൪߸ͱ͔ͳͷͰ ๨Εͯ0, ͜Εͱ͍ͬͯ ಛ௃ͷͳ͍ ڭՊॻ௨Γͷ ந৅ߏจ໦

Slide 19

Slide 19 text

"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)

Slide 20

Slide 20 text

"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)

Slide 21

Slide 21 text

"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」 次の要素は なし

Slide 22

Slide 22 text

*4FRʹม׵ == disasm: #@>== 0000 putobject 1 0002 putobject 2 0004 send 0006 leave

Slide 23

Slide 23 text

*4FRʹม׵ == disasm: #@>== 0000 putobject 1 0002 putobject 2 0004 send 0006 leave ※スタックマシン

Slide 24

Slide 24 text

*4FRʹม׵ == disasm: #@>== 0000 putobject 1 0002 putobject 2 0004 send 0006 leave 1 ※スタックマシン

Slide 25

Slide 25 text

*4FRʹม׵ == disasm: #@>== 0000 putobject 1 0002 putobject 2 0004 send 0006 leave 1 2 ※スタックマシン

Slide 26

Slide 26 text

*4FRʹม׵ == disasm: #@>== 0000 putobject 1 0002 putobject 2 0004 send 0006 leave ※スタックマシン 3

Slide 27

Slide 27 text

SVCZεΫϦϓτ def foo 1+2 end

Slide 28

Slide 28 text

*4FRʹม׵ == disasm: #>========= 0000 putobject 1 0002 putobject 2 0004 send 0006 leave == disasm: #@>== 0000 putobject RubyVM::FrozenCore 0002 putobject :foo 0004 putiseq #> 0006 send 0008 leave

Slide 29

Slide 29 text

*4FRʹม׵ == disasm: #>========= 0000 putobject 1 0002 putobject 2 0004 send 0006 leave == disasm: #@>== 0000 putobject RubyVM::FrozenCore 0002 putobject :foo 0004 putiseq #> 0006 send 0008 leave

Slide 30

Slide 30 text

͍͍ͩͨ ͳΜͰ΋ send

Slide 31

Slide 31 text

w ී௨ͷϝιουݺͼग़͠ w ී௨ͷԋࢉࢠ ൺֱͱ͔ w ྫ֎ͷraise • lambda w ϝιουఆٛ ݟͨͱ͓Γ sendͰ࣮ݱ͞Ε͍ͯΔࣄ ͱ͸͍͑શ෦͡Όͳ͍ɺͨͱ͑͹ifจͳͲ͸4NBMMUBMLͰ͸ϝιουͩ ͕3VCZͰ͸ҧ͏ɻ͜ͷΑ͏ͳΑ͍͑͘͹࣮ફతɺѱ͘ݴ͑͹೔࿨ݟͳ ࢟੎͸ྑ͘΋ѱ͘΋3VCZΛಛ௃෇͚͍ͯΔͱ͸ݴ͑Δɻ

Slide 32

Slide 32 text

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); }

Slide 33

Slide 33 text

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); }

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

ͳΜΒ͔ ͷํ๏

Slide 37

Slide 37 text

ΦϒδΣΫτ ʹฉ͘

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

࠶ܝ 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); }

Slide 42

Slide 42 text

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 }

Slide 43

Slide 43 text

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); }

Slide 44

Slide 44 text

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); }

Slide 45

Slide 45 text

/* * 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)) {

Slide 46

Slide 46 text

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; }

Slide 47

Slide 47 text

w ·ͣrecv͕͋ͬͯ w klass = CLASS_OF(recv)Λج४ʹ w klass = RCLASS_SUPER(klass)ΛͨͲΓͳ͕Β w lookup_method_table(klass, id)͕ώοτ͢Δ·Ͱݕࡧ Λଓ͚Δ ·ͱΊΔͱ

Slide 48

Slide 48 text

·ͱΊΔͱ recv klass klass klass klass klass klass klass klass

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

w 3VCZͰ͸ಛఆͷΦϒδΣΫτʹݻ༗ͷϝιου ͱ͔ Λఆٛ͢ Δ͜ͱ͕Ͱ͖Δɻ w ͔࣮͠͠૷্͸ϝιου͸Ϋϥεͷߏ଄ମʹ͍͍ͬͭͯ͘Δͨ Ίɺ͜ΕΛ࣮ݱ͢ΔͨΊʹதؒతͳΫϥεߏ଄ମ͕ ඞཁʹͳͬ ͨͱ͖ʹ͸͡Ίͯɺಈతʹ ࡞੒͞ΕΔ w ͜Ε͕ಛҟΫϥε ಛҟΫϥε

Slide 52

Slide 52 text

ಛҟΫϥεͷ࣮૷ a = "foo" def a.foo 1+2 end

Slide 53

Slide 53 text

*4FRʹม׵ == disasm: #>========================== 0000 putobject 1 0002 putobject 2 0004 send 0008 leave == disasm: #@>=================== 0000 putstring "foo" 0002 setlocal a 0005 putobject RubyVM::FrozenCore 0007 getlocal a 0010 putobject :foo 0012 putiseq #> 0014 send 0018 leave

Slide 54

Slide 54 text

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));

Slide 55

Slide 55 text

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));

Slide 56

Slide 56 text

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);

Slide 57

Slide 57 text

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; }

Slide 58

Slide 58 text

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;

Slide 59

Slide 59 text

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; ϝλΫϥεͱ͸ʜʁ

Slide 60

Slide 60 text

VALUE rb_make_metaclass(VALUE obj, VALUE unused) { if (BUILTIN_TYPE(obj) == T_CLASS) { return make_metaclass(obj); } else { return make_singleton_class(obj); } }

Slide 61

Slide 61 text

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; } ίϯετϥΫλؔ਺ ϙΠϯλॻ͖׵͑ͯΔ

Slide 62

Slide 62 text

Α͏͢Δʹ obj orig_class その親

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

݁ہ͜Ε͸Կʁ 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; }

Slide 66

Slide 66 text

w ʮΫϥεͷΫϥεʯ w ࣮͸3VCZʹ͓͍ͯ͸Ϋϥε΋ΦϒδΣΫτͷҰछͰɺ::Class ͱ͍͏ม਺໊ͰΞΫηεͰ͖ΔΫϥε ҎԼClassΫϥε ͷΠϯ ελϯεɻ w ͔͠͠ݟ͖ͯͨΑ͏ʹɺ3VCZʹ͸ಛҟΫϥεͱ͍͏֓೦͕͋ Γɺ͜Ε͸౰વΫϥεͷΦϒδΣΫτࣗ਎ʹ΋ద༻͞ΕΔ ϝλΫϥε

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

ϝλΫϥε

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

ͻͲ͍ ΧΦε

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

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