Hare 0.26.0 Ships: Uninitialized Memory and Error Ignoring Now Explicit
Hare 0.26.0 dropped this week, and the changelog is... interesting. For a language that bills itself as "simple and robust," the two headline features are explicitly about being less safe.
You can now leave memory uninitialized on purpose, and you can ignore errors with the same syntax you'd use to ignore any other return value. One Lobsters commenter put it perfectly: "Maybe I'm missing something obvious, but it seems like two of the main features added in the release make the language more complex and less robust."
What Actually Changed
Hare is a systems language that wants to be C without the footguns. Manual memory management, no NULL pointers (but unrestricted pointers otherwise), Go-style defer statements, and a C FFI that Just Works™ because it's C ABI compatible.
The 0.26.0 release adds:
- Explicit uninitialized memory support
- Error ignoring that looks identical to ignoring regular returns
- Whatever else was in there (the Alpine maintainer upgraded it in edge within 17 hours, so presumably it wasn't breaking)
The Feature Creep Question
Here's the tension: The most simple and robust programming language would have exactly one program that does nothing. Obviously useless. Real languages need escape hatches.
The dev advocate take (via gasche on Lobsters): Start extremely simple and robust, then gradually add less-safe features only when their absence genuinely hurts usability. Better than starting permissive and trying to remove features later.
The pessimist take: This is how every "simple" language dies. Death by a thousand reasonable exceptions.
What Hare Actually Is
For the PL theory folks who just want the spec sheet:
- Lexically scoped, imperative, procedural
- Product types (structs) and sum types (tagged unions)
- Unrestricted but guaranteed non-NULL pointers
- Namespaces and Go-style
defer - Functions are closed (top-level only, no lambdas)
- Manual memory management, no static soundness guarantees
- Seamless C FFI
One user described it as feeling "quite close to its goal with error handling, but lacks a language-level construct for managing resources." Linear types maybe? The language is usable as-is, but there's a sense it could be more.
The Verdict
Hare is in that awkward adolescent phase where it's mature enough to have users (hello, Alpine Linux edge) but young enough that every release potentially defines its future identity.
0.26.0 might be smart pragmatism—recognizing that systems programmers sometimes need uninitialized memory and error ignoring, so make it explicit instead of forcing unsafe workarounds. Or it might be the first step toward "simple and robust*" with an expanding list of asterisks.
Either way, watching a language navigate this tradeoff in real-time is lowkey fascinating. The simplicity/robustness versus expressiveness/efficiency tension isn't theoretical here—it's playing out in semver releases.
The Alpine maintainer had it upgraded in 17 hours. That's either confidence or chaos. Possibly both.