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