iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0
自我挑戰組

C again系列 第 13

有點卡住先整理一下

  • 分享至 

  • xImage
  •  

原本目標之一是要瞭解 ruby code 如何變成 CPU instruction,直覺想法是從 YARV 的 main() 開始看程式碼。目前確認到:

  1. ruby process 對應的 entry 是 C 的 main(),在 main.c 的實作很單純。在 ruby_sysinit 中第一個跳過沒仔細看的是 fill_standard_fds()。裡面用到 fstat, pipe, dup2
  2. RUBY_INIT_STACK 呼叫 ruby_init_stack,這裡的 stack 應該是 thread 的 stack,是 OS 管理的。其中一個技巧是先 declare 一個 variable,它應該就是如其名 variable_in_this_stack_frame 標記此 thread 用到的 stack 起點。用途還不清楚。
  3. ruby_setup 會初始化 YARV VM,記在 ruby_current_vm_ptr,VM 包含很多資訊例如 objspace。objspace 又會在 Init_heap 被初始化。另外 ruby 程式會用到的 native class 和特殊常數會在 rb_call_inits(), ruby_prog_init() 中初始化
  4. ruby_options 看起來是會 parse ruby 程式的地方,裡面會一層層呼叫到 yycompile
  5. iseq 的 type casting 有點複雜,宣告時是 VALUE 但實際是個 pointer (rb_ast_t*, rb_iseq_t*, RData*),這些 struct 的共同點是第一個值是 flags,應該是靠 flag 來判斷如何解讀指向的結構。為什麼要定義 VALUE 而不直接 cast 成 void* 的原因還不清楚

到此大概有 ruby code 轉換成 AST 的架構,接下來要看 AST to YARV instruction。


上一篇
YARV stack 上放的資料 (3) - ruby_setup
下一篇
rb_ast_t
系列文
C again30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言