Noções Básicas de Interoperabilidade
10 exemplos para escolher como Rust se comunica com Python, Node.js, C/C++ e outros runtimes.
Pré-requisitos
- Rust 1.97.0 (edição 2024)
- Propriedade clara de qual linguagem é dona do processo e do heap do GC
Exemplos Básicos
1. Matriz de Decisão
| Objetivo | Ferramenta principal |
|---|---|
| Módulo de extensão Python | PyO3 + maturin |
| Addon nativo do Node | napi-rs |
| Lib estática ou dinâmica C/C++ | extern "C" + cbindgen |
| Computação no navegador | wasm-bindgen |
| Plugin em sandbox | Componente WASM / WASI |
Escolha um limite principal por ponto de integração.
2. Quem é o Dono do main?
Rust é dono do main -> incorpora Python/JS via FFI (PyO3, Neon)
Host é dono do main -> exporta Rust como biblioteca (cdylib/staticlib)O dono controla a inicialização, o tratamento de sinais e a escolha do alocador.
3. Requisito de ABI Estável
#[repr(C)]
pub struct Point {
pub x: f64,
pub y: f64,
}- Interoperabilidade C/C++ requer
repr(C)eextern "C" - Rust para Rust entre crates não precisa de ABI C
- Nunca exponha
StringouVecem cabeçalhos C
Relacionado: Expondo uma Biblioteca Rust para C/C++
4. Padrão de Mapeamento de Erros
#[repr(C)]
pub enum Status {
Ok = 0,
InvalidInput = 1,
Oom = 2,
}Mapeie Result do Rust para códigos inteiros ou parâmetros de saída na fronteira.
5. Contrato de Propriedade de Memória
Rust aloca -> Rust libera (exporta mylib_free)
C aloca -> C libera
Copia na fronteira -> padrão mais seguro para dados pequenosDocumente quem libera cada ponteiro no cabeçalho.
Relacionado: Marshalling de Dados
6. Visão Rápida do PyO3
use pyo3::prelude::*;
#[pyfunction]
fn add(a: i64, b: i64) -> PyResult<i64> {
Ok(a + b)
}Python chama Rust para caminhos críticos. Rust chama Python para orquestração quando necessário.
Relacionado: PyO3
7. Visão Rápida do napi-rs
#[napi]
pub fn fib(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => fib(n - 1) + fib(n - 2),
}
}Gera tipos TypeScript automaticamente para consumidores do Node.
Relacionado: Node.js com napi-rs
8. Quando WASM Supera FFI Nativo
- Plugins multiplataforma sem compilações por SO
- Código não confiável em sandbox
- Mesmo módulo no navegador e no runtime de edge
Relacionado: Incorporando Rust em Outros Runtimes
Exemplos Intermediários
9. maturin para Empacotamento Python
maturin develop
python -c "import myrust; print(myrust.add(1, 2))"Constrói wheels com Rust dentro para pip install.
Relacionado: maturin
10. Checklist de Integração
- Regras de propriedade escritas em README e cabeçalho
- Panics capturados na fronteira FFI
- CI compila todos os triplos de destino que você envia
- Testes de integração na linguagem host
- Política de Semver para a API de fronteira pública
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4 e Polars 0.46+.