🎉 Blaise v0.11.0 is here! #126
graemeg
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
-
This is our biggest release yet — 237 commits since v0.10.0, and easily
the one I'm most excited to share. If v0.10.0 was about making the compiler
self-hosting and fast, v0.11.0 is about making the language comfortable to
write in and bringing the native x86-64 backend up to full parity with QBE.
Let's dig in. 🚀
🏗️ A second backend that's now a first-class citizen
Since its introduction, the native backend was the experimental sibling — handy
for debugging, but QBE did the real work. That's no longer true. This cycle
the native x86-64 backend learned almost everything QBE already knew:
is/as/SupportsInc/Decon fields, derefs and var params; full ARC for const-string argsFormat()with%f/%e/%g, width and precisionAnd — the part that proves it — Blaise can now builds itself with the
native backend, and we added a dedicated
fixpoint-native.shthatverifies the native compiler reproduces itself byte-for-byte. Two independent
backends, both reaching a self-hosting fixpoint. 🔁
🔗 Towards a self-contained toolchain
A long-standing goal is a single
blaisebinary that needs no externaltools. Two big steps landed this cycle:
--assembler internal) — the native backend can nowemit ELF object files directly, no external assembler required.
ar-archive reader anda section merger, the foundation for replacing the external
cc/ldlinkstep entirely.
The linker is a multi-phase journey and it'll be the headline of v0.12.0 — but
the groundwork is in and tested. 🧱
✨ Language features that make day-to-day code nicer
A whole cluster of quality-of-life additions:
🔢 Compile-time constant folding — integer and floating-point, plus
multi-dimensional array constants:
📐 Static arrays grow up — multi-dimensional, named-constant and expression
bounds, and enum-indexed arrays:
🎯 Sets, properly —
set of Byte/Boolean, ranges in literals,subset/superset operators, and "jumbo" sets up to 256 members:
🪄 Default array properties —
Obj[I]sugar, includingList[i]onTList<T>:🧬
inherited Method()in expression position plus implicit integer→floatwidening for math builtins:
for..inover a string iterates codepoints, plus newStrUtils codepoint helpers (with SIMD-accelerated counting under the hood):
🛡️ Every variable starts zeroed — guaranteed
This one is a language semantic, not just a feature: Blaise now guarantees
that every variable is zero-initialised before you can read it. Integers start
at
0, floats at0.0, pointers/classes/interfaces atnil, strings empty, andrecords and arrays are recursively zeroed.
No more "works on my machine" bugs from an uninitialised local. It also closed a
subtle cross-backend gap: the native backend used to leave scalar locals as
stack garbage while QBE zeroed them, so the same program could print different
output depending on the backend. Now both backends behave identically — the
guarantee is part of the language, not an accident of codegen. 🎯
🐞 Hardening, hardening, hardening
This release fixed 116 bugs — the vast majority in codegen and the maturing
native backend. If you hit an edge case with records, interfaces, generics,
dynamic arrays, var parameters or ARC ref-counting in an earlier version,
there's a good chance it's gone now. Integer
div/modby zero now raises acatchable
EDivByZerorather than crashing. 🧯🔍 Native-first debugging with pdr
The OPDF debug emitter now records exact frame offsets and statement-level
line info from the native backend, with full field drilldown for records,
classes and
Self.--debug-opdfbinaries link as proper PIE executables, sodebugging under pdr "just works" — and every debug session dogfoods the native
backend we're hardening. 🐧
You can get the pdr (OPDF) debugger from the github project page.
⚡ Faster, too
Hash indexes for
TDictionary/TSet/TStringList.Find, overload-group lookupin the semantic pass, stack buffers for
Format/WriteDecimal, andSIMD-accelerated UTF-8 counting all shaved real time off compile and runtime.
📊 The numbers
🙏 Grab it and let us know
The release is on the GitHub releases page — a single self-contained
Linux x86-64 tarball. See the release changelog for the full technical breakdown.
As always, feedback, bug reports and "I tried to compile this and it broke" are
hugely welcome — that's exactly how this release got so much sturdier. 🛠️
Onwards to v0.12.0 and the internal linker! 🙌
Built with ❤ for the Pascal community.
Beta Was this translation helpful? Give feedback.
All reactions