News for hackers. Stuff that matters.
Re:Why Zig over C for Systems Programming by pron on Friday November 13, 2026 @10:35AM (#50485040)
Also, Zig is as at least as expressive as C++ (but without the implicitness and general language complexity that makes reviewing some sensitive code, where you need to see exactly what operations are performed, hard), and it supports arenas better than C/C++/Rust.
Re:Why Zig over C for Systems Programming by coolThingsFirst on Friday November 13, 2026 @10:52AM (#50485291)
show me operator overloading in Zig
Re:Why Zig over C for Systems Programming by nvme0n1p1 on Friday November 13, 2026 @10:58AM (#50485434)
Yes! And exceptions and inheritance and RTTI too. Bring back all the mistakes! Let's party like it's c++99
Re:Why Zig over C for Systems Programming by u8080 on Friday November 13, 2026 @11:05AM (#50485535)
please no
Re:Why Zig over C for Systems Programming by pron on Friday November 13, 2026 @11:07AM (#50485572)
In critical low-level code, any kind of overloading - operator or otherwise - is something you'd rather not have.

By expressivity I don't mean conrecte syntax, but the number of lines needed to express an algorithm (up to a small constant). C doesn't have C++'s expressivity because it lacks templates, and while you can sort of express that kind of thing with macros, it's not all the way there. Zig, however, gets you all the way (you might need to write matrix_plus instead of +, but the expressivity is the same).

Re:Why Zig over C for Systems Programming by Ygg2 on Friday November 13, 2026 @11:26AM (#50485838)
BS. Using operator overloading with SIMD makes it easier to translate algorithms into code. I wrote my own U8x32 wrappers and a + b is way better than a.add(b).
Re:Why Zig over C for Systems Programming by pron on Friday November 13, 2026 @11:53AM (#50486221)
I'm not disputing that some people like operator overloading, but clearly others prefer no overloading of any kind (don't know what the LLMs prefer, if they have any preferences). That's why we need options.
Re:Why Zig over C for Systems Programming by clhodapp on Friday November 13, 2026 @12:32PM (#50486790)
[delayed]
Re:Why Zig over C for Systems Programming by pron on Friday November 13, 2026 @01:12PM (#50487443)
I'm not talking about custom operators. I'm talking about the ability for programs to overload either operators or other symbols (subroutine names). It's true that custom operators don't have to support overloads, but it's hard not to get collisions without overloads.
Re:Why Zig over C for Systems Programming by cornstalks on Friday November 13, 2026 @12:00PM (#50486336)
You can do a+b in Zig with SIMD vectors. No operator overloading required
Re:Why Zig over C for Systems Programming by ogogmad on Friday November 13, 2026 @12:16PM (#50486576)
Sure. But doesn't it still lack autodiff, quaternions, etc?
Re:Why Zig over C for Systems Programming by cornstalks on Friday November 13, 2026 @01:46PM (#50487934)
Yes, there are definitely other use cases that Zig doesn't support (which some may view as a good or bad thing). I just wanted to respond to the comment about basic SIMD since the example was U8x32 and operator+, which Zig can do.
Re:Why Zig over C for Systems Programming by Ygg2 on Friday November 13, 2026 @02:22PM (#50488441)
Point wasn't about SIMD, but defining my wrapper for it and giving it operations I needed.

Which seems to be something Zig can't do.

Hell, you can define operators for generic length SIMD lane.

Re:Why Zig over C for Systems Programming by Ygg2 on Friday November 13, 2026 @01:55PM (#50488061)
Same goes for any bitwise operation <<, >>, &, |, %.

Can I write my SIMD/number abstraction and have it work?

Let's say I need rotors. With six dimensions. Can I overload it's basic numeric operations?

Re:Why Zig over C for Systems Programming by bunderbunder on Friday November 13, 2026 @12:22PM (#50486653)
The example you choose is rather telling, though. It indicates that the use case you have in mind is not at all the one that Zig is targeting.

A more humble critique would be to just acknowledge that you don’t seem to be a member of Zig’s target audience, and move on.

Re:Why Zig over C for Systems Programming by Ygg2 on Friday November 13, 2026 @02:00PM (#50488134)
I am in the target audience. I do want low level systems programming.

Saying "you don't want operator overloading" in such cases is a reductionist view of how systems programming should look.

Re:Why Zig over C for Systems Programming by hitekker on Friday November 13, 2026 @03:55PM (#50489525)
To be fair, the impression is that you want to do low level systems programming in Rust. It's a fine preference but it does put you in a different audience
Re:Why Zig over C for Systems Programming by bunderbunder on Friday November 13, 2026 @05:29PM (#50490959)
I’ll admit I interpreted that “you” in pron’s sentence to be a colloquial “you” and not an imperative one. So, more of a statement of their own preference than a strong statement of how things should be.

The point is, it’s a tradeoff. With overloading, exactly which code executes on a specific line becomes a bit more implicit because it depends on extra information from the surrounding context: the types of the arguments.

That comes with the usual tradeoffs. On the one hand, you could argue that the compiler is taking care of it for you, which saves the programmer from having to manually deal with it, and removes some visual clutter from the code.

But you can also argue that letting the choice of function be implicit means that a programmer who wants/needs to keep track of exactly what every line of code is doing needs to carry all that contextual information in their own head, too. For this programmer, it’s adding to the mental burden.

I don’t think it’s a coincidence that Kelley constantly brings up how Zig was inspired by difficulties writing a digital audio workstation with very hard real-time requirements. Part of what he’s doing there is giving a motivating case for why he wants to be an absolute control freak about, e.g., micro-managing exactly when memory is allocated and deallocated. That’s something only a subset of systems programmers need, because not all systems programming is dealing with things like hard real-time.

Re:Why Zig over C for Systems Programming by tialaramex on Friday November 13, 2026 @12:27PM (#50486716)
C++ destroyed the good will here by simultaneously insisting that you're only supposed to use this feature to give types their natural operators (makes sense) and then inventing implausible new "natural" operators so that Bjarne can show off his new toy with the I/O streams.

I actually don't like Rust's choice to implement + for Strings but most people seem to accept that, however C++ goes ludicrously far beyond "I don't like it but some people do" and straight off the cliff into "Nobody thinks that's OK" leaving you to wonder why there was effort to implement this bad idea. For example C++ can overload the short-circuiting boolean operators... but the overloaded versions don't short circuit. So now you've made things dramatically worse!

Re:Why Zig over C for Systems Programming by pron on Friday November 13, 2026 @01:20PM (#50487542)
Note that it's not that Zig is opposed to (user-controlled) operator overloading; it's opposed to (user-controlled) overloading of all symbols: The resolution of `foo` in `foo(x)` should not depend on the type of `x`. The issue is not the operators but the overloading, and Zig wants to prevent (user-controlled) overloading of any kind. This makes some things less convenient and other things more convenient.
Re:Why Zig over C for Systems Programming by tialaramex on Friday November 13, 2026 @03:13PM (#50489004)
> The resolution of `foo` in `foo(x)` should not depend on the type of `x`

This depends on how you're squinting at this word "resolution".

Remember on a modern CPU an XOR R1 R1 does not result in an ALU operation, the decoder understands this idiom and just renames a zero'd register as R1, whereas of course it can't do that for say XOR R2 R3 because that's an actual XOR operation. So if "resolution" means "exactly what happens on the CPU" apparently there is no such facility provided even in assembler.

So apparently we mean only that it should have, in some sense, the same effect. I think the fact Rust is OK with

  assert!("Goose".contains('o'))
  assert!("Goose".contains("Goo"))
  assert!("Goose".contains(&['a', 'e', 'i', 'o', 'u']))
.. meets this criterion, whereas presumably you do not agree.
Re:Why Zig over C for Systems Programming by pron on Friday November 13, 2026 @03:24PM (#50489133)
It's not about okay or not okay. Zig is designed to prevent any user code from being implicitly called, or for the resolution of user code to be done implicitly. It's not about what the CPU does internally, but whether you're able to tell, from reading the code of a single subroutine, which operations could be done, whether stack frames can be created etc.. This has pros and cons, and for some people the pros outweigh the cons and for others, the other way around, and that's why different programming languages need to prioritise different things when they target different users.
Re:Why Zig over C for Systems Programming by melodyogonna on Friday November 13, 2026 @11:11AM (#50485616)
Many people are against operator overloading, imo my only issue with C++ operator overloading is that you're allowed to overload the the assignment operator. From what I can see this is the root of many issues
Re:Why Zig over C for Systems Programming by vnorilo on Friday November 13, 2026 @12:22PM (#50486648)
overloading the comma is also a special flavor. everyone should try it once.
Re:Why Zig over C for Systems Programming by bunderbunder on Friday November 13, 2026 @12:43PM (#50487009)
I’ve also experienced some unnecessary shenanigans related to blurring the distinction between primitive operations, and stuff that happens dynamically at run time such as method calls.

For a somewhat different example of the same general idea, look at how Java handles primitives and their boxed counterparts. = on two ints always compares their value. = on two Integers compares their pointers. But it uses flyweight instances for values up to 256, so in Java, whether two Integers with the same numeric value are equal according to the = operator depends on what that value is.

Then throw autoboxing and generics into the mix, and it suddenly becomes very easy to do refactorings that work fine in the unit tests (which tend to use small numbers) but fails in confusing ways in production.

This isn’t an example of operator overloading, of course. But I hope it more simply illustrates why, at least in certain problem domains, there’s value in being able to visually tell when surprising runtime shenanigans are and are not possible. And also to make it impossible to cross that boundary without touching all code that falls within the blast radius of that change.

Re:Why Zig over C for Systems Programming by wpollock on Friday November 13, 2026 @01:25PM (#50487640)
> But it uses flyweight instances for values up to 256, so in Java, whether two Integers with the same numeric value are equal according to the = operator depends on what that value is. ...

I believe Java caches Integer objects for values -128..+128, not 256. But that may be an implementation detail, and not something to count on.

Re:Why Zig over C for Systems Programming by gf000 on Friday November 13, 2026 @01:34PM (#50487779)
And since java 28's value types, == will work identically for all Integers, finally.
Re:Why Zig over C for Systems Programming by wpollock on Friday November 13, 2026 @03:08PM (#50488943)
[delayed]
Re:Why Zig over C for Systems Programming by bunderbunder on Friday November 13, 2026 @01:43PM (#50487894)
No, you’re right. I misremembered.
Re:Why Zig over C for Systems Programming by wpollock on Friday November 13, 2026 @02:59PM (#50488846)
> No, you’re right. I misremembered.

We both misremembered. I found where this is documented and the range is -128..127 inclusive: <https://docs.oracle.com/en/java/javase/27/docs/api/java.base...>

Re:Why Zig over C for Systems Programming by ogogmad on Friday November 13, 2026 @11:54AM (#50486227)
Is there a way to support varying the meaning of "+" etc without introducing a lot of complexity? I suppose if Zig had nested functions, and the ability to define a nested function called "+", then you would have name shadowing instead of "overloading".
Re:Why Zig over C for Systems Programming by positive-spite on Friday November 13, 2026 @10:53AM (#50485337)
To anyone interested in arena allocators.

Rust just stabilized its `Allocator` API in version 1.100.0. Definitely worth checking out!

Re:Why Zig over C for Systems Programming by Bigpet on Friday November 13, 2026 @11:09AM (#50485589)
Seems like a long way to walk though. Retrofitting this will take time (if it'll ever complete). Zig made it a core part of the language and library. I'll assume Rust will make it farther than C++ ever made it, but just take a look at how retrofitting custom allocators is going there.

Seems like it will be useful for use-cases like embedded where you're restricted to certain parts of the library anyway. But the battle is kind of already lost for support at the level of Zig or Odin. Even if they retrofitted support for the whole standard library, they'll never be able retrofit all crates or make people even bother adding support for all new crates.

Re:Why Zig over C for Systems Programming by treyd on Friday November 13, 2026 @11:29AM (#50485869)
Rust's Allocator APIs have been around since 2016, less than a year after 1.0, they're just now stabilized.

The stdlib types that allocate have been generic (with default generic parameters) over the underlying Allocator used for a very long time. All widely-used data structure libraries where it's feasible/reasonable to use other allocators also are already generic over the Allocator.

It won't "take time to retrofit" because the language and ecosystem have already been prepared for it for 10 years. For context, async syntax was introduced a few years after that and if you just started learning the language today you wouldn't notice it wasn't there in 1.0.

Re:Why Zig over C for Systems Programming by Bigpet on Friday November 13, 2026 @11:46AM (#50486119)
Seems like I've misread the recent Rust version announcement:

> This release brings about the stabilization of the core parts of allocator_api, enabling library authors to define custom allocators that can be used together with certain standard library types - currently Vec and Box. These are enabled through the newly-stabilized Allocator trait.

That made it sound like it was rather limited currently.

I asked an LLM (because it's outside my expertise) and it said:

> It is fair to say that the heaviest architectural lifting is already done: adding a defaulted type parameter (A: Allocator = Global) preserves backward compatibility for existing code, and the core data structures already store and thread the allocator internally. However, plumbing that generic parameter through String, HashMap's std wrapper, and hundreds of standard library methods still represents substantial retrofitting work rather than a completed state.

Looks like The patch notes lead me a bit astray. But it's also not at an 'already all there' state either.

Re:Why Zig over C for Systems Programming by tialaramex on Friday November 13, 2026 @12:22PM (#50486647)
Although it's true that all of Rust's standard library collections are generic over Allocator, Rust 1.100 only stabilizes useful allocator APIs for Box and Vec

If you want to use your MyCustomAllocator with a HashMap or a BinaryHeap or you've lost your mind and want a LinkedList none of that was stabilized yet.

Personally I am slightly interested in HashMap, VecDeque and String but I think Vec is much more heavily used than any of those and will illustrate just how thin the pickings are in this space for real.

Re:Why Zig over C for Systems Programming by atiedebee on Friday November 13, 2026 @02:43PM (#50488681)
Perhaps custom allocators could be interesting for BTreeMap and BTreeSet? I am not familiar with their internal implementation, but as I understand it those should allocate fixed-size blocks, which would benefit from a specialized fixed-size allocator.
Re:Why Zig over C for Systems Programming by tialaramex on Friday November 13, 2026 @05:17PM (#50490792)
Sure, in principle all of the standard library collections and indeed most 3rd party collections which allocate could benefit from providing a good Allocator API.

If there's a particular 3rd party collection you know would benefit, you could ask them, or write a PR to make use of Allocator. The standard library collections of course know people are interested, you can think of this as an MVP.

I just picked a few I personally want to see.

Re:Why Zig over C for Systems Programming by tialaramex on Friday November 13, 2026 @12:15PM (#50486565)
> Seems like it will be useful for use-cases like embedded where you're restricted to certain parts of the library anyway. But the battle is kind of already lost for support at the level of Zig or Odin.

Odin in particular does a simply terrible job here. Take the most common need for allocations, a growable array type, in Rust Vec<T> and in Odin dynamic[T]

In Rust we only pay extra to store the allocator metadata if there is allocator metadata. If we're content using the general purpose allocator Global with global metadata it's free. In Odin we always need to pay to store an "allocator proc" function pointer and a (possibly unused) metadata pointer, so that's 2x machine word worse for Odin. We pay this even if we never allocate, and indeed even if we can't allocate, whereas of course in Rust that's free.

But then when we do need to allocate, in Rust that's a static dispatch unless our allocator specifically wants dynamic dispatch. So again for Global it's just a static dispatch. But in Odin it's always a slower dynamic dispatch.

The upside? To the extent there is one it's probably the New Jersey style, ie it was simpler to implement Odin. Which is a benefit to Ginger Bill, but not to you as an Odin programmer.

Re:Why Zig over C for Systems Programming by Bigpet on Friday November 13, 2026 @03:18PM (#50489062)
Sounds like the Odin implementation isn't particularly optimal. My point wasn't about speed or good implementations. My point was about which languages make it practical to consistenly use custom allocators as a user of the language. Not just across your own code, but also code from the standard library and external packages.

I have no practical Odin experience, I just looked at the core concepts. I tried a bit of Zig and there's significant discipline in the standard library to enable allocator use. But in 3rd Party libraries this discipline is hard to enforce because it also makes it harder to design easy to use interfaces.

I'm interested where on the spectrum of allocator usability Rust will end up at. I'd expect it somewhere between Zig and C++