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