原本目標之一是要瞭解 ruby code 如何變成 CPU instruction,直覺想法是從 YARV 的 main() 開始看程式碼。目前確認到:
main()
,在 main.c 的實作很單純。在 ruby_sysinit
中第一個跳過沒仔細看的是 fill_standard_fds()
。裡面用到 fstat, pipe, dup2
。RUBY_INIT_STACK
呼叫 ruby_init_stack
,這裡的 stack 應該是 thread 的 stack,是 OS 管理的。其中一個技巧是先 declare 一個 variable,它應該就是如其名 variable_in_this_stack_frame
標記此 thread 用到的 stack 起點。用途還不清楚。ruby_setup
會初始化 YARV VM,記在 ruby_current_vm_ptr
,VM 包含很多資訊例如 objspace。objspace 又會在 Init_heap
被初始化。另外 ruby 程式會用到的 native class 和特殊常數會在 rb_call_inits(), ruby_prog_init()
中初始化ruby_options
看起來是會 parse ruby 程式的地方,裡面會一層層呼叫到 yycompile
VALUE
但實際是個 pointer (rb_ast_t*, rb_iseq_t*, RData*
),這些 struct 的共同點是第一個值是 flags
,應該是靠 flag 來判斷如何解讀指向的結構。為什麼要定義 VALUE
而不直接 cast 成 void*
的原因還不清楚到此大概有 ruby code 轉換成 AST 的架構,接下來要看 AST to YARV instruction。