<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: jstimpfle</title><link>https://news.ycombinator.com/user?id=jstimpfle</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 04 Jun 2026 22:15:25 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=jstimpfle" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by jstimpfle in "Using Git's rerere feature to escape recurring conflict hell"]]></title><description><![CDATA[
<p>Rebasing all the time will most likely result in intermediate commits that don't build anymore (because who builds all the intermediate commits after a rebase), and which don't make sense anymore as a "history" of changes.<p>So my simple resolution has become: don't rebase anything beyond trivial. I use rebase -i to merge, delete, or reorder individual commits on an insolated feature branch. Anything else? Not worth the effort in my opinion. Just merge, in any direction. I even merge between feature branches sometimes, though one must be aware that this essentially glues the two feature branches, meaning either both or none can get merged to master.<p>Something worth stressing: The most important commit is always the one HEAD points to. Older commits don't matter so much to the degree that cleaning them up later is wasted time. The most value of git commit graph comes as a support structure for git merge. In most cases, nobody gives a shit that all intermediate commits are perfect for some definition of "perfect". Most commits will never be read again.</p>
]]></description><pubDate>Tue, 02 Jun 2026 10:13:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=48368215</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48368215</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48368215</guid></item><item><title><![CDATA[New comment by jstimpfle in "Restartable Sequences"]]></title><description><![CDATA[
<p>I think it wasn't explained in a very accessible way. If I got the gist right, this essentially brings "per-CPU" synchronization to userland. It's typical in the kernel to have per-cpu data, while per-thread data is rare and typically impractical. There is a high number of threads managed by the kernel, most of which probably belong to a userland process, most of which do not participate in any given synchronisation scheme. Also threads are often too much of an abstraction for parallel programming needs, given that they are hiding for example cache effects. So it's natural to want to use per-cpu data instead of thread_local data in a userland process, I know I've been wishing for that many times.<p>With rseq, we can allocate in any userland process one instance of a given synchronisation data structure per each CPU. It's important to understand that userland code accessing per-cpu data structures cannot prevent being scheduled away from a CPU and being replaced by another thread (kernel code can block scheduler for short critical sections). Such a replacement thread may subsequently corrupt that same data that was still in the middle of the transaction. But we can make a subset of transactions safe at least: If a transaction gets committed in a single (final) atomic instruction, and we get kernel support for this transaction to be restarted in case there has been a schedule mid-way, this is a guarantee that at the time of commit, the entire transaction hasn't been interrupted by the scheduler. I.e. a kind of "mutual exclusion" guarantee.<p>Did I get that right?</p>
]]></description><pubDate>Sun, 31 May 2026 22:55:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=48350563</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48350563</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48350563</guid></item><item><title><![CDATA[New comment by jstimpfle in "Zig ELF Linker Improvements Devlog"]]></title><description><![CDATA[
<p>What is the compile and link perfomance that you get then? Numbers on table... I know that even with MSVC, single file rebuild+link of C code at about 100 KLOC/second should be well possible.<p>You keep posting about obscure products like whatever UML Editor that noone cares about, why would I listen to what they say, and why do you not even link anything to look up?</p>
]]></description><pubDate>Sun, 31 May 2026 21:23:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=48349893</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48349893</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48349893</guid></item><item><title><![CDATA[New comment by jstimpfle in "Performance of Rust Language [pdf]"]]></title><description><![CDATA[
<p>Congratulations, empty marketing speech, not reacting to what I say.</p>
]]></description><pubDate>Wed, 27 May 2026 16:57:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=48297058</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48297058</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48297058</guid></item><item><title><![CDATA[New comment by jstimpfle in "Performance of Rust Language [pdf]"]]></title><description><![CDATA[
<p>Why are you unable to get my point? I understand that GCC doesn't compile with plain C compiler anymore. A lot of my own code doesn't!<p>I'm saying that most of features like templates, constexpr, reflection etc. don't scale well to serious use, as a broad statement. I fully acknowledge this is not a black and white situation. But I encourage you to look at actual pedestrian code, it's mostly not abstracted fluffy magic template code at all. It's pushing individual bytes with totally basic means (mostly C code). Why? Because code using these fluffy features is terribly hard to maintain. Templates lock you in their own language world with incredibly bad syntax and bad ergonomics, in short: it's a pain!<p>Personally I think even C++ classes (i.e. 1980's C++) are unusable because they bifurcate syntax/semantics needlessly and add implicit invisible scope. But I acknowledge it's somewhat possible to program with classes, and some people like to lean on RAII heavily. I mostly do not like to use RAII, and I've tried many times, I think it sucks for non-toy programming, even though obviously the idea is intuitive.</p>
]]></description><pubDate>Wed, 27 May 2026 11:03:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=48292353</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48292353</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48292353</guid></item><item><title><![CDATA[New comment by jstimpfle in "Performance of Rust Language [pdf]"]]></title><description><![CDATA[
<p>Actually care to open GCC and see what I mean? Check the newest commits and see what they do. Maybe you're living in a dream world where some magic language features do the work for you. Meanwhile people out in the field do actual work by just pushing bytes at the low level.</p>
]]></description><pubDate>Wed, 27 May 2026 09:21:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=48291699</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48291699</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48291699</guid></item><item><title><![CDATA[New comment by jstimpfle in "Performance of Rust Language [pdf]"]]></title><description><![CDATA[
<p>You must be talking about Linux, the BSDs, sqlite, postgres, gcc, the mold linker, or let's take some new kids on the block: raddebugger, FilePilot, TaskSlinger?</p>
]]></description><pubDate>Wed, 27 May 2026 09:11:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=48291620</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48291620</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48291620</guid></item><item><title><![CDATA[New comment by jstimpfle in "Performance of Rust Language [pdf]"]]></title><description><![CDATA[
<p>I said, I avoid, I don't love, I was talking about preference. And I'll state: Most of these are written mostly like I say. Please find serious counter-examples.</p>
]]></description><pubDate>Wed, 27 May 2026 09:06:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=48291593</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48291593</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48291593</guid></item><item><title><![CDATA[New comment by jstimpfle in "Performance of Rust Language [pdf]"]]></title><description><![CDATA[
<p>I think they're all ideas that are relatively obvious intuitive responses to the problem, and yet they may only incrase complexity tbh. For example, constexpr can be used relatively independent of template programming even, yet where they can be used practically before it becomes an unmaintainable mess of boilerplate are the most trivial cases, almost those which you could have hacked in with macros. TBF I think if you need serious metaprogramming, just compile and run a program at compile time.<p>Reflection has always been a mess no matter which implementation or language I've used. Fine for scripting languages, unusable for anything serious complex. The data you need is never there, and the data that is there is unusable, at the wrong semantic level (programming language level not what actually your own domain model semantics).<p>Also I avoid templates for the same reason, they're quickly becoming unmaintainable. Yes, I've tried to make use of them many times, and I have a fair number of them in deployed software. They work without bugs, of course. But I still don't love them, they're boilerplatey hard to maintain complexity that would be better solved with the right factoring plus a tiny bit of ad-hoc boilerplate. I would like to remove many of my deployed templates if I had the time.<p>And yes, I even avoid std:: template containers and such. Most uses I regret later. Again, this is for systems programming. They're fine for "scripting", leetcode, business software.</p>
]]></description><pubDate>Wed, 27 May 2026 08:32:11 +0000</pubDate><link>https://news.ycombinator.com/item?id=48291368</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48291368</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48291368</guid></item><item><title><![CDATA[New comment by jstimpfle in "C constructs that still don't work in C++"]]></title><description><![CDATA[
<p>Systems programming is not primarily about programming languages though...</p>
]]></description><pubDate>Tue, 26 May 2026 10:31:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=48277742</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48277742</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48277742</guid></item><item><title><![CDATA[New comment by jstimpfle in "C extensions, portability, and alternative compilers"]]></title><description><![CDATA[
<p>Wasn't aware of preprocessor conformity issues, good to know!</p>
]]></description><pubDate>Tue, 26 May 2026 10:31:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=48277737</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48277737</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48277737</guid></item><item><title><![CDATA[New comment by jstimpfle in "C extensions, portability, and alternative compilers"]]></title><description><![CDATA[
<p>What do you even miss, honestly works fine for me? In terms of platform APIs, I prefer the Windows ones on Windows anyway</p>
]]></description><pubDate>Mon, 25 May 2026 20:12:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=48271126</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48271126</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48271126</guid></item><item><title><![CDATA[New comment by jstimpfle in "C constructs that still don't work in C++"]]></title><description><![CDATA[
<p>Most of these methods and ideas turned out to not work, neither in messy C libraries, nor in C++ or other languages.</p>
]]></description><pubDate>Mon, 25 May 2026 12:24:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=48266029</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48266029</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48266029</guid></item><item><title><![CDATA[New comment by jstimpfle in "C constructs that still don't work in C++"]]></title><description><![CDATA[
<p>such a strawman again... You don't want to be writing explicit platform specific SIMD most of the time. You just want to write a dumb function that doesn't do any non-obvious calls, doesn't cause thread contention, doesn't hide complexity, isn't going to be a nightmare to change later, no surprises.<p>I am talking about self-inflicted complexity that is entirely within the C(++) machine model. Avoid that complexity and you're pretty good already. Only drop down to concrete hardware arch level where it makes sense. But largely, the C machine model is still very much suited as a model for actual hardware. Writing straightforward obvious code allows you to stay in control of memory layout and the data transformation paths. It easily gets you within <<2x of what you could achieve with hand coded assembler for the >90% of the code that are pretty boring and straightforward. And obviously you couldn't get the work done in time when coding everything in assembler.</p>
]]></description><pubDate>Mon, 25 May 2026 07:13:44 +0000</pubDate><link>https://news.ycombinator.com/item?id=48264270</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48264270</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48264270</guid></item><item><title><![CDATA[New comment by jstimpfle in "C constructs that still don't work in C++"]]></title><description><![CDATA[
<p>It is the case that you can more easily know what happens when you don't use the wrong abstractions but stay in control. Highly-abstracted C++ code basically makes allocations and syscalls in the whitespace between the source code tokens.
You can't do systems software like that, you have to roll back the abstractions and roll back the use of pre-canned containers and libraries that you don't understand.<p>So it's all about understanding and control, not about some idea that C was defined in terms of assembly instructions, which it obviously is not. That's a total strawman.</p>
]]></description><pubDate>Mon, 25 May 2026 06:14:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=48263935</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48263935</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48263935</guid></item><item><title><![CDATA[New comment by jstimpfle in "C constructs that still don't work in C++"]]></title><description><![CDATA[
<p>Caring for the actual assembler output in selected critical pieces of code is not the same as ignoring the abstract machine model. What you claim is simply not the case if you check actual proficient systems programmers. Of which there are an astonishingly high share C and C++-but-mostly-C programmers.</p>
]]></description><pubDate>Mon, 25 May 2026 05:40:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=48263745</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48263745</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48263745</guid></item><item><title><![CDATA[New comment by jstimpfle in "Everything in C is undefined behavior"]]></title><description><![CDATA[
<p>Have you ever wanted to do this? I find the premise ridiculous.<p>But anyway, you're complaining that you have to work too hard to do unaligned loads (i.e. the wrong thing even if it should work on a particular machine) in C, when basically every other language makes you work more for basic systems programming tasks?<p>Whether unaligned loads can work on the machine level, it depends on the hardware. On some other architectures, you probably get anything from traps to unpredictable behaviour. It's totally fine that C does not define the behaviour for unaligned loads.<p>If you want to do some weird stuff like loading a single unaligned 16 byte quantity, where there was no "middle part" to begin with, just do memcpy then. The compiler might just do the appropriate thing on this architecture. Or if you need to closely control what's happened, write assembly then. But again, why would you even do this?</p>
]]></description><pubDate>Sat, 23 May 2026 09:45:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=48246283</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48246283</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48246283</guid></item><item><title><![CDATA[New comment by jstimpfle in "Everything in C is undefined behavior"]]></title><description><![CDATA[
<p>I understand that. It makes no practical difference. 99,99% of my additions don't rely on signed overflow for example, and if I'd ever need it there are ways to get just it.<p>Or tell me how you write a Rust program differently given that signed overflow is apparently defined? I bet you write it exactly the same way, and you get pretty much the same behaviour in practice. And we're even only debating actual overflow situations, meaning there is a bug whatever the compiled behaviour is.<p>C the language doesn't even guarantee that the machine has native integers with 8, 16, 32, 64 bits etc, that a cacheline is 64 bits, that a page is 4K, and here I am, writing programs for exactly that.</p>
]]></description><pubDate>Sat, 23 May 2026 07:57:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=48245715</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48245715</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48245715</guid></item><item><title><![CDATA[New comment by jstimpfle in "Everything in C is undefined behavior"]]></title><description><![CDATA[
<p>I think people make up way too much of it. What <i>is</i> the actual term of art? What is the meaning of UB? If you look in the standard, UB is basically what its name says, it is behaviour (or state) that is not defined. It can be anything. And that makes sense in many cases: What if you construct a random pointer, and read it or write it? It's not useful or practically possible to define the behaviour from then on. So the behaviour is left undefined, simple as that.<p>Now are there many cases of UB in C, many more than strictly need to exist on contemporary platforms? For sure there are. But does it affect me? Not unless I need a specific behaviour common to most contemporary platforms that I can't get within the confines of C, even considering compiler specific extensions. Honestly I can't come up with any of the top of my head. Maybe some integer-shifting stuff or such, if the compiler was able to prove I'm doing sth undefined, it can leave out that code (or delete my mail, for the doomers). Personally, it hasn't happened to me, and it's on the compiler authors to not do stupid things too.<p>Leaving all the semantic hair-splitting aside. What is the practical difference in how you write a Rust program compared to a C program, given that integer overflow is "defined" in Rust?</p>
]]></description><pubDate>Fri, 22 May 2026 16:57:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=48238480</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48238480</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48238480</guid></item><item><title><![CDATA[New comment by jstimpfle in "Everything in C is undefined behavior"]]></title><description><![CDATA[
<p>> It didn't assume in that case either. It did a well defined thing: add checks.<p>It did. The compiler added the checks (which panic on overflow, from a quick web search) precisely so it (and importantly, the developer!) can assume the overflow didn't happen in the subsequent code. Unless you consider a panic a defined state, and consider wrap-on-overflow equally valid in all cases, it's essentially the same as UB. (panic seems to be considered "unrecoverable").<p>Difference is _at most_ that C spec gives compiler more freedom to "implement UB", but then again, hit any unsafe code in Rust with wrapped around integer, you probably have comparable practical result -- machine doing random things, corrupting memory and so on.</p>
]]></description><pubDate>Fri, 22 May 2026 08:51:10 +0000</pubDate><link>https://news.ycombinator.com/item?id=48233502</link><dc:creator>jstimpfle</dc:creator><comments>https://news.ycombinator.com/item?id=48233502</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48233502</guid></item></channel></rss>