2013-01-22 67 views
13

使用C,在運行時,我可以:是否有可能在運行時生成並執行Rust代碼?

  1. 創建函數的源代碼,
  2. 調出的gcc將其編譯到一個.so(Linux)的(或使用LLVM等) ,
  3. 加載.so和
  4. 調用該函數。

Rust中可能有類似的東西嗎?

特別是我想使用代數數據類型,所以使用Rust的C特性子集的功能是不夠的。

回答

14

還沒有,正式的,但它應該至少有可能與不太多的黑客行爲。最大的障礙是圖書館沒有任何能力進行動態加載。 這是一個使其工作的潛在策略(在Rust的傳入分支上)。

  • 鏈接到rustc crate以編程方式驅動編譯器。請注意,編譯器不是線程安全的,因此一次只能運行一個進程內構建。
  • #[no_mangle]標記您要調用的功能。這應該(我沒有嘗試過)產生一個未加標記的符號名稱,因此很容易找到。
  • 創建最小綁定來執行dlopen /對dlsym
  • 查找函數指針和不安全其轉換爲鏽病閉合類型(目前在sys::Closure定義)。
  • 致電關閉。

Rust還有一個最低限度測試的JIT可以用於這種類型的東西,但它有一些主要的錯誤。

+4

這個答案很舊。同時情況有多改變? – xophos

相關問題