A borrow checker, not allocator plumbing
Zig's memory story is "pass an allocator everywhere". Functions that allocate take an Allocator parameter; you decide where memory comes from at every call site. It's explicit and powerful, but it means every helper has an allocator argument, and use-after-free is your problem at runtime. Glide tracks ownership at compile time: scope-bound borrows catch use-after-free and aliased mutation before the program runs. You still get arenas when you want them, just without an allocator parameter on every fn.
fn load(path: string) -> !string {
return ok(fs_read(path)?);
} // no allocator arg
fn load(alloc: Allocator, path: []const u8) ![]u8 {
return std.fs.cwd().readFileAlloc(alloc, path, 1<<20);
} // alloc threaded through