C语言中的Ruby块/ Java闭包

时间:2020-03-05 18:41:29  来源:igfitidea点击:

我一直在试图了解Ruby块是如何工作的,为此,我一直试图在C语言中实现它们。

实现闭包的一种简单方法是将" void *"传递给封闭栈到闭包/函数,但是Ruby块似乎也可以处理使用该块的作用域的return和break语句。

loop do
  break i if (i >= 4000)
  i *= 2
end

我认为Java的闭包建议之一也是如此。

那么,我们将如何在C中实现Ruby-blocks / Java-closures?

解决方案

回答

闭包的概念需要上下文的概念。 C的上下文基于堆栈和CPU的寄存器,因此要创建块/关闭,我们需要能够以正确的(和可重入的)方式操作堆栈指针,并根据需要存储/恢复寄存器。

解释器或者虚拟机完成此操作的方法是具有"上下文"结构或者类似结构,而不直接使用堆栈和寄存器。如果我们要设计基于寄存器的VM,则此结构可跟踪堆栈以及可选的某些寄存器。至少,这是最简单的方法(尽管与正确地映射事物相比性能稍差)。

回答

作为"激情铁路"课程的一部分,有很多关于Ruby Blocks的幻灯片:

Ruby_Blocks.pdf

这涵盖了代表一个块,它们如何传递参数和如何执行,以及甚至深入到Proc对象之类的内容。非常清楚地解释了。

然后看一下JRuby家伙在解析为Java时如何处理这些问题可能会很有趣。看看codehaus的源代码。

回答

我实际上还没有实现任何一个,所以请带上一小袋盐。

闭包有两个部分:数据环境和代码环境。如我们所说,我们可以传递void *来处理对数据的引用。我们可能可以使用setjmp和longjmp来实现Ruby中断所需的非线性控制流跳转。

如果需要闭包,则可能应该使用实际支持闭包的语言进行编程。 :-)

更新:有趣的事情正在Clang中发生。他们为C闭包创建了原型。http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html可能很有趣。