2016-07-07 3 views
4

저는 LLVM 컴파일러 및 인프라를 처음 사용합니다. 나는 다음과 같은 생각을 가지고있다. Clang은 Rustc for Rust 프로그래밍 언어와 마찬가지로 C/C++의 LLVM 프런트 엔드입니다. 두 가지 모두 LLVM IR 코드를 방출 할 수 있으며 방출 된 코드는 실행 가능한 응용 프로그램으로 컴파일 할 수 있습니다.다른 언어의 기본 컴파일러로 사용되는 LLVM

제 질문은 다른 프로그래밍 언어를 연결할 수 있습니까? 적외선 소스 파일에서 모두 생성되면,

/* Code in C */ 
int add(int, int); 
int main() 
{ 
    printf("%d", add(5 ,6)); 
} 

// Code in Rust 
fn main() 
{ 
    println!("{}", add(5, 6)); 
} 

fn add (x: i32, y: i32) -> i32 
{ 
    x + y 
} 

대한 녹에서 정의 된 함수는 이들을 연결하고 하나의 애플리케이션을 생성 할 수있다 - 예를 나타?

이 작품에 대해 궁금한 점이 있으면 알려 주시기 바랍니다.

+0

녹 녹이거나 어딘가에서 전화를 걸면 문제가 달라집니다. –

+0

먼저 각 소스 코드를 별도로 clang에 제공해야합니다.그런 다음 llvm-link 명령은 여러 비트 코드 파일을 병합 할 수 있습니다. 한 소스 코드의 호출이 두 번째 소스 코드와 일치하면 작동 할 수 있습니다. –

+1

두 언어 모두 응용 프로그램 바이너리 인터페이스 호환 가능해야합니다. –

답변

2

첫째, Rust와 C는 Rust의 FFI (Foreign Function Interface)를 통해 말할 수 있습니다. 아주 기본적인 기능을 위해, 두 언어를 모두 LLVM으로 컴파일 할 수 있고 일종의 기능을 가질 수 있다고 상상하지만, 우리는 안녕 길이의 프로그램 (어쩌면 그 수준이 아닐지라도)을 말하고 있습니다. 일반적으로 제안하려는 것을 구현하려면 일종의 ABI이 있어야합니다. 그러나 ABI를 사용하더라도 구현은 프런트 엔드 수준에서 수행됩니다.

간결하게 말하면, LLVM은 모든 언어 관련 구문을 나타낼 수 없습니다. 따라서 두 프로그램의 LLVM IR을 연결하여 작동시킬 수는 없습니다. 두 언어 간의 호환성을 보장하려면 프런트 엔드에서 수행해야하는 작업이 있어야합니다.

5

짧은 대답 : .


긴 답변 : 예, 몇 가지 요구 사항이 충족되는 한.

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 최적화 단계를 실행할 수 있으므로 언어 ​​간 인라이닝 (및 기타 최적화)의 이점을 누릴 수 있다는 것입니다.

+0

ABI가 interop을 갖기 위해서는 긴 대답이 때때로 필요하다고 생각합니다. ABI는 확실히 두 가지 언어의 IR 출력을 연결할 수 없도록 몇 가지 작업을 구현해야합니다. 그 외에도 당신은 질문에 대한 꽤 좋은 대답을 주었다고 생각합니다. –

+0

@BennetLeff : 긴 대답은 실제로 말합니다. 두 코드가 별도의 라이브러리에로드/실행될 수 있다면 IR을 병합하고 실행할 수 있습니다 (ABI의 유효성을 검증 한 이후). 또는 너무 명확하지 않기 때문에 뭔가를 편집해야한다는 의미입니까? –

+0

귀하의 답변은 그대로 유지 될 수 있습니다. 그러나, 나에게 "긴 대답 : 예 ..."대신에 "긴 대답 : 가끔은 ..."이라고 대답하는 것이 더 명확 할 것입니다. –

관련 문제