Obviously, I/O as an interface is the headliner here, but there are lots of other goodies to pay attention to, such as the "juicy main".
Small integers auto coercing into floats is a nice gift to game devs. It's nice that game dev is acknowledged as one of the niches Zig can target as I believe it could really thrive there due to how easily it can integrate with C & C++. Or, rather, more easily than the alternatives.
I did a really tiny contribution about zig cc supporting -exported_symbols_list, which together with the hack of filtering out -liconv makes for a very viable linux -> macOS Rust cross-compiler. There's a few caveats but those have been manageable so far.
What a banger of a release. The new `Io` interface was a huge breaking change for my project, but I made the transition. Zig seems to be pulling the same trick it pulled with allocators: just make it an explicit value that you pass around. Explicit allocators felt obviously right in retrospect, and so far this feels obviously right too.
The approach feels like a natural extension of Zig's philosophy about explicitness around low-level operations (no hidden control flow, no hidden memory allocations, etc.). Your function can be blocking? Communicate that through the function signature! Very in style for the language.
It's the dark horse of this release as CLI parsing can also be more easily built on top of it. There's a couple of proposals floating around now, so I hope we get something soon-ish (maybe in 0.18 since a short cyle is planned for 0.17).
It's strange, because it has been over 10 years now. To get to 0.20, seems like it would be another 2 to 3 years. The weirdest thing is how Zig continuously gets a pass for being "almost there", for around 5 years now.
An argument could be made that why it's taking so long is about the language's BDFL wanting the freedom to continually make breaking changes. As it is, they got another bewildering pass for sweeping 3,000 plus issues under the rug, with the move from GitHub to Codeberg.
I've been waiting eagerly for this release ever since the new Io interface was announced. Pumped to start working on some new projects with this!
Love this line from the release notes:
> Lo! Lest one learn a lone release lesson, let proclaim: "cancelation" should seriously only be spelt thusly (single "l"). Let not evil, godless liars lead afoul.
Interfaces can still be expressed using vtables. You just have to write the vtable yourself rather than have the language do it for you.
Also, Zig's tagged unions (enums with payloads in Rust) are really ergonomic and often what you want instead of interfaces. Alot of languages that use interfaces simply don't expose a good way of doing it so everyone reaches for interfaces by default. But if you don't need an actual interface then this way you don't even have to pay the cost of runtime dynamic dispatch.
Wish we could bribe Andrew Kelley to add a built-in for this. There are only a couple of regular ways that everyone creates these vtables. Might as well just standardize it.
You know, I used to be annoyed by all your consistently shitty remarks in any zig related HN thread, but these days, it's refreshing to have an unpleasant interaction with a human.
Sincerely, thanks for all your hand-written hatred.
Perhaps it can be a relief to make assessments about a couple of newer C alternative languages[1][2]. Zen C appears to be moving up very quickly, and even has autofree.
How is it a hack? I mean, you may not like the fact that Zig does not provide syntax sugar for interfaces, but how exactly do you think they are implemented in languages that do?
If they knew what all of the 0.x breaking changes were going to be ahead of time they wouldn't need to be trying out different choices to see how well they really pan out!
Obviously, I/O as an interface is the headliner here, but there are lots of other goodies to pay attention to, such as the "juicy main".
Small integers auto coercing into floats is a nice gift to game devs. It's nice that game dev is acknowledged as one of the niches Zig can target as I believe it could really thrive there due to how easily it can integrate with C & C++. Or, rather, more easily than the alternatives.
Really happy to see 0.16 come out.
I did a really tiny contribution about zig cc supporting -exported_symbols_list, which together with the hack of filtering out -liconv makes for a very viable linux -> macOS Rust cross-compiler. There's a few caveats but those have been manageable so far.
Absolutely in awe of Zig as a project.
What a banger of a release. The new `Io` interface was a huge breaking change for my project, but I made the transition. Zig seems to be pulling the same trick it pulled with allocators: just make it an explicit value that you pass around. Explicit allocators felt obviously right in retrospect, and so far this feels obviously right too.
The approach feels like a natural extension of Zig's philosophy about explicitness around low-level operations (no hidden control flow, no hidden memory allocations, etc.). Your function can be blocking? Communicate that through the function signature! Very in style for the language.
Seeing forbid runtime vector indexes seem unintuitive and hurt dev ergonomics...
The "Juicy Main" looks like a very nice QoL feature. Gets rid of all the boilerplate for allocators and argv.
It's the dark horse of this release as CLI parsing can also be more easily built on top of it. There's a couple of proposals floating around now, so I hope we get something soon-ish (maybe in 0.18 since a short cyle is planned for 0.17).
This sounds interesting to me - could you elaborate a little on what things are in those proposals?
Sure, this is the issue tracking the work: https://codeberg.org/ziglang/zig/issues/30677
The idea is to offer some kind of CLI parsing in the std. It says minimal, but the discussion also veers into some more advanced options.
The discussion resulted in two PRs (that I know of):
- Type-driven: https://codeberg.org/ziglang/zig/issues/30677
@dotcarmen extracted it into a package (https://codeberg.org/dotcarmen/clip) so people could more easily try it out.
- Composition-based: https://codeberg.org/ziglang/zig/pulls/31620
If you're familiar with Rust's clap, it's a bit like derive vs builder API.
You can also see how each approach would look in practice if you inspect the diff for the "tools" directory on the PRs.
Thanks!
clap's derive is so nice
Do I get it right that this is everything you need for a typical CLI tool?
You got that right.
That's clean.
Nice! I'm sad to see SegmentedList go. Also, I'm wondering if it's possible to use `recvmsg` and `sendmsg` backed by the new `Io` interface.
https://ziglang.org/download/0.16.0/release-notes.html#Loop-...
Seems like a big one! I wonder how it will impact real code performance
I/O, Linked, Incremental Compilation. Apart from 0.17 being a short release cycle. I wonder how many more releases before 1.0?
Are we looking at 0.20, another one and half year of baking?
It's strange, because it has been over 10 years now. To get to 0.20, seems like it would be another 2 to 3 years. The weirdest thing is how Zig continuously gets a pass for being "almost there", for around 5 years now.
An argument could be made that why it's taking so long is about the language's BDFL wanting the freedom to continually make breaking changes. As it is, they got another bewildering pass for sweeping 3,000 plus issues under the rug, with the move from GitHub to Codeberg.
I've been waiting eagerly for this release ever since the new Io interface was announced. Pumped to start working on some new projects with this!
Love this line from the release notes:
> Lo! Lest one learn a lone release lesson, let proclaim: "cancelation" should seriously only be spelt thusly (single "l"). Let not evil, godless liars lead afoul.
Have they said how many breaking changes requiring a rewrite Zig will be going through before it stabilises?
Also I thought Zig doesn't have interfaces....how does the IO one work?
Interfaces can still be expressed using vtables. You just have to write the vtable yourself rather than have the language do it for you.
Also, Zig's tagged unions (enums with payloads in Rust) are really ergonomic and often what you want instead of interfaces. Alot of languages that use interfaces simply don't expose a good way of doing it so everyone reaches for interfaces by default. But if you don't need an actual interface then this way you don't even have to pay the cost of runtime dynamic dispatch.
Are there any plans to add syntax sugar for interacting with vtables?
Wish we could bribe Andrew Kelley to add a built-in for this. There are only a couple of regular ways that everyone creates these vtables. Might as well just standardize it.
I feel like a std lib module would be sufficient.
Sadly no, as fas as I'm aware. I can't think of creating vtables manually every time I need to create interfaces, I guess Zig is not for me.
Yeah I don't understand why a language cannot automate something that routine and boilerplate-y.
Oh well, people like it so I won't judge, I'm happy we have choices for what languages we use. Just wish people would choose safe ones :/
It has C style interfaces, meaning structs with function pointers.
Which is basically how most device drivers in OSes that happen to be written in C, including UNIX flavours, work.
We all know that OP wasn't asking about THAT kind of interface and more "please create vtables for me" style of interface
That is too much compiler magic for Zig folks.
You know, I used to be annoyed by all your consistently shitty remarks in any zig related HN thread, but these days, it's refreshing to have an unpleasant interaction with a human.
Sincerely, thanks for all your hand-written hatred.
It goes both ways, when I see remarks regarding other languages from Zig community folks, not from you directly.
Modula-2 like safety is still better than C will ever be, though.
Yeah, it will be human as far as I can take it, cheers.
Perhaps it can be a relief to make assessments about a couple of newer C alternative languages[1][2]. Zen C appears to be moving up very quickly, and even has autofree.
[1]: https://github.com/c3lang/c3c (C3)
[2]: https://github.com/zenc-lang/zenc (Zen C)
That's a hack, not an interface lol
How is it a hack? I mean, you may not like the fact that Zig does not provide syntax sugar for interfaces, but how exactly do you think they are implemented in languages that do?
As plenty of other things in an "everything is explicit" language, whose goal is to be a safer C and nothing else.
The "module" system is another hack.
If they knew what all of the 0.x breaking changes were going to be ahead of time they wouldn't need to be trying out different choices to see how well they really pan out!