Software Development
-

Non-Lexical Lifetimes: How Rust Taught the Borrow Checker Where a Reference Actually Dies
One decision, nine years to ship: stop measuring a borrow’s lifetime by curly braces, start measuring it by last use.…
Read More » -

Parser Combinators vs. Parser Generators: Why Tooling Keeps Choosing the Former
A grammar file and a build step, or a handful of composable functions. The industry’s answer has been drifting for…
Read More » -

How to Use Subqueries in SQL
Subqueries are advanced features in SQL for solving problems that require more than a single level of filtering, comparison, or…
Read More » -

WebAssembly and the JVM: Two Answers to “Write Once, Run Anywhere”
Same bet, twenty years apart: a portable bytecode format run by a sandboxed virtual machine. In 1995, Sun Microsystems built…
Read More » -

F#: The Functional Language Enterprises Could Actually Adopt
It shares the runtime, the packages, and the debugger with C#. That still was not enough. Elixir asks a team…
Read More » -

CUDA and the Vendor Lock-In Problem in GPU Programming
NVIDIA’s dominance in AI hardware is a software story as much as a chip story. Comparing CUDA, AMD’s ROCm, and…
Read More » -

Bash and PowerShell: Two Genuinely Different Philosophies of Scripting
Text streams versus typed object pipelines. It looks like a syntax difference. It is actually a disagreement about what a…
Read More » -

D’s Forty-Year Identity Crisis
Garbage collection, manual memory management, and metaprogramming were all offered as options rather than defaults. That flexibility was the entire…
Read More » -

Hardware Description Languages: Programming’s Strangest Corner
VHDL and Verilog look like ordinary programming languages, right up until you realize every line of a module runs at…
Read More »


