~/opinions $ ./arena // choose_your_fighter

ON LANGUAGES

five languages enter the arena, ranked with love and violence

5 fighters 1 objectively correct list 0 questions taken

[01] ODIN

Programming used to be fun. Odin remembers.

Odin calls itself a language for the joy of programming, and for once the marketing is accurate. It is C, redesigned by someone who spent thirty years watching what actually goes wrong: no hidden control flow, no exceptions, no constructors running behind your back, no operator-overloading mystery meat. The call you read is the call that runs. fastr and Sakura are written in it, and writing them felt like play.

CLASS DATA-ORIENTED BRAWLER · TIER S

SPD
CTRL
SIMPLE
SAFE
TOOLS
JOY

moveset:

ult no package manager

And that's a feature. Dependencies are folders of code you can read; no registry, no lockfile, no left-pad, no supply chain roulette. core: and vendor: ship with the compiler, and what you vendor in, you own forever. Nobody can unpublish your build. full indictment ▸

passive context switch

Every allocation flows through the context's allocator. Arenas and temp allocators are idiomatic, not exotic: Sakura resets one arena per request and never calls free.

passive zero is initialized

Every value starts as useful zero, so the entire "forgot to initialize" bug family never spawns. The zero value is part of the design, not an accident of the allocator.

stance what you read is what runs

No exceptions, no hidden constructors, no operator overloading, no invisible copies. Control flow on the page is control flow in the binary. Reading code stays believing code.

combo data-oriented kit

Structs lay out the way you wrote them, #soa when the loop wants it, bit_set, fixed arrays, distinct types, defer, tagged unions. The machine is not an implementation detail, and the language never pretends otherwise.

buff fits in your head

Learn it in a weekend, stop thinking about it forever; the language never competes with the problem for your attention. Fast compiles, one static binary out the other end.

// status effects

  • EARLY ACCESSpre-1.0, and the spec still moves under you. Pin your compiler version and read the release notes.
  • HR SPEAKS JAVAnobody hires for it yet. You write Odin because you want to, not because a recruiter found you.
  • YOU ARE THE SAFETYmemory safety is your job; Odin hands you the gun loaded, grip first. I consider that respect. You might consider it a hole in your foot.

[02] RUST

The borrow checker is right more often than you are. That's the deal, and it's a good deal.

When other people run your code and the code holds keys, Rust earns its keep: Marmot's MDK and the guts of White Noise are Rust, on purpose. Use-after-free, double-free and data races don't get patched out; they get proven out, at compile time, with no garbage collector taking a cut at runtime.

CLASS COMPILE-TIME PALADIN · TIER A

SPD
CTRL
SIMPLE
SAFE
TOOLS
JOY

moveset:

aura borrow checker

Use-after-free, double-free and data races are removed from the game at compile time, with no GC tax at runtime. For crypto code strangers will run, that is not a nicety, it's the requirement.

passive exhaustive match

Sum types, Option and Result: errors are values the compiler refuses to let you ignore. "If it compiles, it works" is a meme because it keeps being true.

aura fearless concurrency

Send and Sync are proven at compile time, so threads stop being a 3am pager subscription. The hardest bugs in computing, made unrepresentable.

kit tooling from the future

cargo, clippy, rustfmt, rust-analyzer. No other systems language ships an experience this complete out of the box. It isn't close.

passive zero-cost abstractions

Iterator chains compile down to the loop you would have written by hand. The high-level code and the fast code are the same code, most of the time.

stance fenced unsafe

When you must touch raw pointers, the danger lives inside a labeled unsafe block you can grep. The audit surface of a million-line codebase shrinks to the parts that opted out.

// status effects

  • LONG CAST TIMEcompile times measured in coffee breaks. The proof has a price and you pay it on every build.
  • SPLIT PERSONALITYasync Rust and sync Rust are two games shipped on one cartridge, and the halves still argue about Pin.
  • CHECKER STUN-LOCKit also rejects programs you know are fine, so you end up architecting for the borrow checker instead of the problem.
  • CRATE GACHAcargo made dependencies so easy that hello-world pulls two hundred crates from strangers. Every one is a supply-chain bet you didn't mean to place.

[03] MODERN C++

Forty years of power tools in one trench coat. The chainsaw is in there too, and it's running.

Modern C++ (17 onward) is genuinely good: constexpr doing real work at compile time, span and string_view, smart pointers, RAII. Every operating system, browser, game engine and trading floor you touch has C++ load-bearing walls. Respect is owed, and paid.

CLASS ANCIENT DRAGON · TIER B

SPD
CTRL
SIMPLE
SAFE
TOOLS
JOY

moveset:

passive zero-overhead engine

Templates and constexpr compute before the program even exists; you pay only for what you use. When C++ is fast, nothing on this list beats it.

aura RAII

Deterministic destruction, the one mechanic every later game copied: Rust's Drop, Odin's defer, C#'s using. C++ had it first and still does it best.

hoard the treasure pile

Whatever you need, a battle-hardened C++ library already exists, has existed for fifteen years, and survived workloads that would vaporize your weekend project.

ult constexpr time magic

Run real programs while compiling the program. Lookup tables, parsers, whole data structures baked into the binary before it boots.

passive never breaks a save

Code from 1995 still compiles in 2026. Backwards compatibility this deep is a superpower for the people who own the code. It is also how the hoard got this big.

kit sanitizer squad

ASan, UBSan, TSan, MSan: run the test suite under them and whole categories of heisenbugs surface with stack traces attached. The dragon comes with its own X-ray machine.

// status effects

  • UB BREATHundefined behavior hides in a signed integer near you. One overflow and the dragon eats your program, no save point, and the optimizer swears it did nothing wrong.
  • DIALECT FRAGMENTATIONevery codebase is its own language. Hire two C++ devs, get three opinions about exceptions.
  • COMMITTEE CREEPfeatures land faster than anyone can deprecate the old ones. The language grows; it never sheds.
  • CMAKEnot a build system, a punishment. The strongest fighter on the roster spends half its turns fighting its own equipment.

[04] TYPESCRIPT

A genuinely great type system bolted onto a runtime that was designed in ten days. It's alright.

Credit where due: unions, narrowing, generics and mapped types model real data better than most compiled languages manage. This very site is TypeScript on Bun, and the language is not the problem. The language was never the problem.

CLASS ILLUSIONIST · TIER C

SPD
CTRL
SIMPLE
SAFE
TOOLS
JOY

moveset:

passive type narrowing

Discriminated unions plus control-flow narrowing is the best everyday type UX in the industry. Strict mode catches whole classes of nonsense before it ships.

stance structural typing

Shape matters, not lineage. If it has the fields, it fits the type: the way data actually works, formalized instead of fought.

aura infinite range

The only runtime sitting in every pocket and every browser tab on earth. Reach matters, and nothing else has it.

buff bun

One fast tool where node + npm + webpack + jest used to be. This site is served by one Bun.serve() call, zero config, and that's the whole stack.

passive inference engine

Write the code; the compiler works out the types. Annotations only where they earn their keep, and the hover tooltip knows more about your data than you do.

stance gradual adoption

Rename one .js file at a time and tighten as you go. Types arrive without a rewrite, which is the only reason any large JS codebase ever got them.

// status effects

  • NODE_MODULES GRAVITY WELLthe dependency tree has the mass of a small moon and its own weather.
  • NPM ROULETTEa supply-chain attack with a registry attached. Every install is a trust decision you didn't get to review.
  • FRAMEWORK CHURNthe framework of the week has a half-life of eighteen months, and the migration guide assumes you already migrated.
  • COSTUME BREAKS AT RUNTIMEthe types are an illusion the compiler maintains for your benefit; at runtime it is all JavaScript underneath, and any is one keystroke of surrender away.

[05] PYTHON

Executable pseudocode. Wonderful for learning, fine for fifty-line scripts, and somehow we ship banks on it.

The good parts are real: it reads like the back of a napkin, it is the best first language ever made, and there is a library for everything because every scientist on earth picked it. None of that is why it's down here.

CLASS SUMMONER · TIER F

SPD
CTRL
SIMPLE
SAFE
TOOLS
JOY

moveset:

passive the on-ramp

Nothing gets a human from zero to "I made the computer do a thing" faster. That has real value and Python deserves the credit, all of it.

ult summon C library

numpy, torch, the entire scientific stack: Python wins every fight by calling something written in C, C++ or CUDA. The summons are legendary. The summoner is level 1.

active duct tape

As glue between real systems it's honestly great. Ten lines, no ceremony, job done, everyone home by five.

active the REPL

Poke the problem interactively until it confesses. For exploration and one-off analysis, this loop is genuinely hard to beat.

kit batteries included

The standard library ships an http server, sqlite, json, csv, zip and an email client in the box. For a teaching language, the box is genuinely impressive.

aura already installed

It is sitting on every Linux box, every Mac and every server you'll ever ssh into. Zero-install reach is a real superpower, even if it's the distro's copy from 2021.

// status effects

  • 1 SPDslow in the way that makes you check if something is broken. The benchmark didn't hang; it's just Python.
  • GIL STUNthirty years of making your other fifteen cores decorative. The fast path is summoning C, which concedes the argument.
  • PACKAGING HYDRApip, venv, conda, poetry, pipenv, now uv. Cut off one head, two more package managers appear, and "works on my machine" is still the deployment story.
  • COSMETIC TYPEStype hints exist and nobody enforces them, so every big refactor is a prayer with CI attached.
  • PRODUCTION TRAPPython doesn't suck at being Python. It sucks because we keep shipping production systems in a teaching language.

[06] THE POINT

Simple beats clever. Explicit beats magic. The machine is not an implementation detail.

That's the whole rubric. The top of this list respects the reader and the hardware; the bottom respects neither and calls it developer experience. Pick whatever fighter ships your thing, just know what it's costing you, and never let anyone tell you the costs aren't real because computers got fast.

// yes the list is objective. no i will not be taking questions.