Compila TypeScript a un binario

Un comando convierte main.ts en un ejecutable nativo independiente. Sin Node.js en la máquina de destino, sin runtime empaquetado, sin paso de instalación para tus usuarios.

terminal

$ perry compile main.ts

✓ Compiled executable: main (2.3 MB)

$ ./main

Hello, World!

Tres cosas que la gente llama «compilar TypeScript»

Cuando los desarrolladores buscan cómo compilar TypeScript a un binario, normalmente se topan con tres técnicas muy distintas que comparten una palabra:

  • Transpilación. tsc, SWC y esbuild convierten TypeScript en JavaScript. La salida todavía necesita Node.js, Bun o un navegador para ejecutarse. No hay ningún binario involucrado.
  • Runtime embebido. bun build --compile, deno compile y las Single Executable Applications (SEA) de Node.js concatenan tu JavaScript empaquetado con una copia completa del runtime. Obtienes un único archivo, pero el motor viaja dentro de él y tu código se sigue parseando y compilando con JIT cada vez que arranca el proceso.
  • Compilación nativa anticipada. Esto es lo que hace Perry. TypeScript se parsea con SWC, se resuelven los tipos, los genéricos se monomorfizan y LLVM emite código máquina. El linker produce un ejecutable normal — el mismo tipo de artefacto que produce un toolchain de Rust, Go o C++. No hay ningún motor de JavaScript en el binario.

Como no hay ningún motor que arrancar ni nada que parsear al inicio, un binario de Perry arranca en aproximadamente un milisegundo. La pipeline en sí se describe con más detalle en la página compilador nativo de TypeScript y en los internos del compilador.

¿Qué tamaño tiene el binario?

El tamaño depende de lo que incluyas, porque solo se compila y enlaza el código que realmente usas:

  • Un hello world ronda los 330 KB.
  • Las herramientas CLI típicas se sitúan en 2–5 MB.
  • Las aplicaciones completas que enlazan frameworks grandes (Fastify, mysql2 y similares) rondan los 48 MB.

Para contrastar: un ejecutable Node SEA es una copia del binario node en sí, así que arranca en torno a 88–118 MB según la plataforma antes de añadir tu código, y un hello world compilado con Bun mide unos 60 MB en macOS arm64 y alrededor de 100 MB en Linux x64, porque se embebe el runtime completo de Bun.

Perry frente a bun build --compile frente a Node SEA

Los tres te dan un único archivo que puedes entregarle a alguien. Por lo demás son herramientas muy distintas, y cada una es la respuesta correcta para alguien:

Perrybun build --compileNode SEA
Qué produceCódigo máquina compilado con AOT (LLVM)JS empaquetado + runtime de Bun embebidoCopia del binario node con tu script empaquetado inyectado
Modelo de ejecuciónCódigo nativo, sin motor JSJIT (JavaScriptCore) en runtimeJIT (V8) en runtime
Tamaño del hello world~330 KB~60 MB (macOS arm64) a ~100+ MB (Linux/Windows)~88–118 MB (tamaño del binario node)
Arranque~1 ms~10 ms~30 ms
Compilación cruzada10 plataformas, incluyendo Windows/macOS/iOS desde LinuxSí — Linux, Windows, macOS mediante --targetNo — en su lugar, copia un binario node específico de cada plataforma
Compatibilidad JS/npmCreciente: axios, zod v4, express, fastify y hono compilan de forma nativa; fallback opcional con V8 para el restoTotal — es el runtime de BunSemántica completa de Node; requiere empaquetado previo, solo CommonJS en Node 24 LTS
EstadoPre-1.0EstableEstabilidad «en desarrollo activo» en Node 24 LTS

Con honestidad: si tu aplicación depende del ecosistema npm completo y quieres cero riesgo de compatibilidad, Bun y Node SEA ejecutan exactamente la semántica del motor contra la que ya desarrollas — esa es su fortaleza, y el coste en tamaño puede no importarte para tu despliegue. Perry es una apuesta distinta. Obtienes compilación anticipada real, binarios pequeños y arranque en milisegundos; a cambio, adoptas un compilador pre-1.0 cuya conformidad con JavaScript se mide y se publica (test262: String 79%, Array 72% a fecha de v0.5.1146) en lugar de heredarla de V8.

Comparativas detalladas: Perry frente a Bun y Perry frente a Deno. Para ver cómo compilan los paquetes npm, consulta Paquetes npm reales y un barrido de conformidad.

Comparación de rendimiento

La compilación nativa ofrece eficiencia incomparable

MétricaPerryNode.jsBun
Tamaño del binario2-5 MB~80 MB~90 MB
Tiempo de inicio~1 ms~30 ms~10 ms
Dependencias de runtimeNingunaNode.jsBun
Overhead de memoriaMínimoV8 + GCJSC + GC

Resultados del benchmark: Hasta 18x más rápido

Perry v0.5.279 vs Node.js v25 — mediana de RUNS=11, Apple M1 Max (menor es mejor)

accumulate
18x
object create
11x
json roundtrip
5.3x
loop overhead
4.5x
math intensive
3.6x
array read
3.3x
fibonacci
3.2x
array write
2.3x
loop data dependent
1.4x
nested loops
1.0x
Tamaño del binarioMenor es mejor
Perry
5 MB
Node.js
80 MB
Bun
90 MB

Compila tu primer binario hoy

Instala con Homebrew, APT o winget — luego perry compile main.ts.