Upgrade to Pro — share decks privately, control downloads, hide ads and more …

mruby hacking guide

77897395d9b84463bd474a69b922b2ec?s=47 ksss
April 19, 2014

mruby hacking guide

大江戸Ruby会議04 Ninja Talks
http://regional.rubykaigi.org/oedo04/

77897395d9b84463bd474a69b922b2ec?s=128

ksss

April 19, 2014
Tweet

More Decks by ksss

Other Decks in Programming

Transcript

  1. mruby hacking guide 第256回 Asakusa.rb 2014/04/19 大江戸Ruby会議04

  2. IUUQJMPWFSVCZOFUKBSIHCPPL w .JOFSP"PLJ w 3VCZJTUͷόΠϒϧ w ճಡ΋͏ʂʂ

  3. about me { name: "Yuki Kurihara", twitter: "@_ksss_", github: "ksss",

    commit: "mruby(59)", since: "Feb 26, 2014" }
  4. 生活発表会

  5. 3VCZͱͷग़ձ͍ ・phpに危機感 ・そうだ、外へ出よう ・RubyKaigi2013に行ってみる

  6. 3VCZͱͷग़ձ͍ ・@_zzakのスピーチに感動 ・完全にRubyにハマる ・ゴミみたいなGemを量産

  7. "TBLVTBSCͱͷग़ձ͍ ・今のおまえに足りないものがある ・危機感だ

  8. "TBLVTBSCͱͷग़ձ͍ ・そうだ、Asakusa.rbへ行こう

  9. "TBLVTBSCͱͷग़ձ͍ ・なんか無言でパチパチしてる

  10. "TBLVTBSCͱͷग़ձ͍ ・みんな好き勝手やっているだけ

  11. "TBLVTBSCͱͷग़ձ͍ ・なんだ、好き勝手やっていいんだ

  12. Gemを量産して わかったこと

  13. Rubyの実装は宝の山

  14. None
  15. Ruby is 21 years old Ruby is 21 years old

  16. Ruby is red ocean Ruby is red ocean

  17. None
  18. mruby is 2 years old mruby is 2 years old

  19. mruby is blue ocean mruby is blue ocean

  20. mruby ・コードが短い ・シンプルで読みやすい ・Matzがcommitしてる

  21. ✔ github ✖ mail ✖ redmine IUUQTHJUIVCDPNNSVCZNSVCZ

  22. Let's Hack mruby

  23. VM Object lib Build GC parse.y

  24. “Bad programmers worry about the code. Good programmers worry about

    data structures and their relationships.” Linus Torvalds
  25. ʮඞཁͳσʔλ͸ߏ଄ମʹʯ mrubyの方針 ʮγεςϜʹԿ͔Λڧ੍͠ͳ͍ʯ

  26. 「データ構造重要」

  27. VM Object lib Build GC parse.y

  28. RString

  29. RString ptr len capa lNSVCZz 5 5

  30. Hack

  31. RString ptr len capa lNSVCZz 5 5

  32. RString ptr len capa void * void * void *

    RVALUE
  33. RString lNSVCZz ptr len capa

  34. RString ptr len capa “ m r u b y

    ” as.ary[]
  35. RString struct RString { MRB_OBJECT_HEADER; mrb_int len; union { mrb_int

    capa; struct mrb_shared_string *shared; } aux; char *ptr; };
  36. 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; };
  37. Embed-String ・less -10% memory allocs ! でもこれって…… https://github.com/mruby/mruby/pull/1820

  38. CRubyから パクった

  39. ͜͜Ͱ൒෼͘Β͍

  40. Enumerator

  41. 昔の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
  42. !?

  43. 昔の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
  44. Hack

  45. NSVCZFOVNFSBUPS IUUQTHJUIVCDPNLTTTNSVCZFOVNFSBUPS

  46. NHFN IUUQTHJUIVCDPNNSVCZNHFNMJTU IUUQTHJUIVCDPNCPWJNHFN NHFNMJTU

  47. Send Pull Request to mruby/mgem-list

  48. IUUQTHJUIVCDPNNSVCZNHFNMJTUQVMM %JEZPVNJTUBLFSFQPTJUPSZ GPSTFOEJOHQVMMSFRVFTU  IUUQTHJUIVCDPNNSVCZNSVCZ

  49. /src/* /mrblib/* /mrbgems/* mgem ISO mgem mgem Ruby互換 Freedom

  50. Send Pull Request to mruby/mruby

  51. Merged IUUQTHJUIVCDPNNSVCZNSVCZQVMM

  52. CRubyから パクった

  53. khash

  54. khash ✔IBTIςʔϒϧ ✔$3VCZͰݴ͏TU@UBCMF ✔IU NU JW OT TU ✔γϯϓϧগϝϞϦ ✔։൪஍๏

  55. khash n_buckets size n_occupied mask inc upper_bound keys vals ed_flags

    kh_*
  56. khash keys vals ed_flags malloc( )

  57. khash keys vals ed_flags n_buckets=2

  58. khash keys vals ed_flags empty del khkey_t khval_t n_buckets=1 1

    0 1 0 1 0 1 0
  59. hash[a]=1 a 1 0 1 0 1 0 1 0

    hash function empty del
  60. hash[a]=1 a 1 hash function a 1 0 0 0

    1 0 1 0 empty del 1
  61. hash[b]=2 b 1 hash function a b 1 0 0

    0 0 0 1 0 1 2 empty del
  62. hash[b]=2 b 1 hash function del b 1 0 0

    1 0 0 1 0 - 2 empty del
  63. Hack

  64. 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
  65. 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
  66. kh_get delを無視 kh_put delを上書き khash

  67. khash hashいくつ? 空だった? うん 3 hashいくつ? 3 空だった? うん そこ入れといて

    kh_get kh_put
  68. khash hashいくつ? 空だった? うん 3 hashいくつ? 3 空だった? うん そこ入れといて

  69. khash hashいくつ? 空だった? うん 3 そこ入れといて おっけー kh_put

  70. PRしようとしたら matzに先を越された IUUQTHJUIVCDPNNSVCZNSVCZDPNNJU BFDEBGCDFFBFCEDCECGCDDDFCFE

  71. ͜Ε͔Β΍ͬͯΈ͍ͨ͜ͱ ɾIBTIΛ࿈࠯๏Ͱ࣮૷ͯ͠ൺֱ ɾWN ($ΛಡΜͰվળ ɾͻͨ͢Βόάফ͠

  72. FOE

  73. Hack