28

C を使用すると、実行時に次のことができます。

  1. 関数のソースコードを作成し、
  2. gcc を呼び出して .so (Linux) にコンパイルします (または llvm などを使用します)。
  3. .so をロードし、
  4. 関数を呼び出します。

Rustでも同様のことが可能ですか?

特に、代数データ型を使用したいので、Rust の機能の C サブセットを使用するだけでは不十分です。

4

2 に答える 2

22

公式にはまだですが、あまりハッキングしなくても少なくとも可能になるはずです。最大の障害は、ライブラリにはまだ動的ロードを実行する機能がないことです。これを機能させるための潜在的な戦略を次に示します (Rust の受信ブランチで)。

  • コンパイラーをプログラムで駆動するために、rustc クレートにリンクします。コンパイラはスレッドセーフではないため、一度に 1 つのインプロセス ビルドのみを実行することに注意してください。
  • で呼び出したい関数をマークします#[no_mangle]。これは(私は試していませんが)マングルされていないシンボル名を生成するはずなので、簡単に見つけることができます。
  • dlopen/dlsym への最小限のバインディングを作成する
  • 関数ポインターを見つけて、それを Rust クロージャー型 (現在は で定義されていますsys::Closure) に安全に変換しません。
  • 閉鎖を呼び出します。

Rust には、この種の用途に使用できる最小限のテスト済みの JIT もありますが、いくつかの大きなバグがあります。

于 2013-01-22T23:57:22.677 に答える