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

  1. 创建函数的源代码,
  2. 调用gcc将其编译为.所以(Linux)(或者使用llvm等),
  3. 加载文件.那么
  4. 调用函数.

铁 rust 中也可能有类似的情况吗?

我特别想使用代数数据类型,所以使用Rust特征的C子集是不够的.

推荐答案

官方上还没有,不过至少在没有太多黑客攻击的情况下应该是可能的.最大的障碍是这些库还没有任何动态加载的能力.

  • 链接到rustc crate ,以编程方式驱动编译器.请注意,编译器不是线程安全的,因此一次只运行一个进程内构建.
  • 将要调用的函数标记为#[no_mangle].这应该(我没有试过)产生一个不混合的符号名,这样就很容易找到.
  • 创建到dlopen/dlsym的最小绑定
  • 找到函数指针,并将其安全地转换为Rust闭包类型(目前在sys::Closure中定义).
  • 结束吧.

Rust也有一个经过最低限度测试的JIT,可以用于这类事情,但它有一些主要缺陷.

Rust相关问答推荐

收集RangeInclusive T到Vec T<><>

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

从特征实现调用函数的Rust惯用方法

为什么我不能从带有字符串的 struct 的引用迭代器中收集VEC<;&;str&>?

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

如何在Rust中将选项<;选项<;字符串>;转换为选项<;选项&;str>;?

如何正确重新排列代码以绕过铁 rust 借入判断器?

在运行特定测试时,如何 suppress cargo test 的空输出?

如何将 struct 数组放置在另一个 struct 的末尾而不进行内存分段

Rust:为什么 &str 不使用 Into

根据掩码将 simd 通道设置为 0 的惯用方法?

Rust 并行获取对 ndarray 的每个元素的可变引用

有没有办法隐式绑定 let/match 操作的成员?

push 方法是否取得所有权?

使用自定义 struct 收集 Vec

如何获得对数组子集的工作可变引用?

当我在 struct 中存储异步函数时,为什么它需要生命周期

在 Traits 函数中设置生命周期的问题

有没有办法在 Rust 中对 BigInt 进行正确的位移?