Eugene-Usachev
@Eugene-Usachev

Как вызывать код из других языков в Rust?

Нужно вызвать из Rust функции других языков (или самого Rust), которые не известны до компиляции. Условно я знаю, что после компиляции, но до запуска программы будет создан файл init.lua, но я не знаю, что он содержит. Как это можно (принято) делать в Rust? (интересует lua, но и не плохо было бы C и Rust)
  • Вопрос задан
  • 226 просмотров
Решения вопроса 1
Torin_Asakura
@Torin_Asakura
Lead Architect
Обычно для таких целей используются FFI (Foreign Function Interface) или аналогичные либы, которые облегчают жизнь. Если вопрос по коду на Lua, C или Rust, который не известен до момента исполнения, можно сделать что-то в духе:

Lua из Rust
Для Lua скриптов можно юзать `rlua` или `mlua`. Эти либы позволяют загружать и выполнять Lua скрипты в рантайме.

Пример кода с использованием `mlua`:
use mlua::Lua;

fn main() -> mlua::Result<()> {
    let lua = Lua::new();
    lua.load(r#"
        print("Hello from Lua!")
    "#).exec()?;
    Ok(())
}


C из Rust
Rust имеет на борту поддержку для вызова функций C через FFI. Объявляешь функции C с помощью ключевого слова `extern` и потом вызываешь их напрямую в Rust.

Пример объявления и вызова функции C:
extern "C" {
    fn c_function(arg: c_int) -> c_int;
}

fn main() {
    unsafe {
        c_function(5);
    }
}


Динамическая загрузка функций Rust
Для вызова функций Rust, которые не известны на этапе компиляции, нужно использовать DLLs на Windows или shared objects - .so на Unix-подобных системах. Компилишь функции Rust в такую библиотеку и загружаешь их в
в рантайм с помощью библиотеки `libloading`.

Пример кода с использованием `libloading`:
use libloading::{Library, Symbol};

fn main() {
    let lib = Library::new("path_to_library.so").unwrap();
    unsafe {
        let func: Symbol<unsafe extern fn() -> ()> = lib.get(b"my_function").unwrap();
        func();
    }
}


Единственное, важно помнить, что в случае с FFI и загрузкой библиотек в рантайме, тебе придётся использовать `unsafe` код в Rust, так как компилятор не может гарантировать безопасность операций через языковые границы, так что, аккуратней.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы