logoalt Hacker News

Four Months of Zig

50 points • by ibobev • today at 8:13 PM • 24 comments • view on HN

Comments

i2talics • today at 11:01 PM

Why does everyone love being able to control the allocator in Zig? I rarely want this low level control over the allocator, I would rather have an easy to use interface to malloc/free (such as RAII) or would prefer the language push me to avoiding allocations when unnecessary. C and Zig users are always talking about how arena allocators are easier to use than the alternative but I disagree because the alternative is extremely easy to use when the language makes it so.

Arenas have a lot of footguns like growing out of control if you don't have space in your logic to delete them (e.g. suppose every new HTTP connection required obtaining a new allocation from the primary arena -- now you have a memory leak). They also aren't necessarily faster than malloc: I remember hearing a case where mimalloc was faster than an arena for a one-shot program like a linker because reclaiming space improved cache locality. Plus it's difficult to implement things like growable vectors or hashmaps using an arena without wasting space.

I just don't see how "futz about with the allocator constantly" and "use an arena" is actually a good default.

➕ show 3 replies
22c • today at 11:14 PM

First I'm hearing of TigerStyle.

> The time to solve performance, and get the 1000x wins, is in the design phase, when you can't profile.

How does this make practical sense? I find it immensely easier to fix performance issues by profiling, benchmarking, finding hotspots. Things that weren't obviously performance bottlenecks during design become obvious when you profile.

Interesting write-up though. I haven't properly tried zig but I like reading these "initial impressions" style articles about it.

➕ show 1 reply
alexboehm • today at 11:16 PM

I agree with anyzig, it's amazing.

I made a PR to add a default zig, which was rejected, I've been using it ever since though.

https://github.com/marler8997/anyzig/pull/71

michidk • today at 10:39 PM

Pretty nice! I wrote a similar piece two years ago: https://blog.lohr.dev/after-a-day-of-programming-in-zig Great to see things are moving in the right direction.

Atlas48 • today at 10:36 PM

I can't wait until Zig is a little more stable, I'd love to get into it more because the metaprogramming seems like such a draw.

paaloeye • today at 9:47 PM

Does ReTangled have anything to do with https://tangled.org?

➕ show 1 reply
LoganDark • today at 9:15 PM

> In Rust you can use ?, which is quicker than unwrap, but you also have to do something like Result<Type, Box<dyn std::error::Error>

No, you don't! When returning Result<T, E>, you can use ? on any Result<T2, E2> where E: From<E2>. In other words E doesn't have to be Box<dyn>, it just has to satisfy From<E2>.

Crates like thiserror make it easy to define your own error types that can be easily converted from all the other error types you can encounter in your functions! I do this whenever it doesn't make sense to use an inner error type directly, or whenever a function does its own validation that deserves its own error variant.

On top of that, I tend to also have error variants for each place in the function rather than only for each type of inner error. At error sites I do something like `.map_err(MyError::PlaceInTheFunction)?` rather than only `?`, and then errors become like a very efficient backtrace :)

➕ show 1 reply
paaloeye • today at 8:49 PM

$curl: (6) Could not resolve host: gracefulliberty.com HN effect?

➕ show 1 reply