Est-il possible de générer et d’exécuter du code Rust au moment de l’exécution?

En utilisant C, au moment de l’exécution, je peux:

  1. Créer le code source d’une fonction,
  2. Appelez gcc pour le comstackr en .so (Linux) (ou utilisez llvm, etc.),
  3. Chargez le .so, et
  4. Appelle la fonction.

Est-ce qu’une chose semblable est possible à Rust?

En particulier, je souhaite utiliser des types de données algébriques. L’utilisation d’un sous-ensemble C des fonctionnalités de Rust n’est donc pas suffisante.

Pas encore, officiellement, même si cela devrait être au moins possible sans trop de piratage. Le plus gros obstacle est que les bibliothèques n’ont pas encore la capacité de faire du chargement dynamic. Voici une stratégie potentielle pour que cela fonctionne (sur la nouvelle twig de Rust).

  • Lien vers la caisse de rustc pour piloter le compilateur par programmation. Sachez que le compilateur n’est pas threadsafe. Par conséquent, n’exécutez qu’une construction à la fois.
  • Marquez la fonction que vous voulez appeler avec #[no_mangle] . Cela devrait (je ne l’ai pas essayé) produire un nom de symbole non mélangé pour qu’il soit facile à trouver.
  • Créez des liaisons minimales à dlopen / dlsym
  • Recherchez le pointeur de la fonction et convertissez-le de manière non fausse en un type de fermeture Rust (défini dans sys::Closure ).
  • Appelez la fermeture.

Rust a également un JIT minimalement testé qui peut être utilisé pour ce type de choses, mais il a quelques bugs majeurs.