purplesyringa's blog
Alisa Sireneva
Hi! đź‘‹ I'm Alisa Sireneva (she/her), a software developer and blogger from Moscow. I specialize in performance optimization and systems programming. I also have experience with security, compression, and decentralized systems. My primary goal as a writer is to teach the concepts I regularly apply through accessible content.
August 2026
September 2026
October 2026
Top Words
- rust
- code
- performance
- minecraft
- inheritance
- useless
- python
- thoughts
- recovering
- fast
- exceptions
- optimization
All posts (66)
Superoptimization is the process where a compiler automatically finds the optimal sequence for a loop-free sequence of instructions. – Wikipedia Compilers are good at making mechanical transformations that make code faster. Unfortunately, most of them are not as good at non-trivial reasoning, so they can’t invent a...
I started speedrunning Minecraft a while ago. It’s an interesting niche with many tutorials and a helpful community, so all the information you need is freely available. But I used to struggle a lot, because it wasn’t clear to me how to learn to execute this stuff – partially because my hand-eye coordination and...
vfmaddrnd231pd is a unique instruction from the FMA instruction set. Most instructions in that set have mnemonics like vfmadd231pd, but here rnd means something very specific. The Intel Software Development Manual documents it as: VFMADDRND231PD – Fused Multiply-Add of Packed Double-Precision Floating-Point Values...
clz and ctz are instructions that compute the number of leading (trailing) zero bits in a fixed-size integer. They are natively supported by modern CPUs, though they are not always fast, e.g. tzcnt has a latency of 3 on Arrow Lake. I used ctz in an FPU emulator I’m working on, but figured out how to avoid it with...
I’ve been thinking about where I stand in respect to the current state of the industry. This is more of a journal note than a post, apologies for that. I usually leave this stuff private, but I thought I’d post this as a trial in case someone relates to this experience and feels less alone. All opinions are my own.
When learning new topics, we always ask questions we can’t find answers to. “Why are there two APIs that do seemingly the same thing?” “How do I achieve this goal?” “Why does this code not work even though it looks similar to the example?” As we research and get more familiar with tools, we gain understanding. At...
So I’ve been meaning to write about something, but got sucked into this rabbit hole, and now I’m kinda scared if I’ve been a subject of propaganda that worked on me. A common theme in software development AI discourse is that there are “serious” engineers who value the end result the most, and “artisanal” coders who...
While I’m taking a short break from low-level programming, here’s a story by a friend of mine, Sonya, about debugging a seemingly impossible bug in ARM code. This bug hunting saga started several months ago. While developing a bare-metal hypervisor on ARM64 for postmarketOS, I hit a strange bug: if I enabled the...
This post is about Windows. Last time we saw that sockets are pretty much just handles, and as such, they can be inherited. If a process creates an inheritable socket and runs CreateProcess with the appropriate parameters, its children will retain access to the socket. This has obvious security and functional...
WinAPI represents most “things” as HANDLEs: files, cross-process mutexes, threads, jobs, etc. Sockets, however, are a notable exception: while on Unix systems they’re no different from files, Windows denotes them by a different type: SOCKET. The reason for this is that sockets are a userland abstraction provided by...
Last time, I found out that Rust’s implementation of subprocesses on Windows makes it impossible to spawn children that inherit selected handles without race conditions. Even if you do everything by the book, a simultaneous call to std::process::Command can inherit handles meant for another process. Since this...
Say you’re writing a Windows IPC library for Rust, and you want to pass a handle to a child process. Maybe it’s a pipe, maybe it’s a file, maybe it’s a broker process handle. It turns out that there’s no correct way to do so due to Rust’s idiosyncrasies. WinAPI trivia time! The CreateProcess function, which is used...
Page 1 of 6