Um borrow checker, não encanamento de alocadores
A história de memória do Zig é "passe um alocador em todo lugar". Funções que alocam recebem um parâmetro Allocator; você decide de onde vem a memória em cada ponto de chamada. É explícito e poderoso, mas significa que todo helper tem um argumento de alocador, e use-after-free é seu problema em tempo de execução. Glide rastreia a propriedade em tempo de compilação: borrows vinculados ao escopo detectam use-after-free e mutação com aliasing antes de o programa rodar. Você ainda pode usar arenas quando quiser, apenas sem um parâmetro de alocador em cada fn.
fn load(path: string) -> !string {
return ok(fs_read(path)?);
} // sem argumento de alocador
fn load(alloc: Allocator, path: []const u8) ![]u8 {
return std.fs.cwd().readFileAlloc(alloc, path, 1<<20);
} // alocador passado por todo o código