gpt4 book ai didi

c - 在 C 中模拟 lambdas?

转载 作者:太空狗 更新时间:2023-10-29 14:56:05 25 4
gpt4 key购买 nike

我应该提一下,我是用 C 语言生成代码,而不是手动执行此操作。我这样说是因为如果它背后有很多代码并没有太大关系,因为编译器应该管理所有这些。无论如何,我将如何在 C 中模拟 lambda?我在想我可以在源代码的某处生成一个具有随机名称的函数然后调用它吗?我不太确定。我还没有真正尝试过任何东西,因为我想在实现之前先把想法记下来。

有没有我可以做的某种预处理器指令,或者有什么宏可以让这件事变得更干净?我受到 Jon Blow 的启发尝试编译器开发,他似乎用他的语言 Jai 实现了 Lambdas。但是,我认为他在生成字节码的地方做了一些事情,然后进入 C?我不确定。

编辑:我正在研究编译器,编译器只是我的一个项目,让我很忙,而且我想了解更多关于编译器的知识。我主要使用 clang,我在 Ubuntu 14.10 上。我没有任何垃圾收集,但我想尝试使用某种受智能指针-y/rust/ARC 启发的内存模型来进行垃圾收集,即几乎没有开销。我选择了C,因为我想更多地涉猎它。我的项目是免费软件,只是一个业余爱好项目。

最佳答案

有几种方法可以做到这一点(在 C 中“具有”lambda)。重要的是要理解 lambda 给出 closures并且闭包将“代码”与“数据”(闭包值)混合在一起;请注意,对象也将“代码”与“数据”混合在一起,并且对象和闭包之间存在相似之处。另见 this answerProgrammers .

传统上,在 C 中,您不仅使用函数指针,而且还采用关于 callbacks约定 .例如 GTK 就是这种情况。 : 每次你传递一个函数指针时,你也传递了一些数据。您可以将回调(为 C 函数指针提供一些 void* 数据的约定)视为实现闭包的一种方式。

既然你生成了 C 代码(这是一个明智的想法,我在 MELT 中做了类似的事情,它在 Linux 上在运行时生成 C++ 代码,将其编译成一个共享对象,然后 dlopen-s that) 你可以采用回调约定并将一些封闭值传递给你生成的每个函数。

您也可以将封闭值视为 static 变量,但这种方法通常是不明智的。

过去有一些 lambda.h 头库生成机器特定的 trampoline闭包代码(本质上是生成一个代码,将一些关闭的值作为参数推送,然后调用一些例程)。您可能会使用一些 JIT compilation技术(使用 libjit ,GNU lightningLLVMasmjit ,....)做同样的事情。另见 libffi调用任意函数(签名仅在运行时已知)。

请注意闭包和 garbage collection 之间存在很强但间接的关系(更多信息请阅读 GC handbook),每个 functional language 并非偶然有一个GC。 C++11 lambda 函数是一个异常(exception)(并且很难理解 C++11 闭包的内存管理的所有复杂性)。因此,如果您正在生成 C 代码,您可以而且可能应该使用 Boehm's conservative garbage collector (这是包装 dlopen),你将拥有闭包 GC-ed 值。 (您可以使用其他一些 GC 库,例如 Ravenbrook's MPS 或我未维护的 Qish ...)然后您可以约定每个生成的 C 函数都将其闭包作为第一个参数。

我建议阅读 Scott's book on Programming Language Pragmatics和(假设你知道一点 Scheme 或 Lisp;如果你不知道,你应该学习一点 Scheme 并阅读 SICP ) Queinnec's book Lisp In Small Pieces (如果您碰巧阅读法语,请阅读最新的法语 variant )。

关于c - 在 C 中模拟 lambdas?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29427798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com