有没有可能编译一个Rust库 crate ,这样用户就看不到源代码,但仍然可以使用库?
如果是,所有的泛型都被提供为"源代码"还是一些IR,或者 rust 从C++模板中实现泛型不同?
有没有可能编译一个Rust库 crate ,这样用户就看不到源代码,但仍然可以使用库?
如果是,所有的泛型都被提供为"源代码"还是一些IR,或者 rust 从C++模板中实现泛型不同?
每个图书馆 crate 都包含大量元数据,无论是静态链接(.rlib
)还是动态链接(.so
/.dylib
/.dll
):
macro_rules
个宏#[inline]
或泛型的每个函数的整个主体(默认特征方法被视为泛型超过Self
)所有这些都足以复制一些原始源代码(多少取决于泛型的使用),尽管没有注释或其他空白
虽然元数据是二进制的,而不是JSON,但使用librustc
从已编译的 crate 中提取所有导出的函数定义,并且相当容易地打印ASTs.
在future ,可能不会进行任何类型判断,因此元数据将对各种IR进行编码——一种可能是CFG,即"控制流图",它已经在一些地方内部使用.
然而,这仍然会expose 出比Java字节码更多的信息,这将是一种优化,你仍然可以近似原始代码(并且很容易得到编译的东西).
因此,我只能推荐两种 Select :
template
和virtual
应该有相似的限制,而在一个具体的情况下可能有可用的解决方案).