Slide 1

Slide 1 text

ruby -e 'p 1'を ぜんぶ見る meguro.rb 2018-09-27 ujihisa

Slide 2

Slide 2 text

はじめてのCRubyのソースコードの読み方 ● 興味あるXの実装から ○ メソッド ○ parser ○ GC ● mainから実行順 ○ 静的 ○ 動的 ● ソースコードのファイル名アルファベット順に全部

Slide 3

Slide 3 text

はじめてのCRubyのソースコードの読み方 ● 興味あるXの実装から ○ メソッド ←僕は長らくこれで読んでた ○ parser ←めっちゃ楽しい (そしてつらい) ○ GC ←挫折 (nariさんの本読んで完全に理解    ) ● mainから実行順 ○ 静的 ←事例けっこうあるぽい? ○ 動的 ←本発表 ● ソースコードのファイル名アルファベット順に全部

Slide 4

Slide 4 text

-e command Specifies script from command-line while telling Ruby not to search the rest of the arguments for a script file name.

Slide 5

Slide 5 text

Demo with GDB Linux ● RUBY_CFLAGS="-ggdb3" RUBY_OPTFLAGS='-O0' rbenv install -k 2.6.0-dev ● gdb `rbenv which ruby` -q --tui ● :execute 'Termdebug' trim(system('rbenv which ruby')) ● start -e 'p 123' ● call rb_p(ばりゅー) ● おまけ ○ mrkn/vim-cruby ○ ctags -R Mac ● 後述

Slide 6

Slide 6 text

(gvimとtermdebug.vimによるデモ)

Slide 7

Slide 7 text

用語集 ● iseq ○ instruction sequence ○ (みんなが日常的に会話に出すやつ) ● ec ○ current execution context (vm_eval.c) ● cfp ○ Control Frame Pointer (doc/yarvarch.ja) ○ pcとspとselfを持つ ● pc ○ Program Counter (doc/yarvarch.ja) ● sp ○ Stack Pointer ● ep ○ Environment Pointer

Slide 8

Slide 8 text

VALUE逆引き表 include/ruby/ruby.h enum ruby_value_type { RUBY_T_NONE = 0x00, RUBY_T_OBJECT = 0x01, RUBY_T_CLASS = 0x02, RUBY_T_MODULE = 0x03, RUBY_T_FLOAT = 0x04, RUBY_T_STRING = 0x05, RUBY_T_REGEXP = 0x06, RUBY_T_ARRAY = 0x07, RUBY_T_HASH = 0x08, RUBY_T_STRUCT = 0x09, RUBY_T_BIGNUM = 0x0a, RUBY_T_FILE = 0x0b, RUBY_T_DATA = 0x0c, RUBY_T_MATCH = 0x0d, RUBY_T_COMPLEX = 0x0e, RUBY_T_RATIONAL = 0x0f, RUBY_T_NIL = 0x11, RUBY_T_TRUE = 0x12, RUBY_T_FALSE = 0x13, RUBY_T_SYMBOL = 0x14, RUBY_T_FIXNUM = 0x15, RUBY_T_UNDEF = 0x16, RUBY_T_IMEMO = 0x1a, /*!< @see imemo_type */ RUBY_T_NODE = 0x1b, RUBY_T_ICLASS = 0x1c, RUBY_T_ZOMBIE = 0x1d,

Slide 9

Slide 9 text

今回説明を省いた点 ● insns.def ○ insns.def - YARV instruction definitions ○ YARV命令の実装 (putselfとかそういうやつ) ○ CだけどCに見えないと噂 ● vm.inc ○ コンパイル時にinsns.defからRubyで生成される

Slide 10

Slide 10 text

ujihisa ● @ujm ● Quipper社 2018-09-01から ○ Rails ● Fablic社 2017-01-01から ○ Rails ● Hootsuite社 2010から ○ 非Ruby ● 今月オススメの魚 ○ 秋刀魚 ● 最近の活動 ○ VimConf 2018  の主催 ○ https://vimconf.org/2018

Slide 11

Slide 11 text

おまけ: macOS High Sierraでgdbを使う方法 おすすめ ● Gentoo Linuxなど、便利なLinux distributionを入れ、そこで行う 遅いけど結構おすすめ ● VirtualboxとかDockerとかそれ系でなんかのLinuxを使えるようにし、それで行う 一応あり ● 古いMac OSXで上書きインストール

Slide 12

Slide 12 text

おまけ: macOS High Sierraでgdbを使う方法 絶対におすすめしない最悪の方法 ● macOS High Sierraでgdbを使う ● 17ステップぐらいある ○ gdbのダウングレード、バージョン固定 ○ https://gist.github.com/danisfermi/17d6c0078a2fd4c6ee818c954d2de13c ■ GUIでぽちぽちしたり再起動したりいろいろつらい想いをする ■ リカバリモードで起動とか ■ だいたい失敗するので何度も再挑戦する ■ つらい、不毛、非生産的な作業の連続