本文從 require 語句入手爲你們揭開 Ruby 擴展(ext)的面紗java
咱們知道 require 語句能夠引入模塊,就像 java 裏面的 import 語句能夠引入類,c/c++ 裏面的 include 語句能夠引入頭文件甚至源文件。可是 Ruby 中的 require 與兩者有着本質的不一樣,它其實是一個方法(函數)調用,是運行期而非編譯期的行爲c++
在 Init_load 函數裏面定義了 require 方法:函數
load.c void Init_load(void) { ... rb_define_global_function("require", rb_f_require, 1); ... }
簡單起見咱們省略掉一些中間函數調用細節,列出 rb_f_require 的調用棧ui
rb_f_require @ load.c rb_require_safe @ load.c rb_require_internal @ load.c search_required @ load.c
在分析 search_required 以前咱們先看兩個宏定義:code