Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

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

662 visualizaciones

Publicado el

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

Publicado en: Ingeniería
  • Inicia sesión para ver los comentarios

  • Sé el primero en recomendar esto

低レイヤから見た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. ご清聴 ありがとうございました

×