Three different meanings of “compile”
Transpile
TypeScript compilers and bundlers can emit JavaScript. That output still runs in Node.js, Bun, Deno, or a browser.
Bundle a runtime
Bun, Deno, and Node SEA can produce one file by packaging the program with their runtime or executable machinery. Consult each tool's documentation for its exact format.
Ahead-of-time compile
Perry parses with SWC and uses LLVM to emit machine code for supported behavior, then links the Perry runtime and GC.
What is actually in a Perry binary?
The file contains compiled application code plus the Perry runtime pieces required by the program. It is therefore accurate to say that no external JavaScript runtime installation is needed; it is not accurate to say that Perry has no runtime at all. Native builds use a garbage collector, object and string support, async machinery, and other linked helpers. The optional V8 fallback adds an embedded JavaScript engine when enabled.
The public examples show a hello-world binary around ~330 KB and the Mango application around ~7 MB. Those are examples, not a promised range. Output size changes with the target, imports, build profile, standard-library surface, debug information, and optional V8 fallback.
Compatibility and targets
Perry documents 11 targets plus a separate HarmonyOS preview. Web and WASM are aliases for one backend. Platform SDKs, host tools, signing credentials, and UI/API depth differ by target, so cross-compilation is not an unconditional “build any target from any host” promise.
Perry reports ~97% of its tracked Node suite across 53 modules and roughly ~50 package/API implementations. That does not mean every npm package or JavaScript feature works. Run perry check and test the real application against the published limitations.