2013-01-22 9 views
13

Utilizzando C, in fase di esecuzione, posso:È possibile generare ed eseguire il codice Rust in fase di runtime?

  1. Creare il codice sorgente di una funzione,
  2. chiamare a gcc per compilare ad un .so (Linux) (o l'uso LLVM, etc.) ,
  3. Caricare il .so e
  4. Chiamare la funzione.

È una cosa simile possibile in Rust?

In particolare, desidero utilizzare i tipi di dati algebrici, pertanto l'utilizzo di un sottoinsieme C delle funzionalità di Rust non è sufficiente.

risposta

14

Non ancora, ufficialmente, anche se dovrebbe essere almeno possibile con un hacking non eccessivo. Il più grande ostacolo è che le librerie non hanno ancora alcuna possibilità di eseguire il caricamento dinamico. Ecco una potenziale strategia per farlo funzionare (sul ramo in arrivo di Rust).

  • Collegamento alla cassa di ruggine per guidare il compilatore a livello di programmazione. Tieni presente che il compilatore non è protetto da thread, quindi esegui solo una build in-process alla volta.
  • Contrassegnare la funzione che si desidera chiamare con #[no_mangle]. Questo dovrebbe (non l'ho provato) produrre un nome di simbolo senza ambiguità, quindi è facile da trovare.
  • Creare collegamenti minimi a dlopen/dlsym
  • Trovare il puntatore della funzione e convertirlo in modo non corretto a un tipo di chiusura Ruggine (attualmente definito in sys::Closure).
  • Chiamare la chiusura.

Rust ha anche un JIT minimamente testato che può essere utilizzato per questo tipo di cose, ma ha alcuni bug importanti.

+4

Questa risposta è abbastanza vecchia. Quanto è cambiata la situazione nel frattempo? – xophos

Problemi correlati