2016-07-07 5 views
4

Ich bin neu in LLVM Compiler und Infrastruktur. Ich habe folgenden Gedanken. Clang ist das LLVM-Frontend für C/C++, ähnlich Rustc für Rust Programmiersprache. Beide können den LLVM-IR-Code ausgeben, und der ausgegebene Code kann in eine ausführbare Anwendung kompiliert werden.LLVM als Basis-Compiler für verschiedene Sprachen

Meine Frage ist, ist es möglich, verschiedene Programmiersprachen zu verknüpfen? Beispiel unten -

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

Die Funktion in Rust definiert zum Beispiel

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

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

Sobald die IR von erzeugt wird sowohl die Quelldateien, ist es möglich, sie zu verbinden und eine einzige Anwendung erstellen?

Ich bin nur neugierig zu wissen, ob das funktioniert, lass es mich wissen.

+0

Ich denke, Sie müssen irgendwo eine Rost-Laufzeit haben ... aber das Problem ist anders, wenn c von Rost oder der Converse anrufen. –

+0

Jeder Quellcode muss zuerst getrennt ausgegeben werden.Anschließend kann der Befehl llvm-link mehrere Bitcode-Dateien zusammenführen. Wenn der Aufruf von einem Quellcode mit dem zweiten übereinstimmt, könnte es funktionieren. –

+1

Beide Sprachen müssen Application Binary Interface-kompatibel sein. –

Antwort

2

Erstens können Rust und C aber über Rust's FFI (Foreign Function Interface) sprechen. Für sehr grundlegende Funktionen stelle ich mir vor, dass es möglich wäre, beide Sprachen zu LLVM zu kompilieren und irgendeine Art von Funktionalität zu haben, aber wir sprechen Hallo Weltlängenprogramme (vielleicht sogar nicht auf dieser Ebene). Im Allgemeinen muss es eine Art von ABI zu implementieren, was Sie vorschlagen. Aber auch bei einem ABI erfolgt die Implementierung auf Front-End-Ebene.

Zusammengefasst kann LLVM nicht alle sprachspezifischen Konstrukte darstellen. Sie können also nicht einfach die LLVM-IR von zwei Programmen verknüpfen und hoffen, dass es funktioniert. Es muss etwas Arbeit am Frontend geleistet werden, um die Kompatibilität zwischen zwei Sprachen zu gewährleisten.

5

Kurze Antwort: Ja.


Lange Antwort: Ja, solange einige Anforderungen erfüllt sind.

Es gibt zwei Arten von Kompatibilität: API (Application Program Interface) und ABI (Application Binary Interface). Im Wesentlichen diktiert die API, ob Ihr Programm kompiliert, während die ABI vorschreibt, ob sie verknüpft, geladen und ausgeführt wird.

Da Rust ein C FFI hat, kann Rust Code aussenden, der normalerweise mit C interagieren kann (es hat den richtigen C ABI für die betrachtete Plattform). Dies zeigt sich darin, dass eine Rust-Binärdatei eine C-Bibliothek aufrufen kann. Wenn Sie die LLVM IR dieser Rust-Binärdatei, die LLVM IR dieser C-Bibliothek, zusammenführen und LLVM verwenden, um eine neue Binärdatei zu erstellen, erhalten Sie eine einzelne Binärdatei (keine Abhängigkeit).

Die "einzige" Anforderung besteht also darin, dass Ihre zwei Codeabschnitte in der Lage sein müssen, zuerst selbständig zu verknüpfen/zu laden/zu laufen.


andere Möglichkeit, ein einzelnes binäres zu erhalten, die sich von LLVM unabhängig ist, ist statische Verknüpfung; In Rust können Sie beispielsweise eine statische Verbindung mit der Implementierung der C-Standardbibliothek herstellen. Der Hauptvorteil der Zusammenführung bei LLVM IR besteht darin, dass Sie dann LLVM-Optimierungsdurchläufe für das zusammengeführte IR ausführen können und daher von der sprachübergreifenden Inlining-Funktion (und anderen Optimierungen) profitieren.

+0

Ich denke, die lange Antwort sollte manchmal sein, nicht unbedingt ja, weil ein ABI erforderlich ist, um Interop zu haben. Ein ABI erfordert sicherlich einige Arbeit zu implementieren, so dass Sie nicht einfach zwei IR-Ausgänge der verschiedenen Sprache verknüpfen können. Abgesehen davon, ich denke, Sie haben eine ziemlich gute Antwort auf die Frage gegeben. –

+0

@BennetLeff: Das ist genau das, was die lange Antwort eigentlich sagt: Wenn beide Teile von Code in separaten Bibliotheken geladen/ausgeführt werden können, dann können Sie ihre IRs zusammenführen und ausführen lassen (da Sie die ABI validiert haben). Oder meinst du, ich sollte etwas bearbeiten, weil es nicht zu klar ist? –

+0

Ich denke, deine Antwort kann so bleiben wie sie ist. Allerdings wäre es für mich klarer, wenn statt "Lange Antwort: ja ..." es "Lange Antwort: manchmal ..." –

Verwandte Themen