库可以作为二进制文件分发,因此最终用户无法看到源代码吗?

J V*_*J V 29 rust

是否可以编译Rust库包以便用户无法查看源代码但仍可以使用该库?

如果是,所有泛型都提供为"源代码"或某些IR,还是Rust实现泛型不同于C++模板?

edd*_*dyb 38

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

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

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

虽然元数据是二进制的,而不是JSON,librustc用于从已编译的包中提取所有导出的函数定义,并且相当容易地打印AST.

在将来,可能没有任何AST过去的类型检查,因此元数据将编码各种类型的IR - 一种可能性是CFG,即"控制流图",其已经在几个地方内部使用.

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

因此,我只能推荐两种选择:

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