Подтвердить что ты не робот

Можно ли генерировать и выполнять код Rust во время выполнения?

Используя C, во время выполнения я могу:

  • Создайте исходный код функции,
  • Вызовите gcc, чтобы скомпилировать его в .so(Linux) (или использовать llvm и т.д.),
  • Загрузите .so и
  • Вызовите функцию.

Возможно ли подобное в Rust?

В частности, я хочу использовать Алгебраические типы данных, поэтому использовать C-подмножество функций Rust недостаточно.

4b9b3361

Ответ 1

Пока нет, официально, хотя это должно быть по крайней мере возможно с не слишком большим взломом. Самым большим препятствием является то, что библиотеки не имеют возможности выполнять динамическую загрузку. Здесь потенциальная стратегия, чтобы заставить ее работать (на входящей ветки ржавчины).

  • Ссылка на ящик rustc для программного программирования компилятора. Имейте в виду, что компилятор не является потокобезопасным, поэтому запустите только одну сборку в процессе.
  • Отметьте функцию, которую вы хотите вызвать, с помощью #[no_mangle]. Это должно (я его не пробовал) создает неподтвержденное имя символа, поэтому его легко найти.
  • Создание минимальных привязок к dlopen/dlsym
  • Найдите указатель на функцию и невольно преобразуйте ее в тип закрытия Rust (в настоящее время определенный в sys::Closure).
  • Вызовите закрытие.

У Rust также есть минимально проверенный JIT, который может использоваться для этого типа вещей, но у него есть некоторые основные ошибки.