【问题标题】:How to programmatically compile Rust programs?如何以编程方式编译 Rust 程序?
【发布时间】:2015-11-18 05:33:45
【问题描述】:

鉴于我试图以表达式树的形式创建的库的元数据,我希望能够将其转换为某种特定于 Rust 的语法树,可以提供给 Rust 编译器。

我找到了related question,但它已经过时了。

【问题讨论】:

    标签: rust


    【解决方案1】:

    是的,有。 Rust 编译器本身。整个编译器是一个库,rustc 只是一个调用编译器的小 crate。例如,stupid-stats 板条箱。它运行 rust 编译器以生成有关代码的一些统计信息。

    您只需要导入rustcrustc_driver crates(带有extern crate)并为一个类型实现rustc_driver::CompilerCalls trait(我们称之为MyDriver)。然后你可以像这样运行 rustc:

    let args: Vec<_> = std::env::args().collect();
    let mut my_driver = MyDriver::new();
    rustc_driver::run_compiler(&args, &mut my_driver);
    

    您需要确保传递标准库和核心库的路径。就我而言,我添加了

    "-L $HOME/.multirust/toolchains/nightly/lib/rustlib/x86_64-unknown-linux-gnu/lib"
    

    到命令行。您不能简单地将其添加到 args 向量中,因为此处未解析 $HOME。因此,您需要更多代码来提取 $HOME 环境变量并构建您的命令。

    【讨论】:

    • 谢谢。如何将表达式树映射到 rust 编译器可以理解的语法树,或者编译器只能处理某些文本表示形式的 rust 源代码?
    • 呼,这需要一个比我展示的更低级别的界面。这当然是可能的,但您需要自己创建 AST(HIR)。我建议你看一下librustc*,看看 rustc 二进制文件是如何创建的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多