<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: evmar</title><link>https://news.ycombinator.com/user?id=evmar</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Thu, 27 Aug 2026 19:50:35 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=evmar" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by evmar in "Classical chess ranks 562nd of 960 starting positions after 460,800 games"]]></title><description><![CDATA[
<p>Totally agree. I saw the idea of “Internet Kessler syndrome” recently and I can’t stop thinking about how it captures this.</p>
]]></description><pubDate>Thu, 27 Aug 2026 14:57:55 +0000</pubDate><link>https://news.ycombinator.com/item?id=49465955</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=49465955</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49465955</guid></item><item><title><![CDATA[New comment by evmar in "Faster Than Ninja"]]></title><description><![CDATA[
<p>I did some exploration of this idea in a followup build system!  See <a href="https://neugierig.org/software/blog/2022/03/n2.html" rel="nofollow">https://neugierig.org/software/blog/2022/03/n2.html</a> .  (It's not really production-ready.)</p>
]]></description><pubDate>Wed, 05 Aug 2026 19:15:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=49187574</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=49187574</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49187574</guid></item><item><title><![CDATA[New comment by evmar in "Faster Than Ninja"]]></title><description><![CDATA[
<p>Thanks for saying this! I am close enough to it that I mostly remember all of the bad decisions I made that are now unfixable, haha.</p>
]]></description><pubDate>Wed, 05 Aug 2026 18:02:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=49186513</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=49186513</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49186513</guid></item><item><title><![CDATA[New comment by evmar in "Faster Than Ninja"]]></title><description><![CDATA[
<p>Yes, I don’t remember the details but vaguely remember that CMake tends to group things together that could in principle be made more parallel, as you mention with generates files in a library. On the other hand if build2 makes it easier for authors to express these kinds of patterns without the serialization then I count that as a win for build2!</p>
]]></description><pubDate>Wed, 05 Aug 2026 15:53:05 +0000</pubDate><link>https://news.ycombinator.com/item?id=49184607</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=49184607</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49184607</guid></item><item><title><![CDATA[New comment by evmar in "Faster Than Ninja"]]></title><description><![CDATA[
<p>[Ninja author here] Nice post, cool to see the deep dive!  I also appreciate the details on how they produced their numbers.<p>As they observe, Ninja gets to be fast mostly by cheating: it avoids a lot of work by saying many things are just out of scope for Ninja to do, and that means it is a useful a target to race against.  (Funny thing: when I wrote Ninja I was misremembering how fast an earlier build system was so I kept trying to make it faster.  So don't treat it as a lower bound, I just made it up!)<p>I comment here to say I find the explanation for 'why' in this post unsatisfying.  They mention three design decisions.<p>The first one is a criticism of CMake, not Ninja (?), so I don't think it can be why.  I might have misunderstood?<p>The second reason given is doing some work like header dependencies in multiple threads.  This is the most plausible reason to me but it still feels unlikely.  It's a very small amount of work: the post mentions 300 compiles, so maybe parsing 300 small text files?<p>The third is that they run the compiler up front an additional time to gather headers, which is strictly more work than Ninja.  There is some hand waving about file access patterns but I am skeptical; if the end-to-end build time is 3 seconds then the project is small enough to all fit in kernel caches.  They also mention doing other things like invoking the compiler to get version information.  This seems like it would dwarf any performance gain from number 2.<p>Maybe it's just my own curiosity, I think this post would be better if it had a better explanation for the reason.  I'm not disputing the result, I just think the result should make you suspicious that something else is going on, and you might learn something from that!  You could for example explore whether it's the header dependency thing by profiling the Ninja invocation and seeing if it's waiting for CPU or waiting for tasks to execute.<p>(If I had to guess without looking at any of the involved code, I would predict it's something about how CMake generates the build, like it introduces serialization in a place where build2 is parallel, or it adds some extra build steps like gathering the current git hash into a header file or something.)</p>
]]></description><pubDate>Wed, 05 Aug 2026 15:26:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=49184274</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=49184274</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49184274</guid></item><item><title><![CDATA[New comment by evmar in "The great blogging collapse: What happened to 100 successful blogs?"]]></title><description><![CDATA[
<p>If you imagine Google's job is to present useful information, these blogs that are maximizing cash while simulating usefulness are exactly the sorts of things I would hope Google to want to filter out.<p>(I don't think Google's often capricious ranking changes really succeed at this, but the outcomes in this post seems like something hypothetically good?)</p>
]]></description><pubDate>Sun, 05 Jul 2026 16:50:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=48795679</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48795679</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48795679</guid></item><item><title><![CDATA[New comment by evmar in "I hate compilers"]]></title><description><![CDATA[
<p>A better solution might be to use <a href="https://github.com/evanw/polywasm" rel="nofollow">https://github.com/evanw/polywasm</a> to run the original wasm in place.</p>
]]></description><pubDate>Thu, 18 Jun 2026 10:31:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=48583371</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48583371</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48583371</guid></item><item><title><![CDATA[New comment by evmar in "The experience of rendering Arabic typography and its technical debt"]]></title><description><![CDATA[
<p>One thing I sometimes think about when I think about text layout problems is how the text we use also has a bunch of complexities that we can take for granted.<p>Think of variable width characters and kerning and ligatures and hyphenation and justification.  Imagine computers had been won by a CJK language, which have none of these problems. You could imagine a similar article about how exotic and difficult English layout is.</p>
]]></description><pubDate>Sat, 13 Jun 2026 17:17:08 +0000</pubDate><link>https://news.ycombinator.com/item?id=48519297</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48519297</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48519297</guid></item><item><title><![CDATA[New comment by evmar in "Britain Became as Poor as Mississippi"]]></title><description><![CDATA[
<p>Thanks, I'd love to add them!  Do you have a good source for this data?  I did a quick look at the site you linked above and I'm not sure whether it has numbers for GDP or landmass for these regions.</p>
]]></description><pubDate>Wed, 10 Jun 2026 18:15:38 +0000</pubDate><link>https://news.ycombinator.com/item?id=48480413</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48480413</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48480413</guid></item><item><title><![CDATA[New comment by evmar in "Britain’s output per person is now only just above that of Mississippi"]]></title><description><![CDATA[
<p>I was curious about comparisons like the ones you're making between US states and EU countries and made this little app, maybe you'll find it useful!<p><a href="https://evmar.github.io/states/" rel="nofollow">https://evmar.github.io/states/</a></p>
]]></description><pubDate>Wed, 10 Jun 2026 17:49:39 +0000</pubDate><link>https://news.ycombinator.com/item?id=48480024</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48480024</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48480024</guid></item><item><title><![CDATA[New comment by evmar in "Theseus: Translating Win32 to WASM"]]></title><description><![CDATA[
<p>This is my second emulator, and in my first I picked a name more like that and regretted it.  A thing I now appreciate about emulators is that it's common to increase scope -- like this one already supports non-wasm output, and I am tinkering with adding support for DOS executables as well, which means the name 'win2wasm' would already become obsolete!</p>
]]></description><pubDate>Wed, 27 May 2026 20:28:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=48300163</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48300163</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48300163</guid></item><item><title><![CDATA[New comment by evmar in "Theseus: Translating Win32 to WASM"]]></title><description><![CDATA[
<p>Thanks a lot for this, I will put it on my list to investigate.<p>I've gone in circles a few times with how to think about image buffer management because I also support DirectDraw, which is designed to be backed by accelerated graphics, with operations like scaling bitblit.  (Currently the Theseus implementation uses a shared "Surface" type as the backing store for both GDI Windows and DirectX Surfaces.)<p>It's a bit complicated by a few things. (1) DirectX surfaces can be "locked" to access as pixel buffers, so any accelerated surface indirection I guess would need to be able to copy pixels back down into emulator memory. Which I guess I could just implement.  (2) There's a bunch of different modes for operations like bitblit like setting a color key for transparency that I can't implement with the canvas API, so I think I'd need to use GL shaders if I want acceleration, not just canvas.</p>
]]></description><pubDate>Wed, 27 May 2026 20:26:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=48300139</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48300139</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48300139</guid></item><item><title><![CDATA[New comment by evmar in "Theseus: Translating Win32 to WASM"]]></title><description><![CDATA[
<p>Wow, thanks for the link, that is perfect timing!  I submitted my post and my own feedback on the discussion: <a href="https://github.com/WebAssembly/shared-everything-threads/discussions/112#discussioncomment-17079923" rel="nofollow">https://github.com/WebAssembly/shared-everything-threads/dis...</a></p>
]]></description><pubDate>Wed, 27 May 2026 20:06:57 +0000</pubDate><link>https://news.ycombinator.com/item?id=48299831</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48299831</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48299831</guid></item><item><title><![CDATA[New comment by evmar in "Theseus: Translating Win32 to WASM"]]></title><description><![CDATA[
<p>[post author] I looked into this API but wasn't sure how to make good use of it.  I may have misunderstood, maybe you could help!<p>The doc you linked has two forms of use, sync and async.<p>For sync: it seems the idea is for the worker to render into an OffscreenCanvas, then postMessage an ImageBitmap created with transferToImageBitmap from worker to main thread for drawing.  It seems like it would need to allocate a new bitmap for each frame.  Currently Theseus puts the pixel data in shared memory and the main thread copies it out (required to create an ImageData), which at least in principle could reuse the copy buffer (though it currently doesn't), which seems better?
<a href="https://github.com/evmar/theseus/blob/a5a849dbcf8046a2d1837af2025dcd91ca3b200a/web/host.ts#L120-L126" rel="nofollow">https://github.com/evmar/theseus/blob/a5a849dbcf8046a2d1837a...</a><p>For async: in this the idea is have the worker render into an OffscreenCanvas linked to the on-screen one. But it seems to get an OffscreenCanvas in a worker, the main thread canvas must .transferControlToOffscreen() it to the worker.  Under the current synchronization model[1] the only time the worker can receive a message is during startup, because the rest of the time it's deep in its own wasm call stacks.  This means that if the worker needs to resize its canvas and then paint to it, it's stuck.<p>[1] I wrote "current" because after writing this post I learned about JSPI which might help with this.</p>
]]></description><pubDate>Wed, 27 May 2026 19:05:02 +0000</pubDate><link>https://news.ycombinator.com/item?id=48298933</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48298933</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48298933</guid></item><item><title><![CDATA[New comment by evmar in "Theseus: Translating Win32 to WASM"]]></title><description><![CDATA[
<p>Gosh, I think that means even when your code is wholly running on workers (where you would be able to use the atomic wait mentioned in the comment), it still will busy loop, doesn't it?  At least it's within the allocator and not in the general implementation of Mutex... I think?</p>
]]></description><pubDate>Wed, 27 May 2026 18:46:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=48298658</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48298658</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48298658</guid></item><item><title><![CDATA[New comment by evmar in "The Third Hard Problem"]]></title><description><![CDATA[
<p>One nice tool for analyzing maps as a tree is as a dominator trees.  I wrote a bit about it here: <a href="https://neugierig.org/software/blog/2023/07/dominator.html" rel="nofollow">https://neugierig.org/software/blog/2023/07/dominator.html</a></p>
]]></description><pubDate>Sun, 17 May 2026 01:08:15 +0000</pubDate><link>https://news.ycombinator.com/item?id=48165219</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48165219</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48165219</guid></item><item><title><![CDATA[New comment by evmar in "Deterministic Fully-Static Whole-Binary Translation Without Heuristics"]]></title><description><![CDATA[
<p>The translator I made is only hobbyist quality, but I just have a big table that says “if you indirect jmp to address X then the associated block is at location Y”.<p>This is slower than a direct jmp (which doesn’t use the table) but also indirect jumps were slower in the original program to begin with and typically don’t occur in performance-critical loops.</p>
]]></description><pubDate>Wed, 13 May 2026 14:23:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=48122329</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=48122329</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48122329</guid></item><item><title><![CDATA[New comment by evmar in "Theseus, a Static Windows Emulator"]]></title><description><![CDATA[
<p>Do you have any notes or other artifacts from your recompiler? I’d love to learn more.</p>
]]></description><pubDate>Wed, 22 Apr 2026 20:14:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=47868693</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47868693</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47868693</guid></item><item><title><![CDATA[New comment by evmar in "Theseus, a Static Windows Emulator"]]></title><description><![CDATA[
<p>Yes, I agree that there is little harm in gathering too much code. I have tried out just scanning data memory for values that refer to addresses within the region marked as code and disassembling from those points, as well as scanning the instructions I traverse for any immediate values in the same range.</p>
]]></description><pubDate>Wed, 22 Apr 2026 20:13:36 +0000</pubDate><link>https://news.ycombinator.com/item?id=47868683</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47868683</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47868683</guid></item><item><title><![CDATA[New comment by evmar in "Theseus, a Static Windows Emulator"]]></title><description><![CDATA[
<p>Slow progress is fine, it took me like two years to get where I got!  (Not that I was working on it full time or anything, but also there were just many false starts and I had no idea what I was doing...)</p>
]]></description><pubDate>Wed, 22 Apr 2026 15:49:18 +0000</pubDate><link>https://news.ycombinator.com/item?id=47865348</link><dc:creator>evmar</dc:creator><comments>https://news.ycombinator.com/item?id=47865348</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47865348</guid></item></channel></rss>