Ruby 2.x 源代码学习:RubyVM & InstructionSequence
前言
引用 RubyVM::InstructionSequence 文档:
RubyVM::InstructionSequence 类是对运行在 Ruby 虚拟机上的指令序列的抽象,使用该类,我们可以将 Ruby 源代码字符串编译成虚拟机内部的指令序列,以此来探究虚拟机内部的工作原理,同时通过灵活的编译参数,我们可以控制 Ruby 指令生成过程
所以通过挖掘 RubyVM & InstructionSequence 类的实现可以从另一个角度来分析 Ruby 语言的解释过程
RubyVM 类
定义
RubyVM 和 Thread 类一样,也是一个 Ruby native 类,在 Init_VM 中定义:
// vm.c void Init_VM(void) { ... rb_cRubyVM = rb_define_class("RubyVM", rb_cObject); rb_undef_alloc_func(rb_cRubyVM); rb_undef_method(CLASS_OF(rb_cRubyVM), "new"); rb_define_singleton_method(rb_cRubyVM, "stat", vm_stat, -1); ... }
new 方法被 undef 掉,增加了一个 stat 方法,具体实现在 vm_stat 函数中
InstructionSequence 类
定义
InstructionSequence 类的定义在 Init_ISeq 函数中:
// iseq.c void Init_ISeq(void) { /* declare ::RubyVM::InstructionSequence */ // 定义类 rb_cISeq = rb_define_class_under(rb_cRubyVM, "InstructionSequence", rb_cObject); rb_undef_alloc_func(rb_cISeq); // 通过 rb_define_method 定义 inspect, disasm 等方法 rb_define_method(rb_cISeq, "inspect", iseqw_inspect, 0); rb_deifne_method(rb_cISeq, "disasm", iseqw_disasm, 0); ... }
InstructionSequence 类方法的 native 实现大多以 iseqw_ 为前缀
compile
compile 方法用于将 Ruby 源代码字符串编译成指令序列,对应的 native 实现是 iseqw_s_compile 函数:
static VALUE iseqw_s_compile(int argc, VALUE *argv, VALUE self) { VALUE src, file = Qnil, path = Qnil, line = INT2FIX(1), opt = Qnil; int i; rb_secure(1); i = rb_scan_args(argc, argv, "1*:", &src, NULL, &opt); if (i > 4+NIL_P(opt)) rb_error_arity(argc, 1, 5); switch (i) { case 5: opt = argv[--i]; case 4: line = argv[--i]; case 3: path = argv[--i]; case 2: file = argv[--i]; } // file 默认值 if (NIL_P(file)) file = rb_fstring_cstr("<compiled>"); // line 默认值 if (NIL_P(line)) line = INT2FIX(1); return iseqw_new(rb_iseq_compile_with_option(src, file, path, line, 0, opt)); }
相关推荐
yangjinpingc 2020-10-09
Morelia 2020-09-04
起点 2020-08-17
playoffs 2020-08-06
Web前端成长之路 2020-07-07
jeason 2020-06-09
缘起宇轩阁 2020-06-09
佛系程序员J 2020-06-09
beibeijia 2020-06-07
chinademon 2020-06-01
乌冬面 2020-05-25
longjing 2020-05-25
TinyDolphin 2020-05-19
起点 2020-05-10
nanbiebao 2020-05-03
xiaoyaodaia 2020-04-27
GeorgeTH 2020-04-27