Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
mruby hacking guide 第256回 Asakusa.rb 2014/04/19 大江戸Ruby会議04
Slide 2
Slide 2 text
IUUQJMPWFSVCZOFUKBSIHCPPL w .JOFSP"PLJ w 3VCZJTUͷόΠϒϧ w ճಡ͏ʂʂ
Slide 3
Slide 3 text
about me { name: "Yuki Kurihara", twitter: "@_ksss_", github: "ksss", commit: "mruby(59)", since: "Feb 26, 2014" }
Slide 4
Slide 4 text
生活発表会
Slide 5
Slide 5 text
3VCZͱͷग़ձ͍ ・phpに危機感 ・そうだ、外へ出よう ・RubyKaigi2013に行ってみる
Slide 6
Slide 6 text
3VCZͱͷग़ձ͍ ・@_zzakのスピーチに感動 ・完全にRubyにハマる ・ゴミみたいなGemを量産
Slide 7
Slide 7 text
"TBLVTBSCͱͷग़ձ͍ ・今のおまえに足りないものがある ・危機感だ
Slide 8
Slide 8 text
"TBLVTBSCͱͷग़ձ͍ ・そうだ、Asakusa.rbへ行こう
Slide 9
Slide 9 text
"TBLVTBSCͱͷग़ձ͍ ・なんか無言でパチパチしてる
Slide 10
Slide 10 text
"TBLVTBSCͱͷग़ձ͍ ・みんな好き勝手やっているだけ
Slide 11
Slide 11 text
"TBLVTBSCͱͷग़ձ͍ ・なんだ、好き勝手やっていいんだ
Slide 12
Slide 12 text
Gemを量産して わかったこと
Slide 13
Slide 13 text
Rubyの実装は宝の山
Slide 14
Slide 14 text
No content
Slide 15
Slide 15 text
Ruby is 21 years old Ruby is 21 years old
Slide 16
Slide 16 text
Ruby is red ocean Ruby is red ocean
Slide 17
Slide 17 text
No content
Slide 18
Slide 18 text
mruby is 2 years old mruby is 2 years old
Slide 19
Slide 19 text
mruby is blue ocean mruby is blue ocean
Slide 20
Slide 20 text
mruby ・コードが短い ・シンプルで読みやすい ・Matzがcommitしてる
Slide 21
Slide 21 text
✔ github ✖ mail ✖ redmine IUUQTHJUIVCDPNNSVCZNSVCZ
Slide 22
Slide 22 text
Let's Hack mruby
Slide 23
Slide 23 text
VM Object lib Build GC parse.y
Slide 24
Slide 24 text
“Bad programmers worry about the code. Good programmers worry about data structures and their relationships.” Linus Torvalds
Slide 25
Slide 25 text
ʮඞཁͳσʔλߏମʹʯ mrubyの方針 ʮγεςϜʹԿ͔Λڧ੍͠ͳ͍ʯ
Slide 26
Slide 26 text
「データ構造重要」
Slide 27
Slide 27 text
VM Object lib Build GC parse.y
Slide 28
Slide 28 text
RString
Slide 29
Slide 29 text
RString ptr len capa lNSVCZz 5 5
Slide 30
Slide 30 text
Hack
Slide 31
Slide 31 text
RString ptr len capa lNSVCZz 5 5
Slide 32
Slide 32 text
RString ptr len capa void * void * void * RVALUE
Slide 33
Slide 33 text
RString lNSVCZz ptr len capa
Slide 34
Slide 34 text
RString ptr len capa “ m r u b y ” as.ary[]
Slide 35
Slide 35 text
RString struct RString { MRB_OBJECT_HEADER; mrb_int len; union { mrb_int capa; struct mrb_shared_string *shared; } aux; char *ptr; };
Slide 36
Slide 36 text
RString struct RString { MRB_OBJECT_HEADER; union { struct { mrb_int len; union { mrb_int capa; struct mrb_shared_string *shared; } aux; char *ptr; } heap; char ary[RSTRING_EMBED_LEN_MAX + 1]; } as; };
Slide 37
Slide 37 text
Embed-String ・less -10% memory allocs ! でもこれって…… https://github.com/mruby/mruby/pull/1820
Slide 38
Slide 38 text
CRubyから パクった
Slide 39
Slide 39 text
͜͜Ͱ͘Β͍
Slide 40
Slide 40 text
Enumerator
Slide 41
Slide 41 text
昔のHash#each #call-seq: # hsh.each {|k, v| block} -> hsh # hsh.each -> an_enumerator def each(&block) self.keys.each{|k| block.call([k, self[k]]) } self end
Slide 42
Slide 42 text
!?
Slide 43
Slide 43 text
昔のHash#each #call-seq: # hsh.each {|k, v| block} -> hsh # hsh.each -> an_enumerator def each(&block) self.keys.each{|k| block.call([k, self[k]]) } self end
Slide 44
Slide 44 text
Hack
Slide 45
Slide 45 text
NSVCZFOVNFSBUPS IUUQTHJUIVCDPNLTTTNSVCZFOVNFSBUPS
Slide 46
Slide 46 text
NHFN IUUQTHJUIVCDPNNSVCZNHFNMJTU IUUQTHJUIVCDPNCPWJNHFN NHFNMJTU
Slide 47
Slide 47 text
Send Pull Request to mruby/mgem-list
Slide 48
Slide 48 text
IUUQTHJUIVCDPNNSVCZNHFNMJTUQVMM %JEZPVNJTUBLFSFQPTJUPSZ GPSTFOEJOHQVMMSFRVFTU IUUQTHJUIVCDPNNSVCZNSVCZ
Slide 49
Slide 49 text
/src/* /mrblib/* /mrbgems/* mgem ISO mgem mgem Ruby互換 Freedom
Slide 50
Slide 50 text
Send Pull Request to mruby/mruby
Slide 51
Slide 51 text
Merged IUUQTHJUIVCDPNNSVCZNSVCZQVMM
Slide 52
Slide 52 text
CRubyから パクった
Slide 53
Slide 53 text
khash
Slide 54
Slide 54 text
khash ✔IBTIςʔϒϧ ✔$3VCZͰݴ͏TU@UBCMF ✔IU NU JW OT TU ✔γϯϓϧগϝϞϦ ✔։൪๏ ✔
Slide 55
Slide 55 text
khash n_buckets size n_occupied mask inc upper_bound keys vals ed_flags kh_*
Slide 56
Slide 56 text
khash keys vals ed_flags malloc( )
Slide 57
Slide 57 text
khash keys vals ed_flags n_buckets=2
Slide 58
Slide 58 text
khash keys vals ed_flags empty del khkey_t khval_t n_buckets=1 1 0 1 0 1 0 1 0
Slide 59
Slide 59 text
hash[a]=1 a 1 0 1 0 1 0 1 0 hash function empty del
Slide 60
Slide 60 text
hash[a]=1 a 1 hash function a 1 0 0 0 1 0 1 0 empty del 1
Slide 61
Slide 61 text
hash[b]=2 b 1 hash function a b 1 0 0 0 0 0 1 0 1 2 empty del
Slide 62
Slide 62 text
hash[b]=2 b 1 hash function del b 1 0 0 1 0 0 1 0 - 2 empty del
Slide 63
Slide 63 text
Hack
Slide 64
Slide 64 text
khash n_buckets size n_occupied mask inc upper_bound keys vals ed_flags kh_* n_buckets-1 n_buckets/2-1 n_buckets*3/4
Slide 65
Slide 65 text
khash n_buckets size n_occupied mask inc upper_bound keys vals ed_flags kh_* n_buckets-1 n_buckets/2-1 n_buckets*3/4
Slide 66
Slide 66 text
kh_get delを無視 kh_put delを上書き khash
Slide 67
Slide 67 text
khash hashいくつ? 空だった? うん 3 hashいくつ? 3 空だった? うん そこ入れといて kh_get kh_put
Slide 68
Slide 68 text
khash hashいくつ? 空だった? うん 3 hashいくつ? 3 空だった? うん そこ入れといて
Slide 69
Slide 69 text
khash hashいくつ? 空だった? うん 3 そこ入れといて おっけー kh_put
Slide 70
Slide 70 text
PRしようとしたら matzに先を越された IUUQTHJUIVCDPNNSVCZNSVCZDPNNJU BFDEBGCDFFBFCEDCECGCDDDFCFE
Slide 71
Slide 71 text
͜Ε͔ΒͬͯΈ͍ͨ͜ͱ ɾIBTIΛ࿈๏Ͱ࣮ͯ͠ൺֱ ɾWN ($ΛಡΜͰվળ ɾͻͨ͢Βόάফ͠
Slide 72
Slide 72 text
FOE
Slide 73
Slide 73 text
Hack