No description
- Rust 100%
| .woodpecker | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
Lição 48: FFI — Foreign Function Interface (Ponte Externa)
1. Narrativa
O mecha Æther pode se conectar com sistemas externos — módulos de outras frotas escritos em C. A Foreign Function Interface (FFI) é a ponte de comunicação entre Rust e outras linguagens. O piloto deve traduzir tipos, gerenciar memória e respeitar as convenções de chamada para que os sistemas cooperem sem falhas.
2. Conceito
FFI permite que Rust chame código C e vice-versa:
extern "C": Define convenção de chamada C para funções#[no_mangle]: Evita que o compilador altere o nome da funçãostd::ffi: Tipos para interoperabilidade (CString, CStr, OsStr)repr(C): Garante layout de memória compatível com C- Tipos FFI-safe: i32, u64, *const T, *mut T — tipos com layout C definido
3. Requisitos
- Declarar funções externas com
extern "C" - Criar funções exportáveis com
#[no_mangle] - Usar
repr(C)para structs compatíveis - Converter entre tipos Rust e C (CString, CStr)
4. Design de Dados
graph LR
A[Rust] -->|extern C| B[C Library]
B -->|no_mangle| A
C[repr C Struct] --> D[Layout compatível]
5. Diagrama de Fluxo
flowchart TD
A[Rust Code] --> B[Converte tipos]
B --> C[Chama extern fn]
C --> D[C Code executa]
D --> E[Retorna valor]
E --> F[Converte de volta]
F --> G[Rust continua]
6. Funções
| Função | Descrição |
|---|---|
somar_c |
Chama função C de soma (simulada) |
strlen_rust |
Calcula comprimento como strlen do C |
criar_struct_c |
Cria struct compatível com repr(C) |
converter_cstring |
Converte String para CString e vice-versa |
ponteiro_para_slice |
Converte raw pointer + len em slice |
calcular_distancia |
Calcula distância entre dois pontos (função exportável) |
malloc_simulado |
Simula alocação estilo C |
comparar_strings_c |
Compara strings como strcmp do C |
7. Exemplo
#[repr(C)]
pub struct Ponto {
pub x: f64,
pub y: f64,
}
#[no_mangle]
pub extern "C" fn distancia(a: Ponto, b: Ponto) -> f64 {
let dx = b.x - a.x;
let dy = b.y - a.y;
(dx * dx + dy * dy).sqrt()
}
8. Missão
- Implementar
somar_cchamando função externa simulada - Implementar
strlen_rustcalculando comprimento como C - Implementar
criar_struct_ccriando structrepr(C) - Implementar
converter_cstringconvertendo entre String e CString - Implementar
ponteiro_para_sliceconvertendo pointer+length - Implementar
calcular_distanciaentre doisPontoC(função exportável) - Implementar
malloc_simuladosimulando alocação C - Implementar
comparar_strings_ccomo strcmp
9. Como Executar
cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check
10. Dicas
#[repr(C)]garante layout de memória compatível com C#[no_mangle]preserva o nome da função para linking- Use
CStringpara strings C (null-terminated) std::ffi::CStré a contraparte imutável- Tipos como
String,Vec<T>echar(Rust) não são FFI-safe — useCString, ponteiros + length, ec_char/c_int(tamanhos C compatíveis).boolé FFI-safe em#[repr(C)](compatível com_Booldo C99).