最近在看Ruby Under a Microscope分析Ruby内部的运行机制,准备写一些总结
首先从Ruby的Block写起吧(原文是第8章)
Ruby的Block就是Ruby中的Closure Closure.Closure这个概念是从Lisp中得到的,有两个部分构成
1.一个能够运行的代码片段
2.供这个代码片段运行的环境
Ruby中是这么处理Block的,在运行闭包前,会创建一个rb_block_t的结构,这个结构中有两个指针,一个iseq指向闭包的代码片段(字节码),另一个EP指向YARV internal stack的运行环境。
Example
str = "The quick brown fox"
10.times do
str2 = "jumps over the lazy dog"
puts "#{str} #{str2}"
end
这个代码就会在internal stack上创建三个rb_control_frame_t ,最底下的是整个代码已进入压进去的(你可以想象这个代码是在一个函数中实现并被调用的),第二个是10.times运行的时候Fixnum#times为了调用内部的C code压的,第三个是运行闭包时压的。但是第三个运行闭包的时候压的不是rb_control_frame_t而是rb_block_t,这两个结构十分像,你可以当作是差不多的东西,在创建第三个stack frame的时候,他的环境EP跟第二个是一样的(实际上应该就是使用第二个stack frame所在的内存,因为这两个结构很像,只需要加上一个offset就能得到rb_block_t所需要的struct element了)