Каким образом можно интегрировать код из других языков в Rust?

Как в Rust вызывать функции из других языков (включая Rust), которые неизвестны на этапе компиляции, но известны после компиляции, например, в случае наличия файла "init.lua"? Какой подход принято использовать для выполнения этой задачи, особенно с использованием языков Lua, C и Rust?
  • 28 октября 2023 г. 17:38
Ответы на вопрос 2
В Rust существуют несколько способов интеграции кода из других языков:

1. Использование FFI (Foreign Function Interface) – функциональный интерфейс между языками программирования. 
   - Для интеграции с языком C, можно использовать стандартные библиотеки Rust, такие как libc или cty.
   - Для интеграции с другими языками, различные crate (библиотеки) могут предоставить готовые функции для связывания Rust с определенными языками, такие как `rust-lua` для Lua или `rust-python` для Python.
  
2. Создание оберток (wrappers) для вызова функций других языков. 
   - Можно создать структуру или модуль Rust с функциями-обертками, которые вызывают функции из других языков. Например, для вызова функции `init.lua` в Rust, можно использовать crate `rust-lua` и создать обертку, которая вызовет соответствующую функцию.

3. Использование интерфейсов платформы (Platform Interfaces). 
   - Для интеграции современных языков, таких как JavaScript или WebAssembly, Rust предлагает использование стандартных интерфейсов платформы, таких как `wasm-bindgen` для WebAssembly.

В зависимости от конкретных требований и внешних языков, можно выбрать наиболее подходящий способ интеграции.
Обычно для таких целей используются FFI (Foreign Function Interface) или аналогичные либы, которые облегчают жизнь. Если вопрос по коду на Lua, C или Rust, который не известен до момента исполнения, можно сделать что-то в духе: 

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

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

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

Пример объявления и вызова функции C:

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

Пример кода с использованием `libloading`:

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