我一直试图理解Ruby阻塞是如何工作的,为此我一直在尝试用C语言实现它们.
实现闭包的一种简单方法是void*
将封闭堆栈传递给闭包/函数,但Ruby块似乎也处理来自使用块的作用域的返回和中断语句.
loop do break i if (i >= 4000) i *= 2 end
我认为Java的一个闭包提案也是这样的.
那么,你将如何在C中实现Ruby-blocks/Java-closures?
闭包的概念需要上下文的概念.C的上下文基于堆栈和CPU的寄存器,因此要创建块/闭包,您需要能够以正确(和可重入)的方式操作堆栈指针,并根据需要存储/恢复寄存器.
解释器或虚拟机完成此操作的方法是使用context
结构或类似的东西,而不是直接使用堆栈和寄存器.如果您正在设计基于寄存器的VM,则此结构会跟踪堆栈和可选的一些寄存器.至少,这是最简单的方法(尽管性能略低于实际正确映射事物).