Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 库可以作为二进制文件分发,这样最终用户就看不到源代码了吗?_Rust - Fatal编程技术网

Rust 库可以作为二进制文件分发,这样最终用户就看不到源代码了吗?

Rust 库可以作为二进制文件分发,这样最终用户就看不到源代码了吗?,rust,Rust,是否可以编译一个Rust库板条箱,这样用户就看不到源代码,但仍然可以使用库 如果是,所有的泛型都是“源代码”还是“IR”,或者C++不同于C++模板实现泛型? 每个库箱都包含大量元数据,静态链接( .rLIB < /code >)或动态链接( ./code >/ .DyLIB < /code >/code > .dll < /code >): 模块结构 导出的宏\u规则宏 类型和特征定义 常量及其初始值设定项表达式 所有函数的签名 标记为#[inline]或泛型的每个函数的整个主体(默认特征方

是否可以编译一个Rust库板条箱,这样用户就看不到源代码,但仍然可以使用库


如果是,所有的泛型都是“源代码”还是“IR”,或者C++不同于C++模板实现泛型?

每个库箱都包含大量元数据,静态链接(<代码> .rLIB < /code >)或动态链接(<代码> ./code >/<代码> .DyLIB < /code >/code > .dll < /code >):

  • 模块结构
  • 导出的
    宏\u规则
  • 类型和特征定义
  • 常量及其初始值设定项表达式
  • 所有函数的签名
  • 标记为
    #[inline]
    或泛型的每个函数的整个主体(默认特征方法被视为泛型而非
    Self
所有这些都足以复制一些原始源代码(多少取决于泛型的使用),尽管没有注释或其他空白。
函数体是在编译器的内部AST结构中序列化的-您可以通过
rustc-zASTJSON lib.rs
看到它的一个漂亮形式

虽然元数据是二进制的,而不是JSON,但是使用
librustc
从编译的板条箱中提取所有导出的函数定义,并且相当容易地打印ASTs

在未来,可能不会有任何AST过去的类型检查,因此元数据将对各种IR进行编码——一种可能是CFG,即“控制流图”,它已经在一些地方内部使用

然而,这仍然会暴露出比Java字节码更多的信息,这将是一种优化,您仍然可以近似原始代码(并且很容易得到编译的东西)

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

  • 公开一个C API;它具有稳定ABI的优点,但它非常有限且易碎
  • 仅使用trait对象而不是泛型公开rustapi;这样可以保持内存安全,所有单态函数仍能正常工作,但trait对象(动态调度)无法表达泛型可能的所有模式:特别是,泛型trait方法不能在trait对象上调用(对于混合
    模板
    虚拟
    ,C++应该有类似的限制,并且可能会根据具体情况提供解决办法)

  • 二进制分发通常用于简化部署到不能(或不想)的地方从源代码本身构建。您是否对此感兴趣,或者主要是对库用户隐藏源代码感兴趣?出于好奇,您提出这个问题的动机是什么?在C/C++中,头文件是手动编写的,因此您可以更好地控制签名、宏、模板等的导出方式。Rust会自动完成,我无法完成我什么也找不到。