<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: norir</title><link>https://news.ycombinator.com/user?id=norir</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 18 Jul 2026 01:14:51 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=norir" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by norir in "How Our Rust-to-Zig Rewrite Is Going"]]></title><description><![CDATA[
<p>This piece would have been a lot more compelling if they had actually done science on selecting a language for compiler development. From what I can tell, they had an untested hypothesis that a low level systems language is necessary for a high performance compiler <a href="https://www.roc-lang.org/faq#self-hosted-compiler" rel="nofollow">https://www.roc-lang.org/faq#self-hosted-compiler</a> and from that concluded that their only
choice besides rust was zig.<p>I know from experience that this initial assumption is wrong. Compiler performance is dominated by algorithms. The fastes managed languages tend to be at worst within a factor of two for wall time on any given algorithm. Algorithmic differences can be unbounded in their performance gaps. Zig itself is a perfect counterexample to the theory that writing a compiler in a low level systems language will lead to a fast compiler. Roc seems to compile at around 15k lines per second. That is not fast. There were evidently compilers written in ml that did 3k likes per second in 1998 <a href="https://flint.cs.yale.edu/cs421/case-for-ml.html" rel="nofollow">https://flint.cs.yale.edu/cs421/case-for-ml.html</a><p>The zig rewrite of roc looks like the author's second compiler. Compiler and language design is a skill like any other and from my vantage point, they appear to have overcommitted to an initial design at the expense of developing their higher level design skills. In my opinion, the best thing they could do for the future of roc is stop working on their current compiler and use it to write a self hosting compiler for a much smaller subset of roc. They should be able to do that in less than 10k lines of code. They might even find that their self hosting compiler is faster than their zig based bootstrap compiler for the self hosted subset of roc. If the self hosting compiler is inadequate. Now they at least have identified a smaller useful subset of roc and can experiment with different compiler implementations in 10k likes of code rather than 300k lines of code. Then they could actually test the theory of whether or not a low level language is necessary to meet whatever arbitrary compiler performance goals they have.<p>By self hosting, they would also discover what roc features actually matter and they would spend much more time actually writing roc code. The features that are needed to write a self hosted compiler are all features that are generally useful. By improving the self hosted compiler, they also improve downstream programs.</p>
]]></description><pubDate>Thu, 16 Jul 2026 17:09:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=48937260</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=48937260</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48937260</guid></item><item><title><![CDATA[New comment by norir in "The LLVM Compiler Infrastructure"]]></title><description><![CDATA[
<p>This infrastructure is also slow and leads to poor compilation times for any language that uses llvm as a backend. In an era of automatic code generation, this will become more and more of a problem as llvm compilation times will become a huge bottleneck. I am very bearish on llvm as a technology and while I will acknowledge its influence, I expect that it is at or near its peak and market share will decline dramatically over the next five to ten years.</p>
]]></description><pubDate>Tue, 07 Jul 2026 02:49:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=48813125</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=48813125</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48813125</guid></item><item><title><![CDATA[New comment by norir in "It's not me, it's the compiler"]]></title><description><![CDATA[
<p>This feels like it should have been a warning rather than an optimization in the first place. In my opinion, dead code elimination should only be done during link time optimization where it can be proven that branches are not taken given the whole program information. If there is an unused assignment regardless of the branch, the compiler could emit a warning so the user can do their own dead code elimination, or choose to suppress/ignore the warning. The worst thing a compiler can do is silently incorrectly apply an optimization.<p>Of course, I also feel this way about the vast majority of optimizations. If the compiler can optimize a piece of code, it can also show the user what it thinks the optimal code would be so that they can rewrite it themselves, if they so choose. This both prevents these kinds of miscompiles and prevents compilation times from exploding because the compiler doesn't need to do much work, it primarily just translates the human readable code into machine code.</p>
]]></description><pubDate>Sat, 04 Jul 2026 22:22:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=48789612</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=48789612</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48789612</guid></item><item><title><![CDATA[New comment by norir in "Bun has an open PR adding shared-memory threads to JavaScriptCore"]]></title><description><![CDATA[
<p>Perhaps then it would be better to not use tools of this level of complexity.</p>
]]></description><pubDate>Sat, 20 Jun 2026 19:34:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=48612255</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=48612255</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48612255</guid></item><item><title><![CDATA[New comment by norir in "CS 6120: Advanced Compilers: The Self-Guided Online Course (2020)"]]></title><description><![CDATA[
<p>I am actively opposed to this design for a first compiler. There is no need for a lexer with a recursive descent parser. Register allocation is also an unnecessary distraction. It is better for a first compiler to compile to a higher level language in which neither register assignment nor memory management are necessary.<p>Optimizing compilers are suboptimal in that they waste enormous amount of time optimizing code that can't or needn't be optimized and even where the optimizations are helpful, they are opaque and at risk of unexpectedly regressing both due to small changes at the source code level or changes in the compiler optimizer, both of which are quite insidious.<p>If instead of optimizing compilers, we had languages that allowed for seamless interop between low level and high level functions, then perhaps an llm becomes the optimizer (or you can invoke the compiler to optimize a specific function by source level rewrite). The benefit of this compared to a traditional optimizing compiler is that the optimization is done once per function and never repeated (until prompted) and the implementation is human readable and not buried in a binary. Moreover, and perhaps even more importantly, by not doing optimizations in the compiler, compilation times can be much faster, easily 100-1000x than state of the art optimizing compiler, while generating equivalent or even better runtime performance. As it has been said: premature optimization is the root of all evil.</p>
]]></description><pubDate>Thu, 18 Jun 2026 19:11:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=48590055</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=48590055</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48590055</guid></item><item><title><![CDATA[New comment by norir in "How Terry Tao became an evangelist for AI in math"]]></title><description><![CDATA[
<p>Terry Tao is a next level vibe coder: he inspires people to do his vibe coding for him. As someone with a background in advanced math, though never even close to Tao's level, I find myself skeptical about this type of mathematics. I don't personally find it beautiful and it feels like the line between the profound and the trivial (as in of minimal importance not difficulty) is blurry. One could argue for pure mathematics that is of no practical utility but is aesthetically beautiful, but I struggle to see the beauty in a gargantuan lean proof constructed by 100 different people. Perhaps this work will lead to deeper insight about the universe and the human condition, but I catch a whiff of problem solving for the sake of problem solving untethered from a deeper sense of purpose and meaning.</p>
]]></description><pubDate>Mon, 08 Jun 2026 16:54:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=48447841</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=48447841</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48447841</guid></item><item><title><![CDATA[New comment by norir in "Google employees internally share memes about how its AI sucks"]]></title><description><![CDATA[
<p>I think the people with extreme positions are often the most useful because they get closer to the source of the argument. Extreme boosters of ai often want to either bypass developing skills to advance their careers or want to exploit what they perceive to be overpaid labor. Extreme pessimists tend to value skill and autonomy and distrust the people with power above them in the hierarchy. They also may identify with their skills and feel existentially threatened by a society that is rapidly devaluing them.<p>Framing this disagreement as a fundamental misunderstanding of the technical capacity and appropriate use cases, for me, completely misses the plot. Both sides have compelling reasons for their beliefs and the cold rational analysis of the tech is as likely to further entrench the extremes as it is to enlighten.<p>I will also note that in your comment, you lament the dismissal of entire groups of engineers while doing exactly this when you dismiss the loudest voices (as well as those who think highly of their own ability) and imply that it is the loudest voices who are inherently extreme and therefore inferior to the pragmatic engineer who understands tradeoffs and cost benefit analysis.</p>
]]></description><pubDate>Thu, 04 Jun 2026 17:35:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=48401923</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=48401923</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48401923</guid></item><item><title><![CDATA[New comment by norir in "American capitalism has taken an apocalyptic turn"]]></title><description><![CDATA[
<p>> We could start off with how are you worse off because of people wealthier than you?<p>You are smart enough to come up with some answers of your own. It's rude to demand others to do your own thinking for you.</p>
]]></description><pubDate>Thu, 04 Jun 2026 05:10:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=48394212</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=48394212</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48394212</guid></item><item><title><![CDATA[New comment by norir in "QBE – Compiler Backend – 1.3"]]></title><description><![CDATA[
<p>It is hard for me to fully trust a compiler backend that isn't self hosted. There is a discipline that self hosting imposes that would both improve the quality of their ir as well as the backend itself. A self hosted backend can always be updated to have performance meeting or exceeding the best that llvm or any other backend can offer.</p>
]]></description><pubDate>Tue, 02 Jun 2026 20:42:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=48375990</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=48375990</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48375990</guid></item><item><title><![CDATA[New comment by norir in "sp.h: Fixing C by giving it a high quality, ultra portable standard library"]]></title><description><![CDATA[
<p>When using null terminated strings, parsing can be branchless because you don't need bounds checks and can use a jump table indexed by the byte.</p>
]]></description><pubDate>Sun, 24 May 2026 00:47:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=48253157</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=48253157</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48253157</guid></item><item><title><![CDATA[New comment by norir in "No way to parse integers in C (2022)"]]></title><description><![CDATA[
<p>This is not a hard thing to do without using a library. The code below is easily adapted to the unsigned case and/or arbitrary base rather than 10.<p><pre><code>    #include <stdio.h>
    int main(int argc, char **argv) {
        if (argc != 2) {
            fprintf(stderr, "usage: require one numeric argument");
        }
        char *nump = argv[1];
        unsigned neg = 0;
        unsigned long long ures = 0;
        if (*nump == '-') {
            neg = 1;
            nump = nump + 1;
        }
        if (!*nump) {
            fprintf(stderr, "require non empty string\n");
            return 1;
        }
        char b;
        while (b = *nump++) {
            if (b >= '0' && b <= '9') {
                unsigned long long nres = (ures * 10) + (b - '0'); 
                if (nres < ures) {
                    fprintf(stderr, "overflow in '%s'\n", argv[1]);
                    return 1;
                }   
                ures = nres;
            } else {
                if (b >= ' ') {
                    fprintf(stderr, "invalid char '%c' in '%s'\n", b, argv[1]); 
                } else {
                    fprintf(stderr, "invalid byte '%d' in '%s'\n", b, argv[1]);
                }
                return 1;  
            }
        }
        long long res = (long long) ures;
        if (neg) {
            if (ures <= 0x8000000000000000ULL) {
                res = -res;
            } else {
                fprintf(stderr, "underflow in '%s'\n", argv[1]);
                return 1;
            }
        } else if (ures > 0x7FFFFFFFFFFFFFFFULL) {
            fprintf(stderr, "overflow in '%s'\n", argv[1]);
            return 1;
        }
        fprintf(stdout, "result: %lld\n", res);
        return 0;
    }</code></pre></p>
]]></description><pubDate>Wed, 20 May 2026 18:38:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=48212113</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=48212113</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48212113</guid></item><item><title><![CDATA[New comment by norir in "For thirty years I programmed with Phish on, every day"]]></title><description><![CDATA[
<p>The product and the process are not orthogonal.</p>
]]></description><pubDate>Sun, 03 May 2026 17:59:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=47999599</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47999599</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47999599</guid></item><item><title><![CDATA[New comment by norir in "Unsigned sizes: A five year mistake"]]></title><description><![CDATA[
<p>This is true, which means that a language has to be designed from the ground up to deal with these problems or there will always be inscrutable bugs due to misuse of arithmetic results. A simple example in a c-like language would be that the following function would not compile:<p><pre><code>    unsigned foo(unsigned a, unsigned b) { return a - b; }
</code></pre>
but this would:<p><pre><code>    unsigned foo(unsigned a, unsigned b) {
      auto c = a - b;
      return c >= 0 ? c : 0;
    }
</code></pre>
Assuming 32 bit unsigned and int, the type of c should be computed as the range [-0xffffffff, 0xffffffff], which is different from int [-0x100000000, 0x7fffffff]. Subtle things like this are why I think it is generally a mistake to type annotate the result of a numerical calculation when the compiler can compute it precisely for you.</p>
]]></description><pubDate>Sat, 02 May 2026 21:16:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=47990622</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47990622</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47990622</guid></item><item><title><![CDATA[New comment by norir in "Unsigned sizes: A five year mistake"]]></title><description><![CDATA[
<p>In my reading, what Stroustroup is saying is that given other problems in c/c++, that singed sizes are less bad than unsigned but both have clear and significant deficiencies. A new language doesn't have to inherit all of these deficiencies.</p>
]]></description><pubDate>Sat, 02 May 2026 20:51:01 +0000</pubDate><link>https://news.ycombinator.com/item?id=47990361</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47990361</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47990361</guid></item><item><title><![CDATA[New comment by norir in "Scoring Show HN submissions for AI design patterns"]]></title><description><![CDATA[
<p>I also expect that most side projects that are made with ai end up abandoned within 3 months and contribute next to nothing to the user's personal development and that the use of ai prevented them from the kind of deliberate practice that could have led to durable skill growth which ultimately will lead to much better work (side or main projects).</p>
]]></description><pubDate>Wed, 22 Apr 2026 15:51:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=47865386</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47865386</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47865386</guid></item><item><title><![CDATA[New comment by norir in "Nanopass Framework: Clean Compiler Creation Language"]]></title><description><![CDATA[
<p>This highly depends on the language and your skill as a compiler writer. You can write a single pass assembler that generates great code but you have to of course write the low level code yourself (including manual register assignment). To do decent automatic register assignment, I agree you need at least two passes, but not 10 or more.</p>
]]></description><pubDate>Sun, 19 Apr 2026 20:51:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=47827526</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47827526</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47827526</guid></item><item><title><![CDATA[New comment by norir in "Bringing Clojure programming to Enterprise (2021)"]]></title><description><![CDATA[
<p>You don't need a repl for this workflow and it can be easily implemented in any language. `ls *.MY_LANG | entr -c run.sh` You get feedback whenever you save the file.<p>Personally, I find waiting more than 200ms unacceptable and really < 50ms is ideal. When the feedback is very small, it becomes practical to save the file on every keystroke and get nearly instantaneous results with every input char.</p>
]]></description><pubDate>Thu, 02 Apr 2026 16:41:42 +0000</pubDate><link>https://news.ycombinator.com/item?id=47616793</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47616793</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47616793</guid></item><item><title><![CDATA[New comment by norir in "Intuiting Pratt Parsing"]]></title><description><![CDATA[
<p>It is easily possible to parse at > 1MM lines per second with a well designed grammar and handwritten parser. If I'm editing a file with 100k+ lines, I likely have much bigger problems than the need for incremental parsing.</p>
]]></description><pubDate>Wed, 01 Apr 2026 14:53:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=47601757</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47601757</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47601757</guid></item><item><title><![CDATA[New comment by norir in "Some uncomfortable truths about AI coding agents"]]></title><description><![CDATA[
<p>> I recognize that it is reminiscent of a few decades ago when old timers complained about the proliferation of high level programming languages and insisted they would lead to a generation of programmers lacking a proper understanding of how the system behaves beneath all that syntactic sugar and automatic garbage collection. They won’t have the foundational skills necessary to design and build quality software. And, for the most part, they turned out to be wrong.<p>What if the old timers were actually right? I tend to think they were.</p>
]]></description><pubDate>Fri, 27 Mar 2026 22:01:21 +0000</pubDate><link>https://news.ycombinator.com/item?id=47548912</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47548912</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47548912</guid></item><item><title><![CDATA[New comment by norir in "We might all be AI engineers now"]]></title><description><![CDATA[
<p>> In the meantime, there's nothing stopping you from using the agent to write the code that is every bit as high quality as if you sat down and typed it in yourself.<p>You can only speak for yourself.</p>
]]></description><pubDate>Sat, 07 Mar 2026 00:58:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=47283198</link><dc:creator>norir</dc:creator><comments>https://news.ycombinator.com/item?id=47283198</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47283198</guid></item></channel></rss>