No description
Find a file
2026-09-01 13:10:03 +02:00
.woodpecker chore: migrate CI to .woodpecker/{push,branch}.yml 2026-09-01 13:10:03 +02:00
src fix: content audit corrections (accuracy, coherence, concordância, tests) 2026-09-01 13:10:03 +02:00
tests fix: content audit corrections (accuracy, coherence, concordância, tests) 2026-09-01 13:10:03 +02:00
.gitignore Initial commit 2026-09-01 11:09:39 +00:00
Cargo.lock initial content 2026-09-01 13:10:00 +02:00
Cargo.toml chore: declare MSRV 1.85 (edition 2024) 2026-09-01 13:10:03 +02:00
LICENSE chore: add AGPL-3.0 license and standard .gitignore 2026-09-01 13:10:03 +02:00
README.md fix: content audit corrections (accuracy, coherence, concordância, tests) 2026-09-01 13:10:03 +02:00

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ção
  • std::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

  1. Implementar somar_c chamando função externa simulada
  2. Implementar strlen_rust calculando comprimento como C
  3. Implementar criar_struct_c criando struct repr(C)
  4. Implementar converter_cstring convertendo entre String e CString
  5. Implementar ponteiro_para_slice convertendo pointer+length
  6. Implementar calcular_distancia entre dois PontoC (função exportável)
  7. Implementar malloc_simulado simulando alocação C
  8. Implementar comparar_strings_c como 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 CString para strings C (null-terminated)
  • std::ffi::CStr é a contraparte imutável
  • Tipos como String, Vec<T> e char (Rust) não são FFI-safe — use CString, ponteiros + length, e c_char/c_int (tamanhos C compatíveis). bool é FFI-safe em #[repr(C)] (compatível com _Bool do C99).