Rustc Driver 和 Rustc Interface

rustc_driver 本质上是 rustcmain() 函数。它使用 rustc_interface crate 中定义的接口,按正确顺序执行编译器各个阶段。

rustc_interface crate 为外部用户提供了一个(不稳定的)API,用于在编译过程中的特定时间运行代码,从而允许第三方有效地使用 rustc 的内部代码作为库来分析 crate 或在进程中模拟编译器(例如 RLS 或 rustdoc )。

对于那些将 rustc 作为库使用的用户,rustc_interface::run_compiler() 函数是编译器的主要入口点。它接受一个编译器配置参数,以及一个接受 Compiler 参数的闭包。run_compiler 从配置中创建一个 Compiler 并将其传递给闭包。在闭包内部,您可以使用 Compiler 来驱动查询以编译 crate 并获取结果。这也是 rustc_driver 所做的。您可以在这里看到有关如何使用 rustc_interface 的最小示例。

您可以通过 rustdocs 查看 Compiler 当前可用的查询。您可以通过查看 rustc_driver 的实现,特别是 rustc_driver::run_compiler 函数(不要与 rustc_interface::run_compiler 混淆)来查看如何使用它们的示例。rustc_driver::run_compiler 函数接受一堆命令行参数和一些其他配置,并推动编译完成。

rustc_driver::run_compiler 还接受一个 Callbacks,它是一个允许自定义编译器配置以及允许一些自定义代码在编译的不同阶段之后运行的 trait 。

警告: 本质来说,编译器内部 API 总是不稳定的,但是我们会尽力避免不必要的破坏。