是否可以在运行时生成并执行Rust代码?

在运行时使用C,我可以:

  1. 创建函数的源代码,
  2. 调用gcc将其编译为.so(Linux)(或使用llvm等),
  3. 加载.so,和
  4. 调用该function。

在Rust中类似的东西可能吗?

特别是我想使用代数数据类型,因此使用Rust的Cfunction子集是不够的。

还没有,正式,虽然它应该至少可能没有太多的黑客攻击。 最大的障碍是图书馆还没有动态加载的能力。 这是一个使它工作的潜在策略(在Rust的传入分支上)。

  • 链接到rustc crate以编程方式驱动编译器。 请注意,编译器不是线程安全的,因此一次只能运行一个进程内构建。
  • 使用#[no_mangle]标记要调用的function。 这应该(我没有尝试过)产生一个未编码的符号名称,因此很容易找到。
  • 创建与dlopen / dlsym的最小绑定
  • 找到函数指针并将其安全地转换为Rust闭包类型(当前在sys::Closure定义)。
  • 打电话给关闭。

Rust还有一个经过最低限度测试的JIT,可用于此类事情,但它有一些重大错误。