<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: matklad</title><link>https://news.ycombinator.com/user?id=matklad</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sun, 01 Nov 2026 14:32:42 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=matklad" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by matklad in "Rust Glancer: Rust LSP using 100x less RAM"]]></title><description><![CDATA[
<p>The goal always was to refactor rustc to make compiler-based LSP feasible. The idea of original RLS, "we'll just use the compiler", is fundamentally sound. It's just that you'll need to turn the compiler sideways to achieve that, which is a hard work to motivate without having a real example demonstrating the benefits (or having political clout in the project to just mandate that ^^)</p>
]]></description><pubDate>Sat, 22 Aug 2026 09:54:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=49398176</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=49398176</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49398176</guid></item><item><title><![CDATA[New comment by matklad in "Rust Glancer: Rust LSP using 100x less RAM"]]></title><description><![CDATA[
<p>I can shed some light here! This is going to be longish comment, but hopefully by the end of it you should understand _why_ we decided to avoid using the disk initially, even if you don't agree with that decision.<p>Historically, the decision to not use disk traces back to this comment <a href="https://github.com/rust-lang/rfcs/pull/1317#issuecomment-150965895" rel="nofollow">https://github.com/rust-lang/rfcs/pull/1317#issuecomment-150...</a>, which is perhaps the single GitHub comment that influenced my life most. Very high impact, thanks dgrunwald! Specifically,<p>>Don't store anything to disk. It's likely the oracle can be fast enough without doing this; and unnecessary complexity creates bugs. "Have you tried deleting the .ncb file?" (I remember having to do this a couple times per day when using VS, ca. 2005)<p>>Use lazy evaluation. The IDE is only interested in very specific bits of information, almost always restricted to a couple of lines around the cursor. Avoid calculating stuff that might never get used before it gets invalidated by the next code change.<p>>At least for C#, laziness saves so much time that incremental compilation is unnecessary for IDE purposes<p>The other part of historical context was that the motivation for creating rust-analyzer was that I didn't want to write a second Rust compiler (having been doing that for a couple of years at JetBrains). So it was explicitly an experimental project to prototype the right architecture for an IDE, to ultimately change how rustc works internally, so that, down the line, an IDE and a command-line compiler could use the same core. Given that rust-analyzer is now effectively a separate rust compiler, it's safe to say I am not good at achieving my life's goals!<p>In that context, I believe that avoiding disk was the _right_ decision:<p>* It's not really germane to the problem space, if all you need is literally a cache, it can always be added later.<p>* Disk is a can of worms of data consistency problems. They can be overcome with engineering effort to ultimately give better user experience, but user experience wasn't the primary goal. And using disk wouldn't actually illuminate the interesting aspects of the architecture, the intended primary goal.<p>* Finally, _not_ using disk would be a forcing function to keep analysis fast enough, to not make startup prohibitive.<p>The last one was a particularly big argument in my mind --- I didn't want to reach out for "easy" solutions prematurely, to avoid avoiding hard problems. And, again, my recollection is probably not 100% correct, but, until we added support for proc macros and build scripts, it was fine-ish from the perspective of startup time (RAM usage is a different story). The problem with proc_macros and build.rs is that they need to run the rust code, so they have to run the real rustc compiler, so all our usual IDE tricks ("information ... restricted to a couple of lines around the cursor") just don't apply.<p>The reason why we didn't add it later was that it seemed a relatively lower priority task than the work to share the parser between rust-analyzer and rustc. So that's what I was focusing on, though, I didn't deliver that. I still think we should do it! There's no _insurmountable_ technical reasons why the parsers can't be shared!  It's just (a lot of) engineering work. And, while the parser is the boring part of compiler, it's the interesting part of an IDE.<p>Anyway, that explains how we ended up where we are.<p>That being said, I don't think that "just adding disk cache" is the right approach --- the salsa in-memory data structure is very sparse and pointy. Dumping that to disk would help somewhat, but wouldn't be a great long term solution. What is needed (I also explain this in <a href="https://matklad.github.io/2026/08/21/rust-glancer.html" rel="nofollow">https://matklad.github.io/2026/08/21/rust-glancer.html</a>) is to design a compact, first class data format for representing analysis information about the crate, and than teaching rust-analyzer to be polymorphic in the source of data. For current workspace, you want to use a lazy incremental in-memory data structure (I do think we sadly need incrementally for Rust, given its compilation unit structure). For dependencies, you want to work off a compact on disk index. And, if the user "goes to definition" and mutates its file in place, we want to transparently switch between the two. The _pre requisite_ for that was to define a backend agnostic analysis API, and that work was always slowly progressing in the background (<a href="https://hackmd.io/ytd82QNiT_Ku2XFr1EAtiQ" rel="nofollow">https://hackmd.io/ytd82QNiT_Ku2XFr1EAtiQ</a>), but it generally took the backseat, while sharing the parser was the main focus.</p>
]]></description><pubDate>Sat, 22 Aug 2026 09:34:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=49398067</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=49398067</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49398067</guid></item><item><title><![CDATA[New comment by matklad in "Rust Glancer: Rust LSP using 100x less RAM"]]></title><description><![CDATA[
<p>To clarify, author is <a href="https://github.com/popzxc" rel="nofollow">https://github.com/popzxc</a>, not me! My thoughts are here: <a href="https://matklad.github.io/2026/08/21/rust-glancer.html" rel="nofollow">https://matklad.github.io/2026/08/21/rust-glancer.html</a></p>
]]></description><pubDate>Fri, 21 Aug 2026 19:52:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=49393068</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=49393068</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49393068</guid></item><item><title><![CDATA[Rust Glancer: Rust LSP using 100x less RAM]]></title><description><![CDATA[
<p><a href="https://matklad.github.io/2026/08/21/rust-glancer.html" rel="nofollow">https://matklad.github.io/2026/08/21/rust-glancer.html</a></p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=49393052">https://news.ycombinator.com/item?id=49393052</a></p>
<p>Points: 423</p>
<p># Comments: 112</p>
]]></description><pubDate>Fri, 21 Aug 2026 19:51:54 +0000</pubDate><link>https://rust-glancer.github.io/blog/hello-world/</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=49393052</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49393052</guid></item><item><title><![CDATA[New comment by matklad in "Rewriting Bun in Rust"]]></title><description><![CDATA[
<p>Some thoughts on this here: <a href="https://matklad.github.io/2025/12/23/static-allocation-compilers.html" rel="nofollow">https://matklad.github.io/2025/12/23/static-allocation-compi...</a></p>
]]></description><pubDate>Thu, 09 Jul 2026 13:01:04 +0000</pubDate><link>https://news.ycombinator.com/item?id=48845157</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=48845157</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48845157</guid></item><item><title><![CDATA[New comment by matklad in "Rewriting Bun in Rust"]]></title><description><![CDATA[
<p>To add more context around lifetime errors and TigerBeetle's particular style guide:<p>>Many projects opt to answer these kinds of questions through a style guide. TigerBeetle's TigerStyle is an example in Zig and Google's 31,000 word C++ style guide is another. The challenge with style guides is enforcement.<p>TigerStyle[1] is a bit more than just a style guide. The key rule for this discussion, uplifted straight from of NASA[2], is *static memory allocation*: all memory is allocated  in the startup phase, and there's absolutely zero  `alloc`s afterwrads . This plus crash only[3] design means that we never call `free`.<p>This rule is self-enforcing and compositional, in Zig. There's no global memory allocator, so the code after startup simply hasn't the API to allocate. You can't circumvent this by accident. Of course, if the programmer is byzantine, they can stuff allocator in the global, or just directly `mmap` and `unmap` pages of memory, but, at our scale, we don't have problems with that. This is a similar in kind (not degree) to Rust, where untrusted code generally can circumvent safety guarantees, even without literally spelling `unsafe`.<p>And, naturally, never `free`ing goes a long way towards solving many memory errors by construction. Empirically, they just haven't been a problem for TigerBeetle. It's hard to untangle contribution of static allocation in particular from everything else we are doing, but it would make sense for it to play a leading role.<p>(As a footnote, we aren't actually do static allocation to avoid memory errors, we use it as a linter to check that every quantity has a known _logical_ static limit, the main property we care about)<p>[1]: <a href="https://github.com/tigerbeetle/tigerbeetle/blob/main/docs/TIGER_STYLE.md" rel="nofollow">https://github.com/tigerbeetle/tigerbeetle/blob/main/docs/TI...</a><p>[2]: <a href="https://spinroot.com/gerard/pdf/P10.pdf" rel="nofollow">https://spinroot.com/gerard/pdf/P10.pdf</a><p>[3]: <a href="https://www.usenix.org/legacy/events/hotos03/tech/full_papers/candea/candea_html/index.html" rel="nofollow">https://www.usenix.org/legacy/events/hotos03/tech/full_paper...</a></p>
]]></description><pubDate>Thu, 09 Jul 2026 08:51:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=48842897</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=48842897</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48842897</guid></item><item><title><![CDATA[New comment by matklad in "Rewrite Bun in Rust has been merged"]]></title><description><![CDATA[
<p>To clarify, those are things an LLM considers to be issues, and LLMs can make mistakes.<p>Some of those are clear false positives, others I need to revisit tomorrow to say one way or another.</p>
]]></description><pubDate>Fri, 15 May 2026 00:36:40 +0000</pubDate><link>https://news.ycombinator.com/item?id=48143056</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=48143056</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48143056</guid></item><item><title><![CDATA[Automation That Screams Joy]]></title><description><![CDATA[
<p>Article URL: <a href="https://tigerbeetle.com/blog/2026-04-14-automation-screams-joy/">https://tigerbeetle.com/blog/2026-04-14-automation-screams-joy/</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=47764587">https://news.ycombinator.com/item?id=47764587</a></p>
<p>Points: 9</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 14 Apr 2026 12:12:35 +0000</pubDate><link>https://tigerbeetle.com/blog/2026-04-14-automation-screams-joy/</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=47764587</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47764587</guid></item><item><title><![CDATA[New comment by matklad in "Index, Count, Offset, Size"]]></title><description><![CDATA[
<p>Ha! I also use `line_number = line_index + 1` convention!</p>
]]></description><pubDate>Sat, 21 Feb 2026 13:37:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=47100722</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=47100722</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47100722</guid></item><item><title><![CDATA[New comment by matklad in "Make.ts"]]></title><description><![CDATA[
<p>Thanks, I haven't considered this! My history is usually naturally project-scoped, but I bet I'll find ~/make.ts useful now that I have it!</p>
]]></description><pubDate>Wed, 28 Jan 2026 10:59:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=46793760</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=46793760</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46793760</guid></item><item><title><![CDATA[New comment by matklad in "Parsing Advances"]]></title><description><![CDATA[
<p>I assume you ment to write `assert(subexpression != undefined)`?<p>This is resilient parsing --- we are parsing source code with syntax errors, but still want to produce a best-effort syntax tree. Although expression is required by the grammar, the `expression` function might still return nothing if the user typed some garbage there instead of a valid expression.<p>However, even if we return nothing due to garbage, there are two possible behaviors:<p>* We can consume no tokens, making a guess that what looks like "garbage" from the perspective of expression parser is actually a start of next larger syntax construct:<p>```
function f() {
    let x = foo(1, 
    let not_garbage = 92;
}
```<p>In this example, it would be smart to _not_ consume `let` when parsing `foo(`'s arglist.<p>* Alternatively, we can consume some tokens, guessing that the user _meant_ to write an expression there<p>```
function f() {
  let x = foo(1, /);
}
```<p>In the above example, it would be smart to skip over `/`.</p>
]]></description><pubDate>Wed, 31 Dec 2025 15:48:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=46445148</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=46445148</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46445148</guid></item><item><title><![CDATA[New comment by matklad in "Static Allocation with Zig"]]></title><description><![CDATA[
<p>In<p><pre><code>    const recv_buffers = try ByteArrayPool.init(gpa, config.connections_max, recv_size);
    const send_buffers = try ByteArrayPool.init(gpa, config.connections_max, send_size);
</code></pre>
if the second try throws, than the memory allocation created by the first try is leaked. Possible fixes:<p>A) clean up individual allocations on failure:<p><pre><code>    const recv_buffers = try ByteArrayPool.init(gpa, config.connections_max, recv_size);
    errdefer recv_buffers.deinit(gpa);

    const send_buffers = try ByteArrayPool.init(gpa, config.connections_max, send_size);
    errdefer send_buffers.deinit(gpa);
</code></pre>
B) ask the caller to pass in an arena instead of gpa to do bulk cleanup (types & code stays the same, but naming & contract changes):<p><pre><code>    const recv_buffers = try ByteArrayPool.init(arena, config.connections_max, recv_size);
    const send_buffers = try ByteArrayPool.init(arena, config.connections_max, send_size);
</code></pre>
C) declare OOMs to be fatal errors<p><pre><code>    const recv_buffers = ByteArrayPool.init(gpa, config.connections_max, recv_size) catch |err| oom(err);
    const send_buffers = ByteArrayPool.init(gpa, config.connections_max, send_size) catch |err| oom(err);

    fn oom(_: error.OutOfMemory) noreturn { @panic("oom"); }
</code></pre>
You might also be interesting in <a href="https://matklad.github.io/2025/12/23/static-allocation-compilers.html" rel="nofollow">https://matklad.github.io/2025/12/23/static-allocation-compi...</a>, it's essentially a complimentary article to what @MatthiasPortzel says here <a href="https://news.ycombinator.com/item?id=46423691">https://news.ycombinator.com/item?id=46423691</a></p>
]]></description><pubDate>Tue, 30 Dec 2025 16:47:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=46435137</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=46435137</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46435137</guid></item><item><title><![CDATA[New comment by matklad in "Static Allocation with Zig"]]></title><description><![CDATA[
<p>>If you look at MITRE's top 25 most dangerous software weaknesses, the top four (in the 2025 list) aren't related to UB in any language (by the way, UAF is #7).<p>FWIW, I don't find this argument logically sound, in context. This is data aggregated across programming languages, so it could simultaneously be true that, conditioned on using memory unsafe language, you should worry mostly about UB, while, at the same time, UB doesn't matter much in the grand scheme of things, because hardly anyone is using memory-unsafe programming languages.<p>There were reports from Apple, Google, Microsoft and Mozilla about vulnerabilities in browsers/OS (so, C++ stuff), and I think there UB hovered at between 50% and 80% of all security issues?<p>And the present discussion does seem overall conditioned on using a manually-memory-managed language :0)</p>
]]></description><pubDate>Tue, 30 Dec 2025 01:47:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=46428544</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=46428544</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46428544</guid></item><item><title><![CDATA[New comment by matklad in "Static Allocation with Zig"]]></title><description><![CDATA[
<p>They do make a lot of sense in other contexts :-) From the actual rules, only #2 (minimize preprocessor) and #10 (compiler warnings) are C specific. Everything else is more-or-less universally applicable.</p>
]]></description><pubDate>Mon, 29 Dec 2025 21:33:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=46425985</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=46425985</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46425985</guid></item><item><title><![CDATA[New comment by matklad in "Static Allocation with Zig"]]></title><description><![CDATA[
<p>There's some reshuffling of bugs for sure, but, from my experience, there's also a very noticeable reduction! It seems there's no law of conservation of bugs.<p>I would say the main effect here is that global allocator often leads to ad-hoc, "shotgun" resource management all other the place, and that's hard to get right in a manually memory managed language. Most Zig code that deals with allocators has resource management bugs (including TigerBeetle's own code at times! Shoutout to <a href="https://github.com/radarroark/xit" rel="nofollow">https://github.com/radarroark/xit</a> as the only code base I've seen so far where finding such bug wasn't trivial). E.g., in OP, memory is leaked on allocation failures.<p>But if you manage resources manually, you just can't do that, you are forced to centralize the codepaths that deal with resource acquisition and release, and that drastically reduces the amount of bug prone code. You _could_ apply the same philosophy to allocating code, but static allocation _forces_ you to do that.<p>The secondary effect is that you tend to just more explicitly think about resources, and more proactively assert application-level invariants. A good example here would be compaction code, which juggles a bunch of blocks, and each block's lifetime is tracked both externally:<p>* <a href="https://github.com/tigerbeetle/tigerbeetle/blob/0baa07d3bee71df7f5ea8b86585c7787bbdae0ff/src/lsm/compaction.zig#L407-L453" rel="nofollow">https://github.com/tigerbeetle/tigerbeetle/blob/0baa07d3bee7...</a><p>and internally:<p>* <a href="https://github.com/tigerbeetle/tigerbeetle/blob/0baa07d3bee71df7f5ea8b86585c7787bbdae0ff/src/lsm/compaction.zig#L127-L148" rel="nofollow">https://github.com/tigerbeetle/tigerbeetle/blob/0baa07d3bee7...</a><p>with a bunch of assertions all other the place to triple check that each block is accounted for and is where it is expected to be<p><a href="https://github.com/tigerbeetle/tigerbeetle/blob/0baa07d3bee71df7f5ea8b86585c7787bbdae0ff/src/lsm/compaction.zig#L1065-L1067" rel="nofollow">https://github.com/tigerbeetle/tigerbeetle/blob/0baa07d3bee7...</a><p>I see a weak connection with proofs here. When you are coding with static resources, you generally have to make informal "proofs" that you actually have the resource you are planning to use, and these proofs are materialized as a web of interlocking asserts, and the web works only when it is correct in whole. With global allocation, you can always materialize fresh resources out of thin air, so nothing forces you to do such web-of-proofs.<p>To more explicitly set the context here: the fact that this works for TigerBeetle of course doesn't mean that this generalizes, _but_, given that we had a disproportionate amount of bugs in small amount of gpa-using code we have, makes me think that there's something more here than just TB's house style.</p>
]]></description><pubDate>Mon, 29 Dec 2025 21:05:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=46425673</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=46425673</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46425673</guid></item><item><title><![CDATA[New comment by matklad in "Static Allocation with Zig"]]></title><description><![CDATA[
<p>See <a href="https://github.com/tigerbeetle/tigerbeetle/blob/main/docs/TIGER_STYLE.md#:~:text=understanding%20of%20code.-,All%20memory,-must%20be%20statically" rel="nofollow">https://github.com/tigerbeetle/tigerbeetle/blob/main/docs/TI...</a> for motivation.<p>- Operational predictability --- latencies stay put, the risk of threshing is reduced (_other_ applications on the box can still misbehave, but you are probably using a dedicated box for a key database)<p>- Forcing function to avoid use-after-free. Zig doesn't have a borrow checker, so you need something else in its place. Static allocation is a large part of TigerBeetle's something else.<p>- Forcing function to ensure existence of application-level limits. This is tricky to explain, but static allocation is a _consequence_ of everything else being limited. And having everything limited helps ensure smooth operations when the load approaches deployment limit.<p>- Code simplification. Surprisingly, static allocation is just easier than dynamic. It has the same "anti-soup-of-pointers" property as Rust's borrow checker.</p>
]]></description><pubDate>Mon, 29 Dec 2025 19:20:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=46424316</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=46424316</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46424316</guid></item><item><title><![CDATA[New comment by matklad in "Static Allocation with Zig"]]></title><description><![CDATA[
<p>To add more context, TigerStyle is quite a bit more than just static allocation, and it indeed explicitly attributes earlier work:<p>> NASA's Power of Ten — Rules for Developing Safety Critical Code will change the way you code forever. To expand:<p>* <a href="https://github.com/tigerbeetle/tigerbeetle/blob/main/docs/TIGER_STYLE.md#safety" rel="nofollow">https://github.com/tigerbeetle/tigerbeetle/blob/main/docs/TI...</a><p>* <a href="https://spinroot.com/gerard/pdf/P10.pdf" rel="nofollow">https://spinroot.com/gerard/pdf/P10.pdf</a></p>
]]></description><pubDate>Mon, 29 Dec 2025 19:12:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=46424220</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=46424220</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46424220</guid></item><item><title><![CDATA[New comment by matklad in "Static Allocation with Zig"]]></title><description><![CDATA[
<p>Yes, very good point, thanks!<p>As a tiny nit, TigerBeetle isn't _file system_ backed database, we intentionally limit ourselves to a single "file", and can work with a raw block device or partition, without file system involvement.</p>
]]></description><pubDate>Mon, 29 Dec 2025 19:03:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=46424101</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=46424101</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46424101</guid></item><item><title><![CDATA[New comment by matklad in "TigerBeetle as a File Storage"]]></title><description><![CDATA[
<p>It is the other way around --- it is _relatively_ easy to re-use the storage engine, but plug your custom state machine (implemented in Zig). We have two state machines, an accounting one, and a simple echo one here: <a href="https://github.com/tigerbeetle/tigerbeetle/blob/main/src/testing/state_machine.zig" rel="nofollow">https://github.com/tigerbeetle/tigerbeetle/blob/main/src/tes...</a>.<p>I am not aware of any "serious" state machine other than accounting one though.</p>
]]></description><pubDate>Sun, 14 Dec 2025 01:55:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=46260164</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=46260164</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46260164</guid></item><item><title><![CDATA[New comment by matklad in "Synadia and TigerBeetle Pledge $512k to the Zig Software Foundation"]]></title><description><![CDATA[
<p>It's not that ironic though --- the number of bugs that were squashed fuzzers&asserts but would have dodged the borrow checker is much, much larger.<p>This is what makes TigerBeetle context somewhat special --- in many scenarios, security provided by memory safety is good enough, and any residual correctness bugs/panics are not a big deal. For us, we need to go extra N miles to catch the rest of the bugs as well, and DST is a much finer net for those fishes (given static allocation & single threaded design).</p>
]]></description><pubDate>Fri, 05 Dec 2025 21:24:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=46167512</link><dc:creator>matklad</dc:creator><comments>https://news.ycombinator.com/item?id=46167512</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46167512</guid></item></channel></rss>