latch a day ago

Author here.

I finally got it working. I had to flush both the encrypted writer and then the stream writer. There was also some issues with reading. Streaming works, but it'll always return 0 on the first read because Writer.Fixed doesn't implement sendFile, and thus after the first call, it internally switches from streaming mode to reading mode (1) and then things magically work.

Currently trying to get compression re-enabled in my websocket library.

(1) https://github.com/ziglang/zig/blob/47a2f2ddae9cc47ff6df7a71...

hardwaresofton a day ago

I'm not a Zig PM but the first obvious fix for the issues the OP wrote about is to write better documentation, including usage examples (the more the better, almost to a fault). Also doubles as a good time to reflect on whether the user is having to do too much.

If the tradeoff was absolute performance/avoiding introducing load-bearing performance-lowering abstraction I think that goal was achieved, but DX may have gone out the window.

  • brabel a day ago

    You’re not familiar with Zig’s culture, I guess. Complain about the lack of documentation and be prepared for the flood of “just read the stdlib code” helpful comments by pretty much everyone who writes Zig right now. Because most APIs are just as hard to use as in this post (check things like HTTP and even basic file system operations) only the strongest survive.

    • virtualritz a day ago

      I do not think this is a viable excuse any more.

      I am just editing docs now that Claude Code writes for me. I am fanatic about developer docs (and I guess an exception as I love writing them) but with a set of concise instructions for CC and some writing style examples I get 90% there, sometimes 99%.

      If you believe you don't have time for the last 1--10% you should not be in charge of writing any API used by anyone but yourself. Just my two c.

      • aDyslecticCrow a day ago

        Ai is great at block comments, there is no excuse. Add to that a small anotated usage example written by a human and this whole post would have not existed.

        Lack of docs also cripple AI from understanding, so future adoption becomes even more bleak.

        If an api or library developer didnt bother doing even bare minimum docs, my confidence in the library drops aswell.

        Did they skip testing aswell? Ran the happy path for a day and called it good?

        This post sour my interest in zig. Its now obvious to me now why rust took much of its market.

      • mikepurvis 17 hours ago

        As a senior dev I’m also passionate about docs and communication, and actually kind of love the process of agonizing over a bunch of rST files to get the perfect manual that’s both an on-boarding guide and also a reference of all the nooks and crannies.

        I think what I’ve come to realize is that when I feel a barrier toward doing that work, it’s a sign that I don’t actually like the underlying API. I don’t want to document it or craft examples or tutorials because in my mind the API sucks, it’s transitional, and documenting it in its current state is going to somehow lock in a bad interface and further increase the effort required to change and fix it up later.

      • throwawaymaths 18 hours ago

        It's just not reasonable to expect volunteers to write eloquent documentation when it's likely it will just get flushed

      • tel 17 hours ago

        At the same time, if you want to use Claude to read the source and narrate how it works to you that’s trivial to do as a user.

      • [removed] 16 hours ago
        [deleted]
      • foxes 20 hours ago

        I don't want to read ai slop comments. If you cant be bothered writing docs, I cant be bothered learning to use your library.

    • keyle a day ago

      That would hurt adoption. I understand things move fast but if you want people to make the switch other than hello world, it has to be at a minimum cosy. Sending them to hell and find your way out isn't a good move long term.

      I tried Zig a couple of times and I got that feeling: very powerful and clever language but not really for me, I don't have the headspace, sorry. I need something I can debug after an 8 hours dayjob, a commute and having put the kids to bed. It better be inviting & fun! (Hi, C).

      • skupig 16 hours ago

        Yeah, I had the same experience. I had an embedded project where I would need to use C libraries, and it seemed like a great excuse to try Zig, but it spat out a ton of esoteric errors I couldn't be bothered to figure out and I went back to Nim.

      • throwawaymaths 18 hours ago

        after chasing some insane macro gymnastics whivh are there to make the c portble, i came to understand that zig is more easy to debug than c

        • keyle 17 hours ago

          I don't live in that universe! I thanos flicked it off!

    • hardwaresofton a day ago

      Yeah, thinking about this attitude positively, maybe it’s a feature — if only hard core people can comfortably figure it out, you get higher quality contributions?

      Not trying to imply that’s an explicit goal (probably instead just a resource problem), but an observation

      • ksec a day ago

        I think it is a trade off for between zig's development speed and documentation. It is Pre 1.0, extreme beta mode with lots of breaking changes.

        Generally speaking I think it is the right trade off for now. Purely inferring from Andrew and the Zig's team online character as I don't know them in person, I think they do care a lot of DX, things like compiling speed and tools. So I think once 1.0 come I won't be surprised if it will have extremely good documentation as well.

        And I would argue, writing good, simple, clear, detailed documentation is actually harder than writing code itself.

      • chrisandchris a day ago

        Contributions to the Zig language or contributions to software using Zig (the latter is the one the post is about as I understand)?

        If so, I believe Zig will stay within a niche. Lower entry barriers allow "script kiddies" to easily start withe language, and they eventually will become leading engineers. Only a few people tend to go straight for the highest practice without "playing around". IMHO the reason, why PHP got so popular (it was not good back then, just very very easy to start with).

      • rjh29 a day ago

        I think it is intentional. They don't want to attract low-commitment beginners while the language is heavily changing (and explicitly in beta). Such people will ask questions and ask for documentation but contribute nothing.

      • DannyBee 18 hours ago

        More likely you get people who have the same groupthink, which has both ups and downs. Their contribution quality is probably not that well correlated.

    • [removed] 21 hours ago
      [deleted]
    • littlestymaar a day ago

      The key problem with Zig nowadays is how much of its community and adoption is driven by anti-Rust sentiment. As a result, while Rust puts beginner onboarding and documentation at the center of its culture, as opposed to the “C neckbeard”'s culture, Zig is going the other way around.

      (Loris Cro being a key community figure isn't helping in any way, and it's a good remainder that if you don't clear up your community from bullies from the beginning, they will turn your entire community to a miserable place. And that's a shame because from what I've seen, Andrew Kelley seems to be a very cool guy in addition to being very smart).

      • kristoff_it 21 hours ago

        > The key problem with Zig nowadays is how much of its community and adoption is driven by anti-Rust sentiment. As a result, while Rust puts beginner onboarding and documentation at the center of its culture, as opposed to the “C neckbeard”'s culture, Zig is going the other way around.

        Maybe, or maybe the fact that Zig is a small independent project with limited resources has also something to do with it, and this kind of shaming says less about Zig than you'd think.

        When I first joined the Zig project, Zig was still using the bootstrap compiler written in C++ that would not free memory (it took more than 4GB to compile the Zig compiler). Some people at the time were asking us to prioritize work on the package manager but Andrew rightfully wanted to prioritize rewriting the compiler instead. In hindsight this was the obviously right decision: a package manager implies that one can very easily add an order of magnitude more code to their project, stressing the performance of the compiler. If we had not prioritized core infrastructure over giving people what they wanted faster, today we would have people complaining that adding a single dependency to their project makes the build impossible to complete.

        The Zig project has a huge scope and we are a small independent organization. This makes us extremely nimble and efficient, but it does mean that we need to do things in the order that makes the most sense for the project, not for what the public wants.

        The fact that we develop in the open doesn't mean that the language is ready yet.

        People that already have the required domain knowledge (and who have a tolerance for breaking changes) will have the opportunity to be early adopters if they wish to do so, others will have to wait for Zig to become more mature. And we do make this clear in releases and all forms of public communication.

        We have gone a long way since the bootstrap compiler days, but we are still missing key infrastructure:

        - we have a x86_64 custom backend but aarch64 is not complete yet - incremental compilation is showing that we can get instant rebuilds of large projects, but it has missing features and it doesn't work on all platforms yet - we need native fuzzing since AFL keeps regressing everytime a new version of LLVM comes out - for the longest time we haven't had a strong I/O story, now we're finally working on it

        The time for paving the road for a new generation of programmers will come (it's in the ZSF mission statement btw), but first we need to finish the plumbing.

      • pjmlp 21 hours ago

        Not only, the whole handmade movement puts me off.

        It is the anti-intelectualism from Go culture, gone wild against C++, Rust, Swift, anything modern, or even tools, using game engines versus doing the whole computer from scratch for a game.

      • ksec 15 hours ago

        That is actually a valid point on expectation given the attracted people's demographic.

        I will hopefully wait for comments from Ghostty, Bun or Tigerbeetle Devs.

        On another point that is wroth mentioning, I hope Andrew will at least put it out publicly, IMO Zig isn't Anti-Rust. But it did attract the type of people who are not too happy with Rust. I dont remember a single time Zig came out to bash anything about Rust. It isn't Anti anything at all. Its goal is to be a decent C replacement as very high level assembly languages, aiming at Data Oriented Design with some interesting features, and extremely fast compilation speed. ( Which was the reason why I was interested in it in the first place. I miss Turbo Pascal )

        Zig reminds me of the old school, traditional projects. It isn't perfect for everything, it never claims to be, if you like it, use it. If not, there are plenty of options out there.

        At least Ghostty Dev seems to be enjoying it almost every day.

        • littlestymaar 11 hours ago

          I don't think Andrew is anti-Rust. But Loris, whose hn profile says he's “vp of community of the zig software foundation” is as anti-Rust as you can get: he's pathologically obsessed by Rust and spent significant amount of energy outright insulting Rust maintainers here or on Twitter (when he's not buzzy writing anti-Rust rant on his blog).

          But as you say, there's no reason why Zig ought to be anti-Rust, both language are are fresh attempts at low level programming, both highly opinionated and with very different philosophies and trade offs and both language can cohabit peacefully (I've heard good things about using the Zig toolchain for cross compilation of C dependencies in rust projects, so the existence of Zig already has had a positive impact on the Rust ecosystem).

      • TUSF 9 hours ago

        > anti-Rust sentiment

        I have not seen much of any anti-Rust sentiment in the community. There's a lot of people in the community who do Rust, like rust, and work on rust projects. If the Zig community has an anti-anything sentiment, it's against C++.

  • jakobnissen a day ago

    There is a cost to writing documentation - it takes time, which could be used to improve Zig in other areas. For code that is work-in-progress, it can make sense to not document until things are more settled.

    Of course documentation is good. But if you have to prioritize either a new feature, or a critical bugfix, or documentation, you often can't have it all

    • simonask a day ago

      I tend to actually disagree with this attitude, because I see writing documentation as really effective "rubber-ducking". If it's hard and time-consuming to properly document, it's probably hard to use, so extra effort should be spent to actually justify the design, not least to yourself in 6 months. If you can't justify it, it's probably wrong.

      • kelnos 21 hours ago

        This really struck a chord with me. Writing documentation is an act of explaining something to others. Explaining something to others is a great way to test your own understanding. If it's hard to explain to someone else, then maybe it's the wrong design.

        If you don't through that exercise, you're much more likely to build confusing, difficult-to-use APIs.

      • pmarreck 21 hours ago

        100%.

        Similar to how TDD forces you to first figure out the API of your code due to the test code being its first client.

    • crote 18 hours ago

      On the other hand, not writing documentation also has a cost.

      Code is rarely written from start to finish in a single session. Would you rather spend 5 minutes before you do a git commit to write down some very basic documentation, or spend an hour rediscovering it when you pick up development two weeks later?

      Nobody is expecting extensive and well-polished documentation here, but is a "Flags X, Y, and Z are mandatory, buffer A is required: I tested with 10MB, smaller might be fine too" really too much to ask for?

      Is the time you saved by not writing that one line worth someone else spending several hours figuring out how to do a "hello world"?

    • hardwaresofton a day ago

      This is a good point, but one could make a point for the usefulness of documentation in “thinking like a user” which is a valuable exercise.

      I do very much prefer moving fast though, so I get it, docs-later is obviously a very valid way of doing things.

      If someone is excited about Zig and wanted to make a difference I guess it’s now obvious where they could have outsized impact!

      • 7bit 21 hours ago

        Docs later is an okay approach, when you build something in a closed environment, where the only users know the code inside out.

        But when working in open-source and your goal is to have people adopt your software, then it's a bad point and a lazy excuse.

    • aDyslecticCrow a day ago

      Then they should not have relead the new api at all. Why release half finnished library.

      • flohofwoe a day ago

        Zig as a whole is half-finished, should it be kept under wraps until it is ready?

        There's a reason for the 0.x version number, if you can't live with breaking changes, don't use Zig yet. It's as simple as that.

        • aDyslecticCrow 13 hours ago

          Breaking changes and limited support is one thing. But docs is not something you add at at the end. Lacking docs and Lacking tests is code that should not be released.

          They target embedded c market. Limited support and features is expected and common. But being lax with docs and testing is not acceptable.

      • sureglymop a day ago

        Because the language is not stable at this point and hasn't reached 1.0?

        Are you saying one should never make anything half finished available to the public? This post proves why it is valuable to do so, they are getting valuable feedback and a discussion on hacker news for free.

    • 7bit 21 hours ago

      Your argument implies that good documentation is not an improvement, which of course is wrong. It also belongs to the task of improving code. Why would you move away after half-assing the API, when you can add the docs and whole-ass it instead?

    • wordofx a day ago

      Na. It’s flat out laziness. Don’t make excuses. Either write docs or stop worrying code.

  • ulbu a day ago

    i find that zig is too oriented at doling out directives for what not to do instead of just collecting and teaching variants of how and what to do. the lack of documentation on this interface is a sore case in point.

    • geon a day ago

      You can’t expect documentation this early. The new interface was just released.

      • viraptor a day ago

        In serious codebases docs are not an afterthought. There's lots of places where you're expected to add both a new interface and docs together.

      • speed_spread 19 hours ago

        You absolutely should expect documentation this early. The chances of quality documentation being added as an afterthought are not good. If proper documentation isn't part of the original goals after that time, things aren't looking well. Nobody is going to come and just write docs for months.

        • geon 18 hours ago

          Zig is open source, so the docs are pretty much a wiki. You can spend 5 minutes.

      • wordofx a day ago

        So zig isn’t a serious language. It’s just some trash apis thrown together.

        • maxbond 21 hours ago

          It's a serious language, it's just not a stable language yet.

  • 0x696C6961 a day ago

    Writing good docs/examples takes a lot of effort. It would be a waste considering the amount of churn that happens in zig at this point.

    • DannyBee 18 hours ago

      Only in a world where features are made without thought. Documentation is not just for your users. Writing the development documentation helps you make better features in the first place.

      The zig users on this thread seem to not understand this, and all seem to think documentation is a thing you write later for users when everything settles down. Or is somehow otherwise "in the way" of feature and API development speed.

      That is a very strange view.

      If writing developer documentation is having serious affect on your language feature velocity, you are doing something very wrong. Instead, writing it should make things move faster, becuase, at a minimum, others understand what you are trying to do, how it is going to work, and can help. Also, it helps you think through it yourself and whether what you are writing makes any sense, etc.

      Yes there are people who can do this all without documentation, but there are 100x as many who can't, but will still give high quality contributions that will move you along faster if you enable them to help you. Throwing out the ability to have these folks help you is, at a minimum, self-defeating.

      I learned this the hard way, because i'm one of those folks who can just stare at random undocumented messy code and know what it actually does, what the author was probably trying to do, etc, and it took years till i learned most people were not like this.

      • 0x696C6961 18 hours ago

        You're conflating specs/RFCs with end-user documentation.

    • dns_snek 20 hours ago

      That's a false dichotomy, I'll take minimal bitrotten docs in a community wiki over no docs. There's no excuse not to at least have a stub that says "these features are evolving quickly but here are 10 open source projects that should serve as good references".

      Something - anything. As much as I like Zig, I dread returning to it after a few months of being out of the loop.

      • 0x696C6961 18 hours ago

        It's not a false dichotomy, it's a bandwidth issue. I'd rather the core team focus on stuff like incremental compilation.

    • geon a day ago

      Yes. For now, that effort is better spent writing clear test cases that can serve to illustrate the intended usage.

      While tests aren’t quite as good documentation as actual documentation, they are guaranteed to not be out of date.

  • pharrington a day ago

    I'm not a Zig developer, but I imagine one reason why the Zig documentation is so spartan is because the language is still young and constantly evolving. It's really hard to devote the time and energy to writing documentation when you know that what you've written will just be wrong at some uncertain point in the future.

Galanwe a day ago

The Zig's language is really good, but the standard library is really a big work in progress, constantly shifting, missing a lot of bits, overly abstracted at some places and too low level at other places.

I would say just stay away from the standard library for now and use your OS API, unless you're willing to be a beta tester.

  • omgtehlion 18 hours ago

    Yup, exactly how I use zig most of the time: just use good old OS apis, it is very easy to use cImports, when I'm too lazy to create zig definitions )

  • norir 13 hours ago

    From my perspective, Zig is trying to do far too many things to ever reach a baseline of goodness that I consider acceptable. They are in my view quite disrespectful to their users who they force to endure churn at the whims of their dictator. Now that enough people have bought in and accepted that a broken tool is ok so long as it hasn't been blessed with a 1.0 all of its clear flaws can be overlooked in the hope of the coming utopia (spoiler alert: that day will never arrive).

    Personally, I think it is wrong to inflict your experiments on other people and when you pull the rug out from underneath say, well, we told you it was unstable, you should't have depended on us in the first place.

    I don't even understand what zig is supposed to be. Matklad seems to think it is a machine level language: https://lobste.rs/s/ntruuu/lobsters_interview_with_matklad. This contrasts with the official language landing page: Zig is a general-purpose programming language and toolchain for maintaining robust, optimal and reusable software. These two definitions are mutually incompatible. Moreover, zig is clearly not a general purpose language because there are plenty of programming problems where manual memory management is neither needed nor desirable.

    All of this confusion is manifest in zig's instability and bloated standard library. Indeed a huge standard library is incompatible with the claims of simplicity and generality they frequently make. Async is not a feature that can be implemented universally without adding overhead and indirection because of the fundamental differences in capabilities exposed by the various platforms. Again, they are promising a silver bullet even though their prior attempt, in which they publicly proclaimed function coloring to be solved, has been abandoned. Why would we trust them to get it right a second time?

    There are a very small number of assembly primitives that every platform provides that are necessary to implement a compiler. Load/store/mov/inc/jeq/jump and perhaps a few others. Luajit implements its parser in pure assembly and I am not aware of an important platform that luajit runs on that zig goes. I do the vast majority of my programming in lua and _never_ run into bugs in the interpreter. I truly cannot think of a single problem that I think zig would solve better than luajit. Even if that did exist, I could embed the zig code in my lua file and use lua to drive the zig compiler and then call into the specialized code using the lua ffi. But the vast majority of code does not need to be optimized to the level of machine code where it is worth putting up with all of the other headaches that adopting zig will create.

    The hype around zig is truly reaching llm levels of disconnection from reality. Again, to believe in zig, one has to believe it will magically develop capacities that it does not presently have and for which there is no plan to actually execute besides vague plans of just wait.

noobermin 17 hours ago

Having seen the posts about the new IO interface, I decided to steer clear from Zig. Looks like that fortuitious instinct was proven valid as this looks more and more like the verbosity from pre C++11 for different reasons but with a similar result.

This pattern (new language evolves to be as complex as the languages it was supposed to replace) seems familiar.

  • ivanjermakov 7 hours ago

    As being one of the post authors you mentioned, I don't think such posts should scare people from trying it out. Zig team is eager to discuss and break things if a better solution is found.

    Such approach is not a great fit for those who treat Zig as a future job opportunity, but for personal and small-team projects it's _already_ a neat language with clear goals and great tooling.

laserbeam 20 hours ago

I… will not update my zig side projects to 0.15.x. I can see why Andrew wanted to release this, and I can appreciate getting the new Io in people’s hands… but it’s merely a few weeks after merging massive amounts of breaking changes on readers and writers.

For those working on the standard library, it’s a great thing. For one like me who casually uses zig, it feels like waiting for 0.16.0 for most of the IO dust to settle is the right thing to do.

  • debo_ 18 hours ago

    If you're a language called Zig, I guess you sometimes have to Zag.

  • audunw 16 hours ago

    Even Loris Cro one of the Zig core members, mentioned in a very recent interview that he’ll wait for all the fallout of the IO changes to settle before updating and continuing work on his project using Zig.

    The future looks bright after that though. Both Andrew and Loris seem to think this is the last major breaking change, so I hope we can see a 1.0 not too long after. The biggest uncertainty now is what the consequences of (re-)introducing stack-less coroutines will be.

    • Galanwe 14 hours ago

      > Both Andrew and Loris seem to think this is the last major breaking change, so I hope we can see a 1.0 not too long after.

      Well I mean the standard library still needs a _lot_ of work IMHO. Process management for instance is at a stage where it's barely usable for simple use cases.

stop50 a day ago

I have never understood libraries or imterfaces that want me to allocate buffers for their type. I can't parse them (no need for the lib then) or write to them (would probably break the exchange).

The weird interface of go is probably due the fact that some interfaces can be used to extemd the writer like the hijacker interface (ResponseWriter.(http.Hijacker)) and the request object is used multiple times with different middlewares interacting with it. In short: request does not need to be extended, but the response can be an websocket, an wrapped tcp connection or something else.

  • kelnos 20 hours ago

    > I have never understood libraries or imterfaces that want me to allocate buffers for their type.

    That doesn't seem that odd to me. It's a trade off: more flexibility, but more manual work. Maybe I have a buffer that I've allocated that I'm not using anymore (say I have a buffer pool) and want to use it again. If the type allocates its own behind the scenes, I can't do that. Or maybe I'm working in an environment where I need to statically allocate all of my resources up-front, and can't allocate later.

    The big downside is that if 90% of people are just going to allocate a buffer and pass it in, it sucks that 90% of people need to do more work and understand more minutiae when only 10% of the people actually need to. The holy grail is to give lots of flexibility, but make the simple/common case easy.

    A simple improvement to this interface might be to allow the caller to pass a zero-length buffer (or Zig's version of null), and then the type will allocate its own buffer. Of course, there's still a documentation burden so people know they can do that. Another option could be to have second constructor function that takes no buffer arguments at all, which allocates the buffers and passes them to the fully-flexible constructor function.

    • jeroenhd 20 hours ago

      > If the type allocates its own behind the scenes, I can't do that.

      Isn't that the reason why Zig passes around allocators everywhere? If you're using a buffer pool, you should probably be handing out some kind of buffer pool allocator.

      Requiring all allocation to have happened before execution is still a good reason to pass buffers around, but I feel like the other situations you describe can be solved by just passing the right allocators.

  • benreesman a day ago

    It's just a different convention like radians and degrees.

    You can lift/unlift in or out of arbitrary IO, in some languages one direction is called a mock, in other languages the opposite is called unsafeFoo.

    Andrew Kelley independently rediscovered on a live stream 30 years of the best minds in Haskell writing papers.

    So the future is Zig. He got there first.

    • pjmlp a day ago

      Only if use after free story actually gets fixed, and not by repurposing what has already existed in the C and C++ ecosystems for the last 30 years, like PurifyPlus or VC++ debug allocator.

      • benreesman a day ago

        If you mean running clang-tidy as a separate build step or ASAN in a different category than other soundness checks?

        Compute is getting tight, lots of trends, the age of C++ is winding down gracefully. The age of Zig is emerging delibetately, and the stuff in the middle will end up in the same historical trash bin as everything else in the Altman Era: the misfortunes of losing sight of the technology.

    • [removed] 21 hours ago
      [deleted]
    • kllrnohj 18 hours ago

      > So the future is Zig. He got there first.

      The future is many things, but a love letter to C is definitely not it.

      Zig is cute and a fun hobby project that might see above average success for a hobby project. But that's about it. It doesn't address the problems people actually have with C++, not like Rust or Swift do, and it certainly isn't going to attract any attention from the Java, JavaScript, C#, Python, etc... of the world.

      • davemp 4 hours ago

        Zig is not a hobby project.

        > It doesn't address the problems people actually have with C++, not like Rust or Swift do

        Speak for yourself. Zig addresses pretty much all of my problems with C++:

        - terrible compile times - overly complex and still underpowered template/meta programming - fragmented/ancient build tools - actually good enums/tagged unions - exceptions - outdated OOP baggage

        I don’t actually mind C++ that much, but Zig checks pretty much all of my boxes. Rust/swift check some of these but not all and add a few of their own.

        > and it certainly isn't going to attract any attention from the Java, JavaScript, C#, Python, etc... of the world.

        Yeah of course. Zig isn’t trying to be a max ergonomics scripting language…

  • geon a day ago

    Isn’t the whole point of an external buffer that the function won’t need to allocate?

    • [removed] 17 hours ago
      [deleted]
j1elo 19 hours ago

> To convert the Stream.Reader to an std.Io.Reader, we need to call its interface() method. To get a std.io.Writer from an Stream.Writer, we need the address of its &interface field. This doesn't seem particularly consistent.

That made me think of how that change would be received in Go (probably would be discarded). They way they approach changes in extremely deep analysis and taking as much time as it needs to avoid mistakes and reach a consistent solution (or as close as possible).

This has been my favorite for a while: https://github.com/golang/go/issues/45624

4 years to decide on something relatively minor, that right now can be done with a bit of a one-liner extra work. But things need to be well thought out. Inconsistencies are pointed out. Design concerns are raised. Actual code usage in the real world are taken into account... too slow for some people, but I think it's just as slow as it needs to be. The final decision is shaping out to be very nice.

  • josephg 19 hours ago

    Rust is the same. It grinds my goat a little how many useful features are implemented - but only available in nightly rust. Things like generators.

    But when rust ships features to stable, they’re usually pretty well thought through. I’m impatient. But the rust language & compiler teams probably have the right idea.

    • hu3 16 hours ago

      I beg to differ. Rust async implementation is contentious and criticized often. Sometimes you just miss the mark despite pondering about it for a while. Same with Go.

      • josephg 6 hours ago

        Yeah async rust is definitely the exception. That and Pin, which in my opinion totally missed the mark. The feature rust needs is the ability to have self reference in a struct. Pin is a hacky, inadequate half solution.

  • dchest 10 hours ago

    This wasn't exactly the case before Go 1.0 -- it changed quite rapidly, although in a less fundamental way (for example, removing semicolons, changing error types, etc.), and they usually provided an option to transform code automatically.

    It works now that way because they promised it to be stable after 1.0.

JaggerJo a day ago

Zig would be my go to language for low level stuff.

I think fact that Zig can be used as a C/C++ cross compiler is brilliant.

eps a day ago

Sounds mostly like a documentation issue, or the lack of thereof.

  • jeroenhd 19 hours ago

    Because of how many parts of Zig change every other month, writing documentation doesn't seem to be a priority with Zig. The same way the Zig tutorial is just "here's a bunch of examples of Zig code" (that doesn't always compile on the latest version of the compiler), you're expected to read the source code for a lot of Zig standard library definitions.

    For a lot of simple calls, that works out pretty well, once you know all the tricks to Zig's syntax. A lot of requirements and implications are generally written out in very simple and short functions that are often logically named. Things like Allocators are pretty easy conceptually even if you probably don't want to write one yourself.

    It all breaks down when you start dealing with complex concepts. Zig's new I/O system looks a lot like Java's streams and wrappers and readers and writers, all wrapping around each other to make sending encrypted text over a secure channel as simple as output.write("hello").

    I think the new I/O system combined with the lack of documentation about how to use it was a mistake. I'm not even sure if expressing a typing system as complicated as this in the Zig standard library is a good idea. The entire language runs on clear, concise, short and readable methods, and the new system doesn't seem idiomatic in that way.

danieltanfh95 a day ago

its bad because they are mixing what was supposed to just be execution boundaries into the overall runtime engine without making it explicit how to bridge between one and another.

jedisct1 a day ago

The new I/O interface makes printing a simple “Hello, world!” more complicated, but once you get used to it, the design is actually very clean, versatile, and future-proof.

Since 0.15, though, I feel too dumb for Zig’s ArrayList.

  • simonask a day ago

    Is it future-proof though? Last I saw, it relied on some yet-to-be-determined design for compiling async variants of everything that uses IO, and it was still unclear whether it was possible at all to support dynamic dispatch.

    My info could be outdated - I don't follow Zig very closely, but I am curious.

    • kristoff_it 21 hours ago

      The Reader/Writer changes are perfectly compatible with the upcoming async I/O stuff and you won't need to change any code that just deals with streams.

      No promises about potential future changes though :^)

  • throwawaymaths 17 hours ago

    i think hello world is actually easier? getstdout doesnt exist anymore and its equivalent is nonfailable.

[removed] a day ago
[deleted]
8s2ngy a day ago

I’m sorry, but any non-trivial Zig code gives me PTSD flashbacks of C. I don’t understand who Zig is targeting: with pervasive mutability, manual allocation, and a lack of proper sum types, it feels like a step back from languages such as Rust. If it is indeed a different way to write code, one that embraces default memory unsafety, why would I choose it over C, which has decades of work behind it?

Am I missing some context? I’d love to hear it.

  • sothatsit a day ago

    I love Zig precisely because it is so similar to C. Honestly, if you don't like C, I can totally understand why you wouldn't like Zig. But I love C, and I love Zig.

    Zig has become my go-to for projects where I would previously have reached for C, largely because Zig has such good compatibility with other C projects.

    Rust, on the other hand, is a completely different beast. It is very different from C, and it is far more complicated. That makes it harder to justify using, whereas Zig is a very easy choice as an alternative to using C itself.

    • simonask a day ago

      C is entirely as complicated as Rust, if your goal is to write correct software that doesn't crash all the time. It's only a syntactically simple language. Actually making anything interesting with it is _not_ simple.

      • kstenerud 20 hours ago

        Quite right. I have 35 years of C under my belt. I can write it in my sleep.

        But even so, I can't for the life of me write C code that's as safe as Rust. There are just too many ways to make subtle little mistakes here and there, incrementing a typed pointer by a sizeof by mistake thinking it's a uintptr_t, losing track of ownership and getting a use-after-free, messing up atomic access, mutex deadlocks oh my...

        And that's with ALL warnings enabled in CLANG. It's even worse with the default warnings.

      • sothatsit 19 hours ago

        It depends on the project. Most of the projects I write in C are very simple, and getting them to work reliably is really not a problem at all.

        If you are writing more complicated or "interesting" programs, then I agree, C doesn't give you a good set of tools. But if all you are writing is small libraries or utility programs, C is just fine. In these cases, Rust feels like pulling out a sniper rifle to shoot a target a meter in front of your face (i.e., overkill).

        If you are writing complex, large, or very mission-critical programs, then Rust is great to have as a tool as well. But we don't have to take such a black and white view to think that Rust is always the best tool for the job. Or C or Zig or whatever languages for that matter.

      • uecker 16 hours ago

        Most software I use daily on my Linux system is actually written in C and I can't remember any of it crashing in the last decade or so.

  • ozgrakkurt a day ago

    Compared to C:

    Discriminated unions, error handling, comptime, defer.

    Better default integer type casting, ability to choose between releaseSafe/releaseFast

    And probably other things.

    As for comparison to Rust, you do want very low level memory handling for writing databases as an example. It is extremely difficult to write low level libraries in Rust

    • simonask a day ago

      I think the argument is that it is also extremely difficult to write low level libraries in Zig, just as it is in C. You will just only notice the difficulty at some later point after writing the code, potentially in production.

      • flohofwoe a day ago

        > low level libraries in Zig, just as it is in C

        Did you write any Zig code yet? In terms of enforced correctness in the language (e.g. no integer promotion, no implicit 'dangerous' casts, null-safety, enforced error handling, etc...) and runtime safety (range-, nullptr-, integer-overflow-checks etc...), Zig is much closer to Rust than it is to C and C++.

        It "just" doesn't solve static memory safety and some (admittedly important) temporal memory safety issues (aka "use-after-free"), but it still makes it much harder to accidentially trigger memory corruption as a side effect in most situations that C and C++ let slip through via a mix of compile errors and runtime checks (and you get ASAN/UBSAN automatically enabled in debug builds, a debug allocator which detects memory leaks and use-after-free for heap-allocations (unfortunately not for stack allocations), and proper runtime stack traces - things that many C/C++ toolchains are still missing or don't enable by default).

        There is still one notable issue: returning a reference to stack memory from a function - this is something that many unexperienced Zig programmers seem to stumble into, especially since Zig's slice syntax looks so 'innocent' (slices look too similar to arrays, but arrays are values, while slices are references - e.g. 'fat pointers') - and which IMHO needs some sort of solution (either a compile time error via watertight escape analysis, or at least some sort runtime check which panics when trying to access 'stale' data on the stack) - and maybe giving slices their own distinct syntax that doesn't overlap with arrays might also help a bit.

      • kristoff_it 21 hours ago

        > I think the argument is that it is also extremely difficult to write low level libraries in Zig, just as it is in C.

        This has been not my experience at all in the ~6 years I've been writing Zig. I started having very little experience writing C (<1000, lines all written while in university) and since day 1 Zig has been a tremendous improvement over it, even back when it was at version 0.4.0.

        • simonask 20 hours ago

          Glad you're having a great time with it. :-)

          I'm informed by having shipped a lot of C++ code in my time, which has taught me a lot about actually delivering stable software. Being better than C is a very low bar here.

      • ozgrakkurt 14 hours ago

        This is a subjective argument. You don’t know me, I don’t know you. There is no meaning in assuming anything.

        There is plenty of working software written with pretty much any language

    • kstenerud 20 hours ago

      > It is extremely difficult to write low level libraries in Rust

      Really? I've not found it at all difficult to write low level libraries in Rust.

      • ozgrakkurt 14 hours ago

        For me it was very difficult to make an io library on io_uring that is properly safe.

        Also using arena and other special allocators in different sections of the program. While maintaining hard memory limits for different sections of the program.

        These are possible to do in rust but it is very difficult for me so I decided to just not do it. Otherwise I have to spend 5x the normal amount of time to make sure the library cannot be misused by the user ever.

        This is pretty pointless since I’m the only one who is going to use that code anyway.

        Could be skill issue or w/e but I just find zig easier to make progress in

  • flohofwoe a day ago

    > a lack of proper sum types

    Do you consider Rust enums 'proper sum types'? If yes what are Zig's tagged unions missing?

    E.g.:

        const Variant = union(enum) {
            int: i32,
            boolean: bool,
            none,
    
            fn truthy(self: Variant) bool {
                return switch (self) {
                    Variant.int => |x_int| x_int != 0,
                    Variant.boolean => |x_bool| x_bool,
                    Variant.none => false,
                };
            }
        };
  • kllrnohj 15 hours ago

    Zig is for people who want to write C, that's really it. It's not a replacement for C++ or Rust or Go or Swift or anything "serious".

    As for why you would choose it over C, because C has too many problems for even the C lovers to ignore. Zig fixes a tiny amount of them, just enough to pretend it's not problematic, but not enough to be useful in any non-hobby capacity. Which is fine, very few languages do achieve non-hobby status after all.

  • LAC-Tech a day ago

    Zig is a systems programming language. I think that's probably who it's targeting.

    People do systems programming in rust, but that's not really what most of the community is doing. And it's DEFINITELY not what the standard library is designed for.

    • konart a day ago

      >People do systems programming in rust, but that's not really what most of the community is doing.

      As someone who haven't done any systems programming after university: wait, what?

      I was under impression that this is exactly what people where doing with Rust.(system apps, even linux kernel, no?)

      If not - what do they (most if the community) are doing with Rust?

      • LAC-Tech a day ago

        Web servers, games, and applications, that sort of thing.

        Some people definitely do systems programming in, but it's a minority. The std library is not set up for it at all, you need something like rustix, but even that results in very unidiomatic ("unsafe") rust code.

        In Zig it's all in the std library by default. Because it's a systems programming language, first and foremost.

    • simonask a day ago

      Which part of the Rust standard library are you referring to here?

      As far as I can tell, it contains many, many features that are irrelevant outside of systems programming scenarios with highly particular needs.

      • LAC-Tech a day ago

        Let me answer your question with a question - how do you memory map in rust with the standard library?

        In zig it's std.posix.mmap.

xmorse 21 hours ago

If you are too dumb for it I don't have any hope