我是LLVM编译器和基础架构的新手。我有以下想法。Clang是C/C++的LLVM前端,类似于Rustc的Rust编程语言。两者都可以发出LLVM IR代码,并且发出的代码可以编译成可执行应用程序。
我的问题是,有没有可能将不同的编程语言联系起来?示例如下所示:
/* Code in C */
int add(int, int);
int main()
{
printf("%d", add(5 ,6));
}Rust中定义的函数,例如
// Code in Rust
fn main()
{
println!("{}", add(5, 6));
}
fn add (x: i32, y: i32) -> i32
{
x + y
}从两个源文件生成IR后,是否可以链接它们并创建单个应用程序?
我只是好奇地想知道这是否有效,请让我知道。
发布于 2016-07-07 23:12:33
简短的回答:是的,。
长长的回答:是的,只要满足了一些要求。
有两种兼容性: API (应用程序接口)和ABI (应用二进制接口)。从本质上讲,API决定程序是否编译,而ABI决定程序是否链接、加载和运行。
由于Rust有一个C FFI,Rust可以发出通常可以与C交互的代码(对于所考虑的平台,它具有适当的C ABI )。这一点很明显,Rust二进制文件可以调用C库。
如果您将Rust二进制文件的LLVM IR和C库的LLVM IR合并在一起,并使用LLVM生成新的二进制文件,那么您将获得单个二进制文件(无依赖项)。
因此,“唯一”的要求是你的两段代码首先必须能够独立链接/加载/运行。
获得独立于LLVM的单个二进制文件的另一种方法是静态链接;在Rust中,您可以例如与C标准库的musl实现进行静态链接。在LLVM IR中合并的主要优点是,您可以在合并后的IR上运行LLVM优化传递,因此可以从跨语言内联(和其他优化)中受益。
发布于 2016-07-07 22:49:23
首先,Rust和C只能通过Rust的FFI (外部函数接口)进行通信。对于非常基本的功能,我想有可能将这两种语言编译成LLVM并具有某种功能,但我们谈论的是hello world length程序(可能甚至不是在那个级别)。一般来说,必须有某种类型的ABI来实现您建议的内容。然而,即使使用ABI,实现也是在前端级别完成的。
简而言之,LLVM不能表示所有特定于语言的构造。所以你不能仅仅连接两个程序的LLVM IR并希望它能工作。必须在前端做一些工作,以确保两种语言之间的兼容性。
https://stackoverflow.com/questions/38248234
复制相似问题