Four Months of Zig

(gracefulliberty.com)

46 points | by ibobev 3 hours ago

7 comments

  • 22c 0 minutes ago
    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.

  • i2talics 13 minutes ago
    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.

    • awesan 8 minutes ago
      It is a good default for lib code because it makes that code truly re-usable. The same is true for great C libraries, they let you provide a block of memory instead of calling malloc inside. The library should not get to decide if/when allocations should be done.

      In Zig app code you don't have to pass allocators all over if you don't want to, that's your code so do what you want. But for libraries it's the right thing to do because it puts the caller in control.

      The reason you have to pass allocators instead of making this implicit like in e.g. Odin, is because Zig just takes a firm stance against implicit logic, firmer than any other language I've ever used. The end result is that people who like Zig tend to like passing allocators around even in their own code.

  • Atlas48 38 minutes ago
    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.
  • michidk 34 minutes ago
    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.
  • paaloeye 1 hour ago
    Does ReTangled have anything to do with https://tangled.org?
    • contact9879 23 minutes ago
      it’s hyperlinked to the repo where you can see it has nothing to do with tangled
      • paaloeye 9 minutes ago
        I know but the name is so sus
  • LoganDark 1 hour ago
    > 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 :)

    • Graziano_M 1 hour ago
      I think you're proving the author's point.
      • GreenDolphinSys 1 hour ago
        They're saying that you don't always have to return Result<T, Box<dyn Error>>, you can implement the From<Error> trait on the type and use ? as usual.

        In other words implementing that trait lets you set a return type like Result<T, CustomAppError> use ? on it.

        • LoganDark 1 hour ago
          I think they're saying the author's point is that it's more fiddly in Rust (even if there are strong, well-regarded fiddles to use)
          • Graziano_M 1 hour ago
            Yes, and your other part about the crate.

            > There's also Zig-style composable errors with yet another library.

            • LoganDark 1 hour ago
              Ah, it's behind a link!

              While I'd push back against implying From<E2> is part of the crate, thiserror is an idiomatic approach these days, so I can understand the confusion. I can totally see how they could come to favor Zig if this behavior is "the default", as opposed to Rust where you'd usually see it done with "yet another library".

              And so I see "the author's point" has another meaning now: that Zig-style errors are good :)

              Edit: oh, after looking into Zig-style errors more, this is actually not how they work! They don't nest, they just exist in a global namespace, so they don't come with any location data themselves, but you can compose sets of them. Less powerful, but certainly more appealing to some :) I think out-parameters can be used as a side channel for error context.

              • Graziano_M 54 minutes ago
                Yeah I 1. wish they were properly composable and 2. think Rust would get less flak if these 'idiomatic' crates were just pulled into the standard library to avoid some of the dependency mayhem.
          • GreenDolphinSys 52 minutes ago
            I don't think errors are fiddly in rust. They're easy to compose.
      • tcfhgj 1 hour ago
        how so?
  • paaloeye 2 hours ago
    $curl: (6) Could not resolve host: gracefulliberty.com HN effect?