Pular para o conteúdo

Memória determinística: o mapa

Item por item da parte 3 da referência Deep Tech — ownership, borrow checker, lifetimes, smart pointers e layout — cruzado com o que o DataForge tem, e o que não tem por decisão.

A terceira parte de uma referência Deep Tech descreve o gerenciamento determinístico de memória: ownership, borrow checker, lifetimes, smart pointers e layout. Ela foi escrita para uma linguagem compilada com memória manual. O DataForge é interpretado e tem coletor — então a pergunta certa não é "como copiar Rust", e sim o que dessa disciplina continua valendo aqui.

12 · Ownership#

ItemNo DataForgeOnde
modelo de ownership, propriedade exclusivaP.dono(valor, ao_soltar)opt-in: vale para o que você declaraPosse
movimentaçãomover(): quem move, perde; usar depois é erro, e o check acusa antes (posse-movida)Posse
cópia e clonecopiar() (mesmo valor) e clonar() (cópia) — a distinção é explícitaPosse
borrowing, aliasing, mutabilidadeusar/mudar no dono e ler/escrever na célula: muitos leem OU um escrevePosse
destrutores, RAIIsoltar() roda o finalizador agora; P.com e P.com_escopo soltam até no erroEscopo
regras de acessocobradas quando roda; o check prova o subconjunto que o fluxo de um arquivo permitePosse

13 · Borrow checker#

ItemNo DataForgeOnde
regras de empréstimo, referência compartilhada e mutáveller (N) XOR escrever (1), cobrado em execução — como o RefCellPosse
exclusividade de mutabilidade, aliasing seguroa célula recusa escrever no meio de uma leitura, com a mensagem dizendo quem está lendoPosse
análise de dataflowo check segue o fluxo de um arquivo: move, solta, devolve, passa adianteAnálise estática
diagnósticosposse-movida (erro), recurso-vazado e emprestimo-escapa (avisos)Posse
verificação em tempo de compilaçãonão existe: não há inferência de região. A garantia é em execução, e a prova estática é o que o literal e o fluxo permitem
NLL (non-lexical lifetimes)não se aplica, e na prática o efeito é o mesmo: o empréstimo acaba no fim do corpo que o recebeu, e não no fim do blocoPosse

14 · Lifetimes#

ItemNo DataForgeOnde
tempo de vida de um recursoo escopo: P.escopo() solta tudo na ordem inversa; defer faz o mesmo sem objeto novoEscopo
lifetime de um empréstimoo corpo de usar/mudar/ler/escrever; pedi-lo fora dele devolve um empréstimo já encerradoPosse
lifetimes explícitos ('a), elisão, boundsnão existem: não há região a anotar, porque não há como um valor virar endereço inválido
lifetimes em structs, funções e traitsnão se aplicam pelo mesmo motivo; o que existe é a posse do recurso guardado num campo
subtyping, covariância, contravariância, invariâncianão existem como declaração: a herança dá subtipagem de valor, e coleção genérica é conferida item a itemGenerics

15 · Smart pointers#

ItemNo DataForgeOnde
Box<T>P.dono(valor) — posse exclusiva com destrutorPosse
Rc<T>P.compartilhado(valor) — contagem determinísticaPosse
Arc<T>, atomic reference countingP.atomico(valor) — a mesma coisa, válida entre threadsPosse
weak referencesP.fraco(c) (responde Talvez) e Mem.fraca(obj) / Mem.mapa_fraco()Layout
ciclos de referênciaacontecem, e são mostrados: um ciclo forte não chega a zero; a volta fraca o quebraPosse
referênciastoda variável já é uma: o valor é um objeto, e a atribuição não copiaVariáveis
ponteiros crus, heap, stacknão existem: não há endereço exposto nem escolha de onde o valor mora

16 · Memória e layout#

ItemNo DataForgeOnde
stack framesquadros de chamada, com teto de mil; yield f(…) vira salto e não tem tetoAções
object/struct layoutslots contra dicionário — medido: Mem.layout e Mem.comparar_layoutLayout
heap allocationtoda alocação é do runtime; não há escolha
alignment, padding, cache lines, ABInão se aplicam: não há layout fixo nem binárioLayout
endiannessexiste onde importa: Arcane.Bytes.empacotar/desempacotar, na fronteira do arquivo e da redeArcane.Bytes
nullabilityvoid, com ?? e ?.; e a união String | Void diz isso no tipoTipos nomeados
zero-sized typesnão existem: todo valor ocupa alguma coisa
enum layoutum membro de enum é um objeto com nome, valor e índice — sem representação binária escolhidaRecords e enums

O resumo honesto#

Das cinco seções da parte 3, três têm resposta de verdade aqui — ownership, disciplina de empréstimo e smart pointers —, porque elas falam de protocolo, e protocolo existe em qualquer linguagem. As outras duas — lifetimes anotados e layout binário — falam de representação, e representação é assunto de quem compila.

O que o DataForge oferece no lugar delas: liberação determinística onde importa (soltar, com, escopo), medida real de custo por objeto (Mem.layout), e a travessia de processo quando o problema é CPU e não memória.