2016-07-07 4 views
4

私はLLVMコンパイラとインフラストラクチャが初めてです。私は以下の考えを持っています。 Clangは、Rustc for Rustプログラミング言語と同様に、C/C++のLLVMフロントエンドです。両方ともLLVM IRコードを発行でき、発行されたコードは実行可能アプリケーションにコンパイルできます。異なる言語のベースコンパイラとしてのLLVM

私の質問は、別のプログラミング言語をリンクすることですか? IRは、ソースファイルの両方から生成されると、

/* 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番目の呼び出しと一致すると、動作する可能性があります。 –

+1

どちらの言語もアプリケーションバイナリインターフェイスと互換性があります。 –

答えて

2

まず、RustとCは、RustのFFI(Foreign Function Interface)を通じて話すことができます。非常に基本的な機能のためには、両方の言語をLLVMにコンパイルしてある種の機能を持たせることができると思っていますが、私たちはこんにちは世界の長さのプログラムを話しています。一般的には、提案していることを実装するには、ある種のABIが必要です。ただし、ABIの場合でも、フロントエンドレベルで実装が行われます。

簡潔に言えば、LLVMはすべての言語固有の構成を表すことはできません。したがって、2つのプログラムのLLVM IRをリンクするだけでは機能しません。フロントエンドでは、2つの言語間の互換性を確保するための作業が必要です。

5

短い回答:はい


長い答え:はい、いくつかの要件が満たされている限りです。

互換性には、API(アプリケーションプログラムインターフェイス)とABI(アプリケーションバイナリインターフェイス)の2種類があります。基本的に、APIはプログラムがコンパイルされるかどうかを指定しますが、ABIはリンク、ロード、実行のいずれかを指示します。

RustにはC FFIがあるので、RustはCと正常にやり取りできるコードを発行することができます(考慮するプラットフォームには適切なC ABIがあります)。これは、RustバイナリがCライブラリを呼び出すことができるという点で明らかです。

そのRustバイナリのLLVM IRを取得し、そのCライブラリのLLVM IRを両方ともマージし、LLVMを使用して新しいバイナリを生成すると、1つのバイナリ(依存性なし)が得られます。

したがって、「唯一の」要件は、2つのコードが最初に独立してリンク/ロード/実行できる必要があることです。 LLVMから独立した単一のバイナリを取得する


別の方法は、を連結静的です。 Rustでは、例えばC標準ライブラリのmusl実装との静的リンクが可能です。 LLVM IRでのマージの主な利点は、統合されたIRでLLVM最適化パスを実行できるため、言語間のインライン展開(およびその他の最適化)の恩恵を受けることができることです。

+0

私はABIがinteropを持つために必要であるので、長い答えは時には必ずしも必要ではないと思います。 ABIは確かにいくつかの作業を実装する必要があるため、2つの異なる言語のIR出力を単にリンクすることはできません。 それ以外は、あなたは質問にかなり良い答えを与えたと思います。 –

+0

@BennetLeff:これはまさに長い答えです。つまり、別々のライブラリで両方のコードをロード/実行できる場合は、IRをマージして実行することができます(ABIを検証してから)。それともあまりにも明確ではないので、私は何かを編集すべきことを意味しますか? –

+0

私はあなたの答えがそのまま残ると思います。しかし、私にとっては、「長い答え:はい」の代わりに「長い答え:時々...」と答えた方がより明確になります。 –

関連する問題