Comment by stop50

Comment by stop50 a day ago

42 replies

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 a day 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 a day 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.

      • pjmlp a day ago

        I mean those and other ones, we already have enough unsafe languages as it is.

        The age of C++ is going great, despite all its warts and unsafety, thanks to compiler frameworks like GCC and LLVM, games industry, GPGPU and Khronos APIs.

        Even if C++ loses everywhere else, it has enough industry mindshare to keep being relevant.

        Same applies to C, in the context of UNIX clones, POSIX, Khronos, embedded.

        Being like Modula-2 or Object Pascal in safety, in C like syntax, isn't enough.

      • wolvesechoes a day ago

        > The age of Zig is emerging delibetately

        Pet projects are nice, but slow down with the copium intake.

  • [removed] a day ago
    [deleted]
  • kllrnohj a day 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 13 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] a day ago
    [deleted]