Some releases add a language. This one measures and tidies, and three items in it will break a build somewhere. We would rather say so plainly, in advance, than let anybody discover it from a linker error or a refused flag.

What breaks

Three spellings change. The first is on disk, the other two are on the command line, and every one of them is refused by name with the new spelling in the message, so the fix is never a search.

The archives are renamed

The static archives Mica installs are renamed. If your build names one of them by path — a Makefile linking the Dragon runtime, a script that vendors an archive, a compiler of your own built on the SDK — that path changes in 7.5:

Before 7.5From 7.5
libmicadragon-rt-<arch>.amica-dragon-rt-<arch>.a
libmicadragon-rt-fixedarena-<arch>.amica-dragon-rt-fixedarena-<arch>.a
libmicadragon-rt-mc-<arch>.amica-dragon-rt-mc-<arch>.a
libmicadragon-rt-fixedarena-mc-<arch>.amica-dragon-rt-fixedarena-mc-<arch>.a
libmicadragon-<arch>.amica-dragon-<arch>.a

mica-stdlib-<arch>.a is unchanged; it already read the right way, which is part of what made the others look wrong beside it.

Nothing else moves. The header is still mica_dragon.h at /usr/include, the packages are still mica, mica-dragon-rt and mica-dragon-sdk, the symbols inside the archives are untouched, and a program you have already built and shipped is unaffected — this is a change to filenames on disk, not to anything a compiled binary carries. Upgrading the packages replaces the old files with the new ones; nothing is left behind to shadow anything.

If you do not name these files yourself — if you write Mica and let the compiler find its own archives — you will not notice this at all. The compiler resolves them without being told, and it resolves the new names.

hosted is spelled hosted-heap

The memory deployment class that links the ordinary heap is selected as --memory-class hosted-heap. The value was hosted; every other value on that flag and on --platform already names itself with a hyphen — fixed-arena, utf-8, utf-32 — and the odd one out is now spelled like its neighbours. The old spelling is refused, and the refusal states the new one. A build that never names the class — the default is the hosted heap — notices nothing.

A bare checked selects the release profile

--optimize checked now means release,checked: every guard on, on the optimizing lowering. Until 7.4 the bare word implied the debug profile, and release,checked silently dropped its guards. Both readings are gone. checked is a flag beside either profile, O2,checked keeps every guard on the release code, and debug,checked is the build that keeps every variable observable at the trap. If a script of yours spells checked alone and wants the debugger’s view, it now spells debug,checked; if it spelled release,checked and got no guards, it now gets them, and the program it builds may stop at a line it used to run past.

Why we are doing it, and why now

The old name was a fossil. libmicadragon came from a build command years ago, when the archive was a Go build product and its filename was whatever the build mode produced. Everything the product has shipped since then reads mica-something: the packages, the standard library, the header, the commands. One family of files kept a spelling nobody would choose today, in a form that told you nothing about which package installs it.

The other two are the same kind of thing at the command line: a value that did not read like its neighbours, and a flag whose two spellings meant two different builds without saying so.

That is a small thing. Small things are exactly what accumulates. A product line acquires its shape from a hundred decisions like this one, and the moment to fix them is while the number of people affected is still small enough to apologise to individually — not in two years, when the same rename would be an event rather than an inconvenience.

So: sorry. It is a real interruption, it is our doing rather than anything you did, and the only defence we will offer is that we did it early and told you before it landed rather than after.

What you get for the interruption

We would rather not ask for the interruption without offering something for it, so here is the rest of 7.5 — and it is deliberately the half that is felt every day rather than the half that photographs well:

  • Numbers you can re-measure. The benchmark kernels run against their C twins on named, rentable machines, by wall clock, with every safety check on, and the tables carry the machine, the date and the compiler’s own version line. Every kernel’s instruction count is pinned and checked at every merge, so a slower compiler cannot arrive unannounced.
  • Less memory, and a report that says why. Strings are reclaimed when they are superseded, a value is moved instead of copied when its source is about to die, and an allocation no longer walks every cell ever allocated. Technical Report 1 states where every byte of a program lives and what the compiler proves about it.
  • A compiler that optimizes its own library properly. Part of the standard library was being built at a level below the one its own C half was built at. Correcting that was not a switch — it turned up real defects in the optimizer that no build had ever exercised — and the work is the kind that makes every program a little faster without anyone writing a line.
  • Faults named, not proceeded past. An adversarial sweep of 283 programs written to be wrongly accepted found forty-one, and every one is now a refusal that names its rule. The wrong-code and hang classes that instruments found are fixed on both architectures, and the compiler’s own gates state every contract its code generator demands.

Beyond that, the polish itself: every place the product describes itself is being read against what the product actually does, and the differences are being fixed rather than noted.

That is the honest trade we are offering. A path in your build file changes once, two flags spell themselves consistently; in exchange, your programs run in less memory, a checked build costs a fraction of what it did, and the compiler names what it used to let through. We think that is a fair swap, and if you disagree we would genuinely like to hear it.

Two things this post first promised for 7.5 arrive in 7.5.1, the release that follows it directly: reading your program’s environment — environment variables, command-line arguments, a flags surface — and starting and controlling other programs; and the editor’s next step — profiles read beside the source, viewers for the compiler’s export files. Neither needs a language change, so neither waits for the GPU release. The device work — Mica generating GPU kernels for suitable expressions — moves to 7.6. It is the larger and more interesting story, and it is better served by a release that is about it than by one where it shares a page with a rename.

What you should do

If you name a Mica archive in a build, change the path when you take 7.5; if a script of yours spells --memory-class hosted or a bare --optimize checked, change the spelling, and read what the bare checked now builds. If none of that is you, take 7.5 and carry on. Either way, if this costs you time we did not warn you about, tell us — info@mica-dev.com — because a rename that catches somebody by surprise is a failure of this page, not of your build.