Thirty-two highlighted classes of bug that a language's design can enable, grouped by the Vog decisions that retire them. The comparison table narrows that catalog to the eighteen most load-bearing rows, then shows how Vog answers them without pretending every row has the same weight.
The page highlights thirty-two classes under six design invariants; the field comparison uses eighteen representative, load-bearing rows. A category can be closed more than one way, and the difference is the whole point. Collapsing them into a single brag is exactly the dishonesty this catalog exists to avoid.
Each invariant below retires several rows of the catalog at once. That coherence is why the result doesn't feel like a pile of special cases.
The eighteen most load-bearing error classes against eleven mainstream languages plus Elixir, Gleam, and Zig. A judgment summary of each language's defaults, not its most-disciplined possible use — a shop running only prepared statements, -Wshadow, and the race detector lands better than its column suggests.
| Error class | Py | JS | TS | Java | C# | C | C++ | Go | Rust | Swift | Ruby | Elixir | Gleam | Zig | Vog |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| HIGH SEVERITY · corruption, exploit primitive, data loss | |||||||||||||||
| Memory safety | Y | Y | Y | Y | Y | N | N | Y | Y | Y | Y | Y | Y | ~ | Y |
| Injection-safe sinks | N | N | N | N | N | N | N | ~ | N | N | N | ~ | N | N | ~ |
| Null safety | N | N | ~ | N | ~ | N | N | N | Y | Y | N | ~ | Y | Y | Y |
| Array-bounds safety | Y | ~ | ~ | Y | Y | N | N | Y | Y | Y | ~ | Y | Y | ~ | Y |
| Data-race prevention | ~ | Y | Y | N | N | N | N | N | Y | ~ | ~ | Y | Y | N | Y |
| Fully defined (no UB) | Y | Y | Y | Y | Y | N | N | Y | Y | Y | Y | Y | Y | ~ | Y |
| Integer-overflow safety | Y | ~ | ~ | N | N | N | N | N | ~ | Y | Y | Y | ~ | Y | Y |
| CORRECTNESS & RELIABILITY · silent-wrong answers, control-flow integrity | |||||||||||||||
| Arithmetic / calc errors | ~ | N | N | ~ | ~ | N | N | ~ | ~ | ~ | ~ | ~ | ~ | ~ | Y |
| Mandatory error handling | N | N | N | ~ | N | N | N | ~ | Y | ~ | N | ~ | Y | Y | Y |
| No hidden exceptions | N | N | N | N | N | Y | N | ~ | Y | Y | N | ~ | Y | Y | Y |
| Error-contract complete | N | N | N | ~ | N | N | N | N | ~ | ~ | N | N | Y | Y | Y |
| Exhaustive matching | N | N | ~ | ~ | ~ | N | ~ | N | Y | Y | N | ~ | Y | Y | Y |
| Immutable by default | N | N | N | N | N | N | N | N | Y | ~ | N | Y | Y | N | Y |
| No implicit coercion | ~ | N | ~ | ~ | ~ | N | N | Y | Y | Y | ~ | ~ | Y | Y | Y |
| REASONING & HYGIENE · legibility, maintainability | |||||||||||||||
| No reflection surprise | N | N | N | N | N | Y | ~ | ~ | Y | ~ | N | N | Y | Y | Y |
| No macro surprise | N | N | N | ~ | ~ | N | N | Y | N | ~ | N | N | Y | ~ | Y |
| Shadowing controlled | N | N | N | ~ | ~ | N | N | N | ~ | ~ | ~ | ~ | ~ | Y | Y |
| Simple op-precedence | N | N | N | N | N | N | N | ~ | N | N | N | N | ~ | ~ | Y |
On the high-severity band that matters most, the field compresses hard: Vog leads, but Rust, Swift, Gleam, and Elixir sit close behind, and even the memory-safe dynamic languages land within a point — because GC, bignum integers, and defined semantics already retire several rows for them. The honest read: Vog leads its nearest relative on all three bands, but the lead is one point or less, and it's widest exactly where the stakes are lowest.
| Language | High severity /7 | Correctness /7 | Hygiene /4 |
|---|---|---|---|
| Vog | 6.5 | 7.0 | 4.0 |
| Gleam | 5.5 | 6.5 | 3.0 |
| Rust | 5.5 | 6.0 | 1.5 |
| Swift | 5.5 | 5.0 | 1.5 |
| Elixir | 5.5 | 3.5 | 0.5 |
| TypeScript | 4.5 | 1.0 | 0.0 |
| Python | 4.5 | 1.0 | 0.0 |
| Ruby | 4.0 | 1.0 | 0.5 |
| JavaScript | 4.0 | 0.0 | 0.0 |
| Zig | 3.5 | 5.5 | 3.0 |
| Go | 3.5 | 2.5 | 2.0 |
| C# | 3.5 | 1.5 | 1.0 |
| Java | 3.0 | 2.5 | 1.0 |
| C | 0.0 | 1.0 | 1.0 |
| C++ | 0.0 | 0.5 | 0.5 |
Stripping away the categories Vog closes leaves a short, honest list. Naming it is the point — a catalog that only listed wins would be marketing, not rigor.
Vog is still in design — the repository isn't open yet, but it will be under appropriate open source licenses. No mailing list, no launch date; just the thinking, shared in the open until the code and compiler are ready to share.