如何用AOT编译的语言实现匿名函数

How are anonymous functions implemented in AOT-compiled languages?

本文关键字:实现 函数 语言 何用 AOT 编译      更新时间:2023-10-16

我的理解是,在诸如C#/java之类的托管语言中,匿名函数是由编译器在运行时生成的,然后将JIT编译到程序中。

在Rust和C 等非托管语言中呢?这些语言如何在运行时创建函数?实施Lambda表达式的较低级别的细节是什么?

int y = 3;
auto f = [y](int x) { return x*y; };

这是C 11 lambda。合并器(基本上(将其转换为:

struct __anonymous_name__ {
  int operator()(int x) const { return x*y; }
  int y;
};
__anonymous_name__ f = {y};

实际上并未命名使用__的所有内容,只有出于展示目的的名称。

在运行时,一切都有固定的类型,没有生成代码。

std::function<int(int)>可以存储上面的f的副本,但是使用类型的擦除机制,该机制超出了该问题的范围。但是请注意,f不是与std::function<int(int)>相关的类型对象。C 具有多种多态性。


我也严重怀疑java/c#lambdas比您的其余代码更加jit。