最近在看Ruby Under a Microscope分析Ruby內(nèi)部的運(yùn)行機(jī)制,準(zhǔn)備寫(xiě)一些總結(jié)
首先從Ruby的Block寫(xiě)起吧(原文是第8章)
Ruby的Block就是Ruby中的Closure Closure.Closure這個(gè)概念是從Lisp中得到的,有兩個(gè)部分構(gòu)成
1.一個(gè)能夠運(yùn)行的代碼片段
2.供這個(gè)代碼片段運(yùn)行的環(huán)境
Ruby中是這么處理Block的,在運(yùn)行閉包前,會(huì)創(chuàng)建一個(gè)rb_block_t的結(jié)構(gòu),這個(gè)結(jié)構(gòu)中有兩個(gè)指針,一個(gè)iseq指向閉包的代碼片段(字節(jié)碼),另一個(gè)EP指向YARV internal stack的運(yùn)行環(huán)境。
Example
str = "The quick brown fox"
10.times do
str2 = "jumps over the lazy dog"
puts "#{str} #{str2}"
end
這個(gè)代碼就會(huì)在internal stack上創(chuàng)建三個(gè)rb_control_frame_t ,最底下的是整個(gè)代碼已進(jìn)入壓進(jìn)去的(你可以想象這個(gè)代碼是在一個(gè)函數(shù)中實(shí)現(xiàn)并被調(diào)用的),第二個(gè)是10.times運(yùn)行的時(shí)候Fixnum#times為了調(diào)用內(nèi)部的C code壓的,第三個(gè)是運(yùn)行閉包時(shí)壓的。但是第三個(gè)運(yùn)行閉包的時(shí)候壓的不是rb_control_frame_t而是rb_block_t,這兩個(gè)結(jié)構(gòu)十分像,你可以當(dāng)作是差不多的東西,在創(chuàng)建第三個(gè)stack frame的時(shí)候,他的環(huán)境EP跟第二個(gè)是一樣的(實(shí)際上應(yīng)該就是使用第二個(gè)stack frame所在的內(nèi)存,因?yàn)檫@兩個(gè)結(jié)構(gòu)很像,只需要加上一個(gè)offset就能得到rb_block_t所需要的struct element了)