gpt4 book ai didi

rust - 库能否以二进制形式分发,这样最终用户就看不到源代码?

转载 作者:行者123 更新时间:2023-11-29 07:40:37 29 4
gpt4 key购买 nike

是否可以编译一个 Rust 库 crate,以便用户看不到源代码但仍然可以使用该库?

如果是,是否所有泛型都作为“源代码”或某些 IR 提供,或者 Rust 是否以不同于 C++ 模板的方式实现泛型?

最佳答案

每个库 crate 都包含大量元数据,无论是静态链接 (.rlib) 还是动态链接 (.so/.dylib/.dll):

  • 模块结构
  • 导出macro_rules
  • 类型和特征定义
  • 常量及其初始化表达式
  • 所有功能的签名
  • 标记为#[inline] 或泛型的每个函数的整个主体(默认特征方法被认为是Self 的泛型)

所有这些足以复制一些原始来源(多少取决于泛型的使用),尽管没有注释或其他空白。
函数体在编译器的内部 AST 结构中序列化 - 您可以使用 rustc -Z ast-json lib.rs 看到它的漂亮形式。

虽然元数据是二进制的,而不是 JSON,但使用 librustc 从已编译的 crate 中提取所有导出的函数定义,并漂亮地打印 AST 相当容易。

在未来,可能没有任何 AST 过去的类型检查,因此元数据将编码某种 IR——一种可能性是 CFG,即“控制流图”,它已经在内部的几个地方使用。

但是,这仍然会暴露比 Java 字节码更多的信息,这将是一种优化,您仍然可以近似原始代码(并轻松获得可以编译的东西)。

因此,我只能推荐两个选项:

  1. 公开一个 C API;它具有作为稳定的 ABI 的优势,但它的局限性和脆弱性很大;
  2. 仅使用 trait 对象而不是泛型来公开 Rust API;这样你就可以保持内存安全并且所有单态函数仍然可以正常工作,但是特征对象(动态调度)不能表达泛型可能的所有模式:特别是,泛型特征方法不能在特征对象上调用(C++ 应该有一个混合使用 templatevirtual 的类似限制,可能根据具体情况提供解决方法)。

关于rust - 库能否以二进制形式分发,这样最终用户就看不到源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27999559/

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