Signum has four code-generators in the same tree. The language surface does not change; the backend you pick affects speed, portability, and debugging.
1. Tree-walking interpreter
Everything in src/interpreter/. The default for development and the engine this website runs. Starts in milliseconds; perfect for the playground.
2. AOT — codegen_c
src/codegen/ emits portable C that links against signum_rt.h. Compile once with any C compiler, ship a native binary. Deterministic; the output is reproducible across machines.
3. JIT — asmjit
src/jit/ generates machine code at run time via asmjit. Used by long-running tools that benefit from a warm compile step.
4. LLVM skeleton
src/ir/ plus LLVM glue produces an LLVM module for whole-program compilation. Still a skeleton compared to the three above, but the shape is in place.
You get the same semantics everywhere. If a program behaves differently across backends, it's a bug — the test-aot gate exists precisely to catch that.