Pular para o conteúdo

FFI: o mapa

Item por item da parte 6 da referência Deep Tech — C/C++, ponteiros crus, callbacks e bibliotecas dinâmicas — cruzado com o que o DataForge tem.

A sexta parte de uma referência Deep Tech cobre interoperabilidade com C/C++, ponteiros crus, callbacks e bibliotecas dinâmicas. Quase tudo isso existe aqui — porque FFI é sobre protocolo de chamada, e isso não depende de a linguagem ser compilada.

26 · Interoperabilidade C/C++#

ItemNo DataForgeOnde
FFI, C function callsC.carregar(…) e lib.funcao(nome, [tipos], retorno)Chamar C
C structs, unionsC.estrutura, C.uniao — com tamanho, alinhamento e deslocamentosChamar C
C enumsC.enumeracao({…}): inteiro com nome, que é o que atravessaChamar C
data layout, ABI compatibilityvem do ctypes, que segue a ABI da plataformaChamar C
calling conventionsa padrão (cdecl) é a que o ctypes usa; stdcall do Windows não está exposto
C++ interoperability, name manglingsó via `extern "C"`: o nome decorado do C++ não é estável entre compiladores, e resolvê-lo seria adivinharChamar C
headers, bindings automáticosnão existem: não há leitor de .h. A assinatura é declarada à mão — e declarar é o que impede o erro silencioso

27 · Ponteiros crus#

ItemNo DataForgeOnde
*mut T / *const TC.ponteiro(alvo, tipo) — um só, sem distinção de mutabilidadePonteiros
pointer arithmeticp.deslocar(n) (itens) e p.deslocar_bytes(n)Ponteiros
dereferencep.ler() e p.escrever(v), no tipo declaradoPonteiros
raw memory, manual allocation/deallocationC.alocar, C.liberar, C.copiar, C.de_bytes, C.para_bytesPonteiros
memory alignmentC.alinhamento_de(tipo) e Molde.alinhamento()Chamar C
unsafe blocksnão existem: não há bloco a marcar. O módulo inteiro é a fronteira insegura, e a documentação diz isso em vez de espalhar uma palavra

28 · Callbacks cross-language#

ItemNo DataForgeOnde
funções como callbacksC.retorno_de_chamada(acao, [tipos], retorno)Callbacks
closuresa ação leva o fechamento; o C não sabe, e não precisa saberCallbacks
function pointerscb.endereco(), e o próprio cb passa como ponteiroCallbacks
context pointersdeclare um ponteiro a mais na assinaturaCallbacks
callback lifecycleexplícito: vivo() / soltar() — um callback coletado derruba o processoCallbacks
static trampolineso ctypes monta; não há o que escrever

29 · Bibliotecas dinâmicas#

ItemNo DataForgeOnde
dlopen, runtime loadingC.carregar(nome_ou_caminho)Chamar C
dlsym, symbol resolutionlib.tem(nome) e lib.funcao(nome, …), com erro que nomeia o símboloChamar C
.so, .dylib, .dllos três, pelo mesmo carregar; a busca usa o mecanismo do sistemaChamar C
símbolos do próprio processoC.do_processo() — o dlopen(NULL)Chamar C
static linkingnão se aplica: não há binário a ligar — o DataForge é interpretado
plugin architecturesduas formas: .so carregado com C.carregar, e plugin do `check` escrito em DataForgePlugins

O resumo honesto#

Esta é a parte com a maior cobertura de todas até aqui: das quatro seções, três estão quase inteiras, e a quarta (C/C++) só deixa de fora o que depende de ler cabeçalho ou de decodificar nome de C++ — duas coisas que, feitas por adivinhação, produziriam exatamente o tipo de erro que FFI já tem demais.