探索用于更新语言的无缝 Rust 互操作性,第 1 部分

2024 年 5 月 24 日的文章“为科学犯下语言互操作性罪过”主要探讨了不同语言之间的互操作性问题,以实现新语言无缝调用 Rust 代码等目标,具体内容如下:

  • 语言互操作性现状:像 C++、Typescript、Kotlin 和 Swift 旨在利用现有语言的库生态系统,但对注重内存安全和速度的新语言来说并非易事。新语言可通过添加 FFI“绑定”来调用 C 代码,如 Vale 代码中的extern func stdlib_launch_command(args []str, maybe_cwd str) i64;,但这种方式存在一些缺点,如概念转换困难、随 C 库演化而过时、难以找到良好的跨平台 C 库等。
  • 一些希望与挑战:有可能实现新语言无缝调用 Rust 代码,无需编写绑定或包装器,如利用 Rust 的超过 100,000 个 crate。但存在诸多挑战,如 Rust 没有稳定的 ABI、有泛型、与非传统借用检查器的语言模型融合困难、如何保持 Vale 的其他特性等,不过作者认为这些都是可解决的。
  • 具体示例与方法:以 C 语言无缝调用 Rust 的subprocess crate 为例,通过#pragma rsuse设置名称,#include "rust_deps/rust_deps.h"引入生成的文件,在 C 中调用生成的包装函数来操作 Rust 类型,如VecOsString_new等。这一方法主要针对新语言,通过将类型转换为不透明类型并传递来实现跨 FFI 边界调用。
  • 工具与实现细节:生成的代码通过解析#pragma rsuse行确定类型,测量类型大小和对齐,生成结构体和函数,调用 cbindgen 生成 C 头文件和静态库。工具运行较慢,需优化,还需探索链接时优化、处理异步函数和宏等问题。
  • 影响、好处与缺点:此方法让新的快速、内存安全语言能访问高质量库,脚本语言可调用 Rust 做重活,甚至加速 C++到 Rust 的迁移,但工具运行慢,二进制大小增加可控。
  • 后续计划:后续文章将详细介绍工具如何解析和解析给定的 Rust 名称、如何将其集成到 Vale 编译器以及如何在保持 Vale 其他特性的同时实现这一目标。同时感谢众多赞助者对 Vale 的支持。
阅读 13
0 条评论