<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: russellsprouts</title><link>https://news.ycombinator.com/user?id=russellsprouts</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Wed, 08 Apr 2026 01:37:57 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=russellsprouts" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by russellsprouts in "DeiMOS – A Superoptimizer for the MOS 6502"]]></title><description><![CDATA[
<p>Very cool!<p>I did something related in the past: <a href="https://github.com/RussellSprouts/6502-enumerator" rel="nofollow">https://github.com/RussellSprouts/6502-enumerator</a>. It uses C++ templates to share an emulator implementation between z3-powered symbolic execution and actual execution. It was meant to find equivalence between random instruction sequences for peephole optimization, rather than optimizing a specific input sequence.<p>Shadow instructions are very interesting and cursed. I've seen them used in very limited circumstances for NOP-slides for timing code: <a href="https://www.pagetable.com/?p=669" rel="nofollow">https://www.pagetable.com/?p=669</a>. It would be fun to see it applied in otherwise normal code. My enumerator wouldn't support this -- it didn't execute actual 6502 instructions from bytes -- it had its own internal representation for `the first arbitrary absolute pointer` or `the second arbitrary immediate constant`. These would either be initialized with random concrete values or z3 variables.</p>
]]></description><pubDate>Tue, 07 Apr 2026 15:09:45 +0000</pubDate><link>https://news.ycombinator.com/item?id=47676588</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=47676588</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47676588</guid></item><item><title><![CDATA[New comment by russellsprouts in "The Ruliology of Lambdas"]]></title><description><![CDATA[
<p>Related video showing animated lambda diagrams: <a href="https://m.youtube.com/watch?v=RcVA8Nj6HEo" rel="nofollow">https://m.youtube.com/watch?v=RcVA8Nj6HEo</a></p>
]]></description><pubDate>Sun, 21 Sep 2025 03:58:43 +0000</pubDate><link>https://news.ycombinator.com/item?id=45319941</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=45319941</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45319941</guid></item><item><title><![CDATA[New comment by russellsprouts in "Optimizers need a rethink"]]></title><description><![CDATA[
<p>This reminds me of Halide (<a href="https://halide-lang.org/" rel="nofollow">https://halide-lang.org/</a>), which is a really interesting design in this direction.<p>In Halide, you specify the algorithm at a high level, then specify the "schedule" (execution order, vectorization, storage) separately. Then, it verifies that the two match. For tight loops like image kernels, it's often counter-intuitive which execution plan will give the best performance, so being able to experiment with the guarantee that you are still implementing the algorithm correctly is valuable.<p>For a database, it would be as if you could send a high level SQL query and an execution plan together.<p>Halide is very specific, but I could imagine a general-purpose language with a Python-like high level representation for code behavior, with the option to specify a lower-level implementation with a lot of performance annotations.</p>
]]></description><pubDate>Mon, 28 Oct 2024 13:05:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=41970670</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=41970670</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=41970670</guid></item><item><title><![CDATA[New comment by russellsprouts in "Are any words the same in all languages?"]]></title><description><![CDATA[
<p>In Korean, sushi is 초밥 (cho-bap)</p>
]]></description><pubDate>Fri, 08 Sep 2023 01:37:30 +0000</pubDate><link>https://news.ycombinator.com/item?id=37428206</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=37428206</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=37428206</guid></item><item><title><![CDATA[New comment by russellsprouts in "Building a baseline JIT for Lua automatically"]]></title><description><![CDATA[
<p>> To solve [forward branches], those bytecodes would push information about how the branch destination address shall be fixed up into a late-patch buffer.<p>This reminds me of how Forth `if` and `then` can be compiled in a single pass -- `if` writes the branch instruction and pushes the current instruction pointer to the stack, and `then` pops it and patches the instruction to point to the current instruction pointer.</p>
]]></description><pubDate>Sat, 13 May 2023 00:44:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=35924294</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=35924294</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=35924294</guid></item><item><title><![CDATA[New comment by russellsprouts in "Show HN: NESFab – Programming language for making NES games"]]></title><description><![CDATA[
<p>Just read through the documentation. There are so many great ideas for generating efficient code. `goto mode` in particular is an awesome idea. Generalizing the program to have multiple "entry" points and overlapping their global variables to save RAM, I've never heard of that technique before.<p>The inline assembly integration looks nice too -- accessing the arguments and return address as fields on the function makes a lot of sense.</p>
]]></description><pubDate>Wed, 08 Mar 2023 14:34:31 +0000</pubDate><link>https://news.ycombinator.com/item?id=35069397</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=35069397</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=35069397</guid></item><item><title><![CDATA[New comment by russellsprouts in "TypeScript Features to Avoid"]]></title><description><![CDATA[
<p>You potentially get a problem for every '.' expression. In this code:<p><pre><code>  import {Something} from './file';
  console.log(Something.PROP);
</code></pre>
TypeScript doesn't know what to emit without type information. If Something is a class, then the JS will look the same. But if it's a const enum, then TypeScript has to erase the Something.PROP expression and replace it with the constant value of that enum member, since Something will not exist at runtime.</p>
]]></description><pubDate>Thu, 20 Jan 2022 22:06:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=30015812</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=30015812</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30015812</guid></item><item><title><![CDATA[New comment by russellsprouts in "TypeScript Features to Avoid"]]></title><description><![CDATA[
<p>const enums are one of the few cases where type information changes the emitted JS, something that's arguably a bigger problem than TypeScript-specific, but still just syntax sugar, syntax highlighted in the article.<p>Const enums are erased at compile time. If you have a reference to `MyEnum.VAR`, TS has to check whether the enum is a const enum, and if so, replace with something like `1 /* VAR */`. This means that the type information in one file (where the enum is defined) is necessary to determine the proper output of any file that uses it.</p>
]]></description><pubDate>Thu, 20 Jan 2022 19:07:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=30013168</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=30013168</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=30013168</guid></item><item><title><![CDATA[New comment by russellsprouts in "Kid Pix as a JavaScript App"]]></title><description><![CDATA[
<p>Yeah, it will biased towards the center of the range rather than uniformly distributed</p>
]]></description><pubDate>Thu, 05 Aug 2021 20:12:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=28079043</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=28079043</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=28079043</guid></item><item><title><![CDATA[New comment by russellsprouts in "Ice-forth: A self-hosted Forth on the 6502 for creating NES cartridges"]]></title><description><![CDATA[
<p>Fair point, updated it along with some issues in the README</p>
]]></description><pubDate>Sun, 26 Jul 2020 15:06:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=23957566</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=23957566</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=23957566</guid></item><item><title><![CDATA[New comment by russellsprouts in "Ice-forth: A self-hosted Forth on the 6502 for creating NES cartridges"]]></title><description><![CDATA[
<p>Hi, author here. I think the only difficulty in making this work without a disk is that most of the memory space will be read only once you finalize the ROM. I had to allocate separate RAM addresses for variables. In Forth, you can often just increment HERE to make space for a variable, but I ended up creating many different HERE words because my dictionary headers, word implementations, and ram variables all used different blocks of memory.</p>
]]></description><pubDate>Sun, 26 Jul 2020 14:44:16 +0000</pubDate><link>https://news.ycombinator.com/item?id=23957397</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=23957397</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=23957397</guid></item><item><title><![CDATA[New comment by russellsprouts in "Wintergatan's Marble Machine in Minecraft [video]"]]></title><description><![CDATA[
<p>I downloaded the world to check -- the system does use zero-tick repeaters (dust cut type, I think) for a pause functionality, but for the channels, it actually reads slightly faster than the music plays to compensate for delays as the data gets further out.<p>See my other comment for details:
<a href="https://news.ycombinator.com/item?id=20960710" rel="nofollow">https://news.ycombinator.com/item?id=20960710</a></p>
]]></description><pubDate>Fri, 13 Sep 2019 10:22:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=20960749</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=20960749</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=20960749</guid></item><item><title><![CDATA[New comment by russellsprouts in "Wintergatan's Marble Machine in Minecraft [video]"]]></title><description><![CDATA[
<p>Looking at the world download, it's using powered rails and observer blocks as a solid state storage.<p>There are only brief glimpses in the video, but here's what that looks like:
<a href="https://imgur.com/a/AkOAzgF" rel="nofollow">https://imgur.com/a/AkOAzgF</a><p>The 14 left-right powered rail tracks are the music channels. Each vertical slice is a tick of music, and they are grouped into 9, the max length of a powered rail signal. The presence of an observer block underneath the rail indicates a note.
The whole machine appears to be 128 x 14 bits. It has a serial read interface.<p>In more detail:<p>From the bottom of the image to the top you see:<p>- A row of redstone blocks, pistons, and redstone wire.<p>- A row of repeaters facing north<p>- A row of repeaters facing west<p>- An observer facing north<p>- 14 east-west powered rail/observer wires, sending signals to the east.<p>- In a layer underneath the east-west observer-rail wires, alternating columns of rails and redstone wire facing north-south. (Not visible in the picture)<p>- (A mirror image of the bottom)<p>The west facing repeaters control the current read location. The machine sends a signal until they all turn on, then waits until they all turn off, then turns them on again, etc. When one of the repeaters toggles between on and off, the north-facing observer above it sends a pulse.  The pulse travels upwards in the north-south rail (in the invisible lower layer), and then if an observer is present, the signal is sent east along the east-west line for the channel.<p>The bottom two rows form a pause mechanism. The redstone block, piston, redstone wire row is an instant repeater line. When the north-facing repeaters are turned on, they will lock the west-facing repeaters in whatever state they are in. Using instant wire ensures the pause will happen immediately.<p>The whole system is mirrored at the top since the north-south rails in the lower layer can only send a signal up to 9 blocks. With read signals coming from both sides, this design could support up to 18 channels.<p>One last detail -- one column of music is read every 2 redstone ticks, so most of the repeaters are set to a 2 tick delay. However, the signal for a channel must be repeated using an observer every 9 blocks (adding a 1 tick delay), so the first repeater in each 9 block section is set to 1 tick. This compensates for the delay.<p>EDIT: I originally stated that there were 14 channels, but I overlooked that it's double-layered, and that there's a similar quad-layered system on the other side. There are 50 channels in total.</p>
]]></description><pubDate>Fri, 13 Sep 2019 10:12:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=20960710</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=20960710</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=20960710</guid></item><item><title><![CDATA[New comment by russellsprouts in "Shavian alphabet"]]></title><description><![CDATA[
<p>A version of that joke has been attributed to Mark Twain, though this source[0] says it was more probably M.J. Yilz, in this[1] 1971 letter to the Economist.<p>[0]: <a href="http://grammar.ccc.commnet.edu/grammar/twain.htm" rel="nofollow">http://grammar.ccc.commnet.edu/grammar/twain.htm</a><p>[1]: <a href="http://www.lettersofnote.com/2012/05/iorz-feixfuli-m-j-yilz.html" rel="nofollow">http://www.lettersofnote.com/2012/05/iorz-feixfuli-m-j-yilz....</a></p>
]]></description><pubDate>Mon, 27 Aug 2018 15:39:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=17852114</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=17852114</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=17852114</guid></item><item><title><![CDATA[New comment by russellsprouts in "6502 arithmetic and why it is terrible"]]></title><description><![CDATA[
<p>It's in a very rough state, but I have been working on something similar. The idea is to build a superoptimizer by exhaustive enumeration of instruction sequences. In a first pass, each sequence is executed on some test machine states, and bucketed by the hash of the results. On the second pass, we use a theorem prover to check the equivalence of the sequences.<p>See: Automatic Generation of Peephole Superoptimizers, Sorav Bansal and Alex Aiken, ASPLOS 2006. <a href="https://theory.stanford.edu/~aiken/publications/papers/asplos06.pdf" rel="nofollow">https://theory.stanford.edu/~aiken/publications/papers/asplo...</a><p>My implementation: <a href="https://github.com/RussellSprouts/6502-enumerator" rel="nofollow">https://github.com/RussellSprouts/6502-enumerator</a></p>
]]></description><pubDate>Tue, 12 Jun 2018 00:00:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=17289665</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=17289665</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=17289665</guid></item><item><title><![CDATA[New comment by russellsprouts in "How long would it take to create a Windows 1.0 capable machine from scratch?"]]></title><description><![CDATA[
<p>I'd disagree -- but I think an important question is whether the goal is to create an industrial base that can make a chip with similar methods to the 1980s at scale, or whether they just need to create a single chip as the culmination of all their work. It also depends on how slow you're willing to go -- with enough RAM, you could emulate the 8086 on something like a 4004 at a slower but still usable speed. (C.f. ARM Linux running on an 8-bit micro[1]) If it's a single chip, they can do things that don't scale. Using a simpler processor increases yield dramatically, making it easier for them to get a working processor later. Corrosion might be a problem if they take a long time to build things, but they can use gold wiring for everything despite the cost.
If you imagine them as monk-scribes, I think a story could be made of them practicing and honing their craft 12 hours a day until they can hand-etch circuits using a microscope and mechanical tools to downscale each movement they make (Sidestepping the UV source for photlithography). The RAM requirements can be lowered by micro-weaving readonly data with rope-core memory in a tiny package.
Humans are surprisingly good at fine and accurate work. This would be an illuminated Bible or sand art, but at an unprecedented scale.
The biggest hurdle, I think, is the energy required for getting chemicals at high purities and performing vapor deposition. Maybe they could harness hydro power to generate electricity? Maybe they can burn coal or charcoal for heat? The wear on such a system might be too much to keep up with for them.<p>[1]:  <a href="http://dmitry.gr/?r=05.Projects&proj=07.%20Linux%20on%208bit" rel="nofollow">http://dmitry.gr/?r=05.Projects&proj=07.%20Linux%20on%208bit</a></p>
]]></description><pubDate>Tue, 29 May 2018 22:47:28 +0000</pubDate><link>https://news.ycombinator.com/item?id=17183447</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=17183447</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=17183447</guid></item><item><title><![CDATA[New comment by russellsprouts in "A New World’s Extraordinary Orbit Points to Planet Nine"]]></title><description><![CDATA[
<p>One of the criteria is that it has sufficient mass to reach hydrostatic equilibrium.</p>
]]></description><pubDate>Thu, 17 May 2018 20:41:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=17095476</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=17095476</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=17095476</guid></item><item><title><![CDATA[New comment by russellsprouts in "Ask HN: What human language features could be useful for the writing of code?"]]></title><description><![CDATA[
<p>I can't remember the name, but there is a language with type-named parameters. It's an object-oriented language inspired by Java.<p>It doesn't use "the" -- it's clear from context whether something is a type name or reference, so you just use "Node". To handle multiple variables of the same type, you can use Node, Node', Node'', etc.<p>It also supports phrasal methods, where arguments can appear in the middle of the method name. For example, what would be divide(x, y) could be defined as divide(x)By(y) instead.</p>
]]></description><pubDate>Sat, 07 Apr 2018 22:26:47 +0000</pubDate><link>https://news.ycombinator.com/item?id=16783372</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=16783372</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=16783372</guid></item><item><title><![CDATA[New comment by russellsprouts in "The ReMarkable E Ink Tablet"]]></title><description><![CDATA[
<p>I have one, and my biggest issue with the UI was the pen settings not being retained, but they did fix that in the latest update. Apparently they made some changes to improve battery life as well.</p>
]]></description><pubDate>Thu, 08 Feb 2018 02:37:25 +0000</pubDate><link>https://news.ycombinator.com/item?id=16329762</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=16329762</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=16329762</guid></item><item><title><![CDATA[New comment by russellsprouts in "MRAM-Like Device Could Make Logic Run Backwards"]]></title><description><![CDATA[
<p>It is true that reversible computers can solve the issue of necessarily losing heat due to entropy decreases, but current computers are still far too inefficient for entropy loss to be a concern.</p>
]]></description><pubDate>Fri, 08 Dec 2017 22:29:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=15882643</link><dc:creator>russellsprouts</dc:creator><comments>https://news.ycombinator.com/item?id=15882643</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=15882643</guid></item></channel></rss>