Floati compiles JavaScript with its own compiler, Updraft: about a hundred times faster to compile, and compiled code no longer piles up
Floati now turns hot JavaScript into machine code with a compiler of its own, Updraft, starting with its first tier, Gust. Until now that job went to a general-purpose code generator (Cranelift) built for many kinds of programs. Gust is built for this engine alone: it compiles a function in well under a microsecond per operation, about a hundred times faster than before, and the memory holding compiled code is given back once no page needs it, where before every compiled function kept its memory for as long as the browser ran. Code that becomes hot still moves on to the optimizing compiler, so pages run at least as fast as before. Long sessions also stay leaner: memory that is waiting to be freed is now kept bounded, so a page that rebuilds large structures in a loop peaks at about a fifth of the memory it used to. Two correctness bugs were fixed on the way.
Why Floati builds its own compiler
Floati is built from scratch so that every layer can be shaped for one job: showing the web quickly and privately on your own machine. Until this release, one important layer was borrowed: hot JavaScript was compiled to machine code by Cranelift, a general-purpose code generator made for many kinds of programs. It produces good code but pays for its generality: about a hundred microseconds per operation to compile, five internal copies of every function while it works, and machine code that was never given back. Updraft is Floati's own compiler, built in tiers. Gust, the first, writes ARM64 machine code directly from the engine's own plan of each function, using the same frame layout as the interpreter, so moving between the interpreter and compiled code needs no translation, and it frees compiled code when no page needs it. Thermal, the optimizing tier, comes later. The decision has one rule: Cranelift leaves Floati only when Updraft is better on every measured axis (compile time, run speed, real pages, memory, code size, correctness, safety, profiling) on every platform Floati runs on. Until then the two run side by side, and hot code still moves on to Cranelift's optimizing code.
Gust learned the engine's fast paths
A first compiler that only copied plain operations would leave most of the work to slow general helpers. Gust answers the common cases inline, as the optimizing compiler does: method calls such as Math.max and push, reading an object by a computed key, comparing two strings, for-in over an object, and the remainder of two whole numbers, and compiled functions call each other directly. Each fast path keeps its exact meaning: a frozen array still refuses push, a replaced Math.max is called, and a key added to a prototype in the middle of a run is seen. On a page-building benchmark, code running in Gust alone went from 49 to 20 milliseconds.
Long sessions stay lean
When a large structure is no longer needed, Floati frees most of it on a helper thread so the page does not pause. When a page threw away big structures faster than the helper could free them, they queued up: rebuilding a thousand page trees in a loop held over a gigabyte of dead memory at its peak. The queue is now bounded, and past the bound the page frees the next structure itself, so dead memory stays small while the helper still shares the work. The allocator also stopped scanning every memory page it owns to find memory freed by other threads; it now visits only the regions that were touched.
What changed 7 changes
Try it in your browser
Each check runs live in the browser you are reading with. Nothing is sent anywhere.