Run Haxe with instant startup and a JIT that optimizes your code as it runs. Memory is managed without a garbage collector.
Use the same Haxe codebase and runtime on Linux, macOS, Windows, and the web. WebAssembly goes through the same compiler and optimizations as native code, with output as a core module, WASI P2 component, or browser bundle.
Run from source with instant startup during development, then build a native binary to deploy. Includes the full runtime, threads, sockets, and NUMA-aware worker pinning.
Native builds on Apple silicon and Intel, with a worker pool that adapts to the available CPU topology.
Build native binaries with the MSVC toolchain, or use the tiered JIT to run from source.
Build a core module or WASI P2 component. Add --browser to generate an HTML harness for running it in a browser.
We wanted native code, fast iteration, and control over memory while keeping Haxe's types and macros. Rayzor brings those pieces together in one compiler. These choices guide the implementation.
We verify optimizations before shipping them. Drop insertion and required inlining run at every level, including -O0, because program correctness depends on them.
The compiler determines when to free memory, so there are no GC pauses during a frame. You can add ownership annotations one class at a time.
Dominance, loop structure and escape info are computed once and reused by every pass that needs them.
MIR collections use a stable iteration order to keep code generation reproducible.
Parsing, type checking, and bundling reuse cached work for unchanged modules. The cache is enabled by default.
Every target uses the same optimized MIR. Improvements to the shared passes carry through to both native binaries and WebAssembly.
Rayzor focuses on native code and WebAssembly. For JavaScript, Python, or PHP output, use the official Haxe compiler.
The compiler tracks where values are last used and inserts cleanup at those points. Add ownership annotations where you need to control sharing.
We run the same Haxe source on every target. Rayzor beats HashLink and the JVM, avoids JVM startup overhead, and outperforms hxcpp on floating-point workloads. Compilation takes tens of milliseconds, compared with hundreds on the other targets.
Short compile times make a difference when you run code throughout the day. Rayzor needs no C++ toolchain or JVM warm-up, and you can run source files directly. rayzor run starts executing while the optimizer runs. These are cold-build measurements. With the BLADE cache, unchanged modules are already compiled, so compilation on the second build is instant.
10 measured iterations, mean reported. AMD EPYC 7763 64-Core Processor, linux, x86_64, 2026-10-23.
Full results, regenerated by CI ↗execution only, mean of 10 measured runs · milliseconds, smaller is better
axis clips at 4× the fastest. ▸ marks a bar past the edge, real value labeled
The SIMD* types cover 128- and 256-bit vectors with float and integer lanes. You can use tuple and array literals, arithmetic operators, and methods such as dot, normalize, magnitude, and lerp. The compiler emits NEON, SSE2, or WASM SIMD128 instructions, with a scalar fallback where needed.
The interpreter supports vector types, and SIMD functions are compiled on their first call. Vector work runs as compiled code from the start, while startup stays instant.
SIMD types and backend support ↗Point Rayzor at a .hx file, or hand it the build.hxml you already have.
Rayzor determines cleanup at compile time, so long-running services avoid latency spikes from garbage collection. OS threads and channels handle concurrent work, and the server preset optimizes for processes that stay up.
Keep GC pauses out of the frame budget. Ownership annotations make allocation lifetimes explicit, and the JIT lets you iterate without waiting for a full build.
Write compute kernels with vector types, persistent worker threads, and explicit CPU affinity. The Nue inference engine below uses these APIs.
Nue runs local language models on the Rayzor runtime. The tokenizer, the quantized matmul kernels, the KV cache and the scheduler are all written in Haxe.
We benchmark every kernel against the Rust version it replaces. When Haxe is slower, we work on the kernel, thread pool, or compiler until it catches up.
Browse nue/ in the repoQwen2.5-0.5B, interleaved arms, medians, verified with zero FFI calls.
The Haxe k-quant kernel is faster than the Rust version. INT8 is within 5%, and the gap is narrowing. Nue uses FFI for platform APIs such as AMX, CoreML, and VNNI; the compute kernels stay in Haxe.
We're working on reading typed output from the official Haxe compiler and lowering it to Rayzor MIR. This would let you keep your existing frontend, macros, and libraries, with Rayzor handling native code generation, ownership, and tiered execution.
The aim is to compile your existing Haxe build to machine code without changing the source.
Follow the discussion ↗Current work includes standard library coverage and compiler optimizations. Both are good places to start contributing.