Volver a las comparativas
Runtime de TypeScript

Perry frente a Bun

Bun es un runtime, bundler, gestor de paquetes y test runner todo en uno para JavaScript/TypeScript que también puede producir ejecutables de un solo archivo empaquetando su runtime junto con tu código. Perry toma otro camino: compila TypeScript directamente a código máquina nativo a través de LLVM — sin motor JavaScript en el binario, sin runtime, solo un pequeño ejecutable nativo. Bun y Perry coinciden en producir un binario a partir de TS, pero discrepan sobre si un motor JavaScript debe estar dentro de ese binario.

¿Qué es Bun?

Bun es un kit todo en uno rápido para JavaScript y TypeScript construido en Zig. Ejecuta directamente código `.ts` (sin paso de precompilación), usa JavaScriptCore como motor JS e incluye un bundler, un gestor de paquetes y un test runner. `bun build --compile` empaqueta el runtime de Bun junto con tu aplicación en un único ejecutable. Bun apunta a Linux, macOS y Windows en x64 y arm64.

¿Qué es Perry?

Perry es un compilador nativo de TypeScript escrito en Rust. Compila TypeScript directamente a código máquina nativo a través de LLVM — sin motor JavaScript, sin runtime, sin JIT. La salida es un único binario (alrededor de 330 KB para un hello world; ~48 MB para una app completa con stdlib como un servidor Fastify). Perry apunta a 10 plataformas, incluyendo macOS, iOS, iPadOS, Android, Linux, Windows, watchOS, tvOS, WebAssembly y la Web.

Lado a lado

CaracterísticaPerryBun
SalidaCódigo máquina nativo (LLVM)Tu código + el runtime de Bun empaquetados en un binario
Motor JavaScript en el binarioNinguno por defecto; V8 opcional con --enable-js-runtime (+~15 MB)JavaScriptCore, siempre
Tamaño del binario hello world~330 KB~50–100 MB (incluye el runtime de Bun)
JITNo (compilado AOT)Sí (JIT de JavaScriptCore)
Plataformas móviles (iOS, Android)Sí — UI nativa vía UIKit/JNINo
Plataformas Watch / TVwatchOS, tvOS, Wear OSNo
Widgets de UI nativa25+ vía AppKit, UIKit, GTK4, Win32, JNINo (enfoque servidor/CLI)
Ecosistema npmLos paquetes TS/JS puros pueden compilarse a nativo; el resto vía V8 opcionalnpm completo compatible con Node
EstabilidadPre-1.0 (alpha)Estable (1.x)
Construido enRustZig

Dónde gana Perry

  • +Binarios más pequeños — un hello world de Perry es ~330 KB; un hello world de Bun --compile incluye el runtime de Bun y se sitúa en decenas de megabytes.
  • +Sin coste de motor JavaScript. Los binarios compilados con Perry no llevan intérprete ni JIT — tu TypeScript es el ejecutable.
  • +Móvil, watch y TV. Perry compila a iOS, iPadOS, Android, watchOS, tvOS y WebAssembly. Bun es solo servidor/escritorio.
  • +UI nativa. El módulo perry/ui de Perry compila a widgets reales de cada plataforma (AppKit en macOS, UIKit en iOS, GTK4 en Linux, Win32 en Windows, JNI en Android). Bun no tiene historia de UI.
  • +Más rápido en la mayoría de microbenchmarks de cómputo medidos en condiciones equivalentes en M1 Max (RUNS=11, v0.5.279, 2026-04-25): fibonacci 318 ms vs Bun 589 ms; object_create 1 ms vs 6 ms; nested_loops 18 ms vs 21 ms. Consulta perry/benchmarks para la tabla completa.
  • +Más rápido en validate-and-roundtrip de JSON dentro del pelotón de tipado dinámico: la cinta JSON perezosa de Perry aterriza en 75 ms de mediana frente a los 259 ms de Bun en la misma carga de 10k registros.

Dónde gana Bun

  • +Runtime maduro y estable con releases 1.x. Perry está en pre-1.0.
  • +Más rápido en parse-and-iterate de JSON (donde se toca cada valor): Bun 254 ms vs Perry 466 ms de mediana en la misma carga — la cinta perezosa de Perry no puede tomar atajos cuando se fuerza la iteración.
  • +Ecosistema npm completo compatible con Node de fábrica. Perry ejecuta un subconjunto a nativo y recurre a un V8 embebido opcional para el resto.
  • +Test runner, bundler y gestor de paquetes integrados. Perry es un compilador — el tooling adyacente va aparte.
  • +El rendimiento con JIT caliente puede superar al AOT en código dominado por iteración con bucles internos calientes; Perry no tiene JIT.
  • +Empatado con Perry dentro del ruido entre ejecuciones en `loop_data_dependent` (232 ms vs 235 ms) — el kernel f64 genuinamente no plegable donde el compilador de ninguno de los dos puede reordenar. Fuente: perry/benchmarks RUNS=11.

Cuándo elegir Perry

Elige Perry cuando importe el tamaño del binario (distribución móvil, contextos embebidos, arranques en frío rápidos), cuando quieras llegar a móvil/watch/TV desde un único código TypeScript, cuando quieras widgets de UI nativa o cuando no quieras un motor JavaScript dentro de tu artefacto distribuido.

Cuándo elegir Bun

Elige Bun cuando necesites hoy un runtime estable y maduro, cuando la compatibilidad total con npm sea innegociable, cuando quieras una sola herramienta para runtime + bundler + gestor de paquetes + test runner, o cuando el rendimiento con JIT caliente en cargas de larga duración te importe más que el tamaño en arranque en frío.

Veredicto

Tanto Bun como Perry te permiten distribuir un programa TypeScript como un único binario, pero responden a preguntas distintas. El binario de Bun contiene el runtime de Bun y está optimizado para cargas backend/CLI donde ganan el JIT y la compatibilidad total con Node. El binario de Perry no contiene motor JS y está optimizado para tamaño, arranque en frío, móvil y UI nativa. Si distribuyes un servidor, Bun está hoy más probado. Si distribuyes una app nativa o te importa el tamaño del binario, Perry está pensado para ese caso.

Prueba Perry

Compila tu TypeScript a nativo hoy mismo.

Comenzar