Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

低レイヤから見たrubyプログラミング

646 views

Published on

第72回 Ruby関西 勉強会 で発表した資料です。

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

低レイヤから見たrubyプログラミング

  1. 1. よしだあつし 低レイヤ(メモリ)からみた ruby プログラミング
  2. 2. 自己紹介 • 名前: 吉田篤(よしだあつし) • 肩書: 株式会社おけや代表取締役CTO • 職業: ゲームプログラマ(cocos2d-x, rails) • Twitter他: yalab • ruby歴: 12年ぐらい? • rails歴: 10年ぐらい?
  3. 3. PR: まじょのおしごと グッズ通販 shop.oke-ya.com
  4. 4. PR: てんしのおしごと クラウドファンディング実施中 https://www.makuake.com/project/oke-ya/
  5. 5. 目次 • プログラムって何してるの? • メモリと型 • メモリ上の class と object • メソッド呼び出し
  6. 6. 注意点 • rubyの実装は調べましたがこの資料は正確さに はやや欠けます
  7. 7. Q. プログラムって 何してるの?
  8. 8. A. メモリ上の数値を CPUで書き換えている
  9. 9. メモリと型
  10. 10. (2進数) 0110_0001 • 数値だと思うと97 • 文字列だと思うと”a” • (処理系によって解釈は変わります)
  11. 11. ruby処理系でCPU でメモリ上の 数値を書き換えてみる • (2進数) 0110_0001 #=> “a” • “a”.gsub!(“a”, “b”) • (2進数) 0110_0010 #=> “b” • # 実際の ruby の動きとは違います
  12. 12. メモリ上の class と object
  13. 13. Q. class や object って何?
  14. 14. A. class はたい焼きの型で object はたい焼き
  15. 15. はぁ?
  16. 16. Q. class や object って何?
  17. 17. A.class は RClass 構造体。 object は RClass の object_id を持つ RBasic を内部的に持つ RObject 構造体
  18. 18. はぁ?
  19. 19. 構造体?
  20. 20. 構造体? struct Human { char name[255]; int age; }; Human user; メモ リ ??? name age ??? Human
  21. 21. RClass struct RClass { struct RBasic basic; VALUE super; rb_classext_t *ptr; struct rb_id_table *m_tbl; }; メモ リ basic super ptr m_tbl https://github.com/ruby/ruby/blob/ruby_2_3/internal.h#L485
  22. 22. RObjectstruct RObject { struct RBasic basic; union { struct { long numiv; VALUE *ivptr; void *iv_index_tbl; } heap; VALUE ary[ROBJECT_EMBED_LEN_MAX]; } as; }; メモ リ basic super ptr m_tbl https://github.com/ruby/ruby/blob/ruby_2_3/include/ruby/ruby.h#L907
  23. 23. RBasic struct RBasic { VALUE flags; const VALUE klass; } メモ リ flags value https://github.com/ruby/ruby/blob/ruby_2_3/include/ruby/ruby.h#L872
  24. 24. A.class は RClass 構造体。 object は RClass の object_id を持つ RBasic を内部的に持つ RObject 構造体
  25. 25. ruby は RClass や RObject を使ってるらしい
  26. 26. ruby のメモリ利用 class Person attr_reader :name, :age def initialize(name, age) @name = name @age = age end end man = Person.new("taro", 4) woman = Person.new("hanako", 31) メモ リ 空き → 実 行 前
  27. 27. ruby のメモリ利用 class Person attr_reader :name, :age def initialize(name, age) @name = name @age = age end end man = Person.new("taro", 4) woman = Person.new("hanako", 31) メモ リ RClass(Person) 空き こ こ ま で 解 釈 →
  28. 28. ruby のメモリ利用 class Person attr_reader :name, :age def initialize(name, age) @name = name @age = age end end man = Person.new("taro", 4) woman = Person.new("hanako", 31) メモ リ RClass(Person) RObject(man) "taro" 4 空き こ こ ま で 解 釈 →
  29. 29. ruby のメモリ利用 class Person attr_reader :name, :age def initialize(name, age) @name = name @age = age end end man = Person.new("taro", 4) woman = Person.new("hanako", 31) こ こ ま で 解 釈 → メモ リ RClass(Person) RObject(man) "taro" 4 RObject(woman) "hanako" 31 空き
  30. 30. ruby のメモリ利用 class Person attr_reader :name, :age def initialize(name, age) @name = name @age = age end end man = Person.new("taro", 4) woman = Person.new("hanako", 31) こ こ ま で 解 釈 → object_id メモ リ RClass(Person) RObject(man) "taro" 4 RObject(woman) "hanako" 31 空き
  31. 31. ruby は RClass や RObject をメモリ上に作る - class 定義時 - new した時 - リテラルを書いた時
  32. 32. メソッド呼び出し
  33. 33. struct RObject { struct RBasic basic; union { struct { long numiv; VALUE *ivptr; void *iv_index_tbl; } heap; VALUE ary[ROBJECT_EMBED_LEN_MAX]; } as; }; struct RClass { struct RBasic basic; VALUE super; rb_classext_t *ptr; struct rb_id_table *m_tbl; };
  34. 34. メソッド呼び出し class Person attr_reader :name, :age def initialize(name, age) @name = name @age = age end end man = Person.new("taro", 4) man.name #=> “taro” メモ リ RClass(Person) RObject(man) "taro" 4 空き
  35. 35. メソッド呼び出し man.name #=> “taro” メモ リ RClass(Person) RObject(man) "taro" 4 空き struct RObject { struct RBasic basic; union { struct { long numiv; VALUE *ivptr; void *iv_index_tbl; } heap; VALUE ary[ROBJECT_EMBED_LEN_MAX]; } as; };
  36. 36. メソッド呼び出し man.name #=> “taro” メモ リ RClass(Person) RObject(man) "taro" 4 空き klass struct RBasic { VALUE flags; const VALUE klass; }
  37. 37. メソッド呼び出し man.name #=> “taro” メモ リ RClass(Person) RObject(man) "taro" 4 空き struct RBasic { VALUE flags; const VALUE klass; } klass
  38. 38. メソッド呼び出し man.name #=> “taro” メモ リ RClass(Person) RObject(man) "taro" 4 空き struct RClass { struct RBasic basic; VALUE super; rb_classext_t *ptr; struct rb_id_table *m_tbl; }; m_tbl
  39. 39. メソッド呼び出し man.name #=> “taro” メモ リ RClass(Person) RObject(man) "taro" 4 空き m_tbl struct RObject { struct RBasic basic; union { struct { long numiv; VALUE *ivptr; void *iv_index_tbl; } heap; VALUE ary[ROBJECT_EMBED_LEN_MAX]; } as;
  40. 40. ここからは僕の主張
  41. 41. たい焼き VS 構造体
  42. 42. プログラミング 抽象化され過ぎ
  43. 43. 一つ下のレイヤを見る と理解が進みます
  44. 44. 今回の資料作りのために cruby 読んで 大変勉強になりました
  45. 45. ご清聴 ありがとうございました

×