Eugene-Usachev
@Eugene-Usachev

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

Нужно вызвать из Rust функции других языков (или самого Rust), которые не известны до компиляции. Условно я знаю, что после компиляции, но до запуска программы будет создан файл init.lua, но я не знаю, что он содержит. Как это можно (принято) делать в Rust? (интересует lua, но и не плохо было бы C и Rust)
  • Вопрос задан
  • 240 просмотров
Решения вопроса 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, так как компилятор не может гарантировать безопасность операций через языковые границы, так что, аккуратней.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы