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++#
| Item | No DataForge | Onde |
|---|---|---|
| FFI, C function calls | C.carregar(…) e lib.funcao(nome, [tipos], retorno) | Chamar C |
| C structs, unions | C.estrutura, C.uniao — com tamanho, alinhamento e deslocamentos | Chamar C |
| C enums | C.enumeracao({…}): inteiro com nome, que é o que atravessa | Chamar C |
| data layout, ABI compatibility | vem do ctypes, que segue a ABI da plataforma | Chamar C |
| calling conventions | a padrão (cdecl) é a que o ctypes usa; stdcall do Windows não está exposto | — |
| C++ interoperability, name mangling | só via `extern "C"`: o nome decorado do C++ não é estável entre compiladores, e resolvê-lo seria adivinhar | Chamar C |
| headers, bindings automáticos | não existem: não há leitor de .h. A assinatura é declarada à mão — e declarar é o que impede o erro silencioso | — |
27 · Ponteiros crus#
| Item | No DataForge | Onde |
|---|---|---|
*mut T / *const T | C.ponteiro(alvo, tipo) — um só, sem distinção de mutabilidade | Ponteiros |
| pointer arithmetic | p.deslocar(n) (itens) e p.deslocar_bytes(n) | Ponteiros |
| dereference | p.ler() e p.escrever(v), no tipo declarado | Ponteiros |
| raw memory, manual allocation/deallocation | C.alocar, C.liberar, C.copiar, C.de_bytes, C.para_bytes | Ponteiros |
| memory alignment | C.alinhamento_de(tipo) e Molde.alinhamento() | Chamar C |
unsafe blocks | nã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#
| Item | No DataForge | Onde |
|---|---|---|
| funções como callbacks | C.retorno_de_chamada(acao, [tipos], retorno) | Callbacks |
| closures | a ação leva o fechamento; o C não sabe, e não precisa saber | Callbacks |
| function pointers | cb.endereco(), e o próprio cb passa como ponteiro | Callbacks |
| context pointers | declare um ponteiro a mais na assinatura | Callbacks |
| callback lifecycle | explícito: vivo() / soltar() — um callback coletado derruba o processo | Callbacks |
| static trampolines | o ctypes monta; não há o que escrever | — |
29 · Bibliotecas dinâmicas#
| Item | No DataForge | Onde |
|---|---|---|
dlopen, runtime loading | C.carregar(nome_ou_caminho) | Chamar C |
dlsym, symbol resolution | lib.tem(nome) e lib.funcao(nome, …), com erro que nomeia o símbolo | Chamar C |
| .so, .dylib, .dll | os três, pelo mesmo carregar; a busca usa o mecanismo do sistema | Chamar C |
| símbolos do próprio processo | C.do_processo() — o dlopen(NULL) | Chamar C |
| static linking | não se aplica: não há binário a ligar — o DataForge é interpretado | — |
| plugin architectures | duas formas: .so carregado com C.carregar, e plugin do `check` escrito em DataForge | Plugins |
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.