Compilez TypeScript en binaire

Une seule commande transforme main.ts en exécutable natif autonome. Pas de Node.js sur la machine cible, pas de runtime empaqueté, aucune étape d'installation pour vos utilisateurs.

terminal

$ perry compile main.ts

✓ Compiled executable: main (2.3 MB)

$ ./main

Hello, World!

Trois choses que les gens appellent « compiler TypeScript »

Quand les développeurs cherchent comment compiler TypeScript en binaire, ils tombent généralement sur trois techniques très différentes qui partagent un même mot :

  • Transpilation. tsc, SWC et esbuild transforment TypeScript en JavaScript. La sortie a toujours besoin de Node.js, Bun ou d'un navigateur pour s'exécuter. Aucun binaire n'est impliqué.
  • Intégration du runtime. bun build --compile, deno compile, et les Single Executable Applications (SEA) de Node.js concatènent votre JavaScript empaqueté avec une copie complète du runtime. Vous obtenez un seul fichier, mais le moteur voyage à l'intérieur et votre code est toujours analysé et compilé en JIT à chaque démarrage du processus.
  • Compilation native ahead-of-time. C'est ce que fait Perry. TypeScript est analysé avec SWC, les types sont résolus, les génériques sont monomorphisés, et LLVM émet du code machine. L'éditeur de liens produit un exécutable normal — la même catégorie d'artefact qu'une toolchain Rust, Go ou C++ produit. Il n'y a absolument aucun moteur JavaScript dans le binaire.

Comme il n'y a aucun moteur à démarrer et rien à analyser au lancement, un binaire Perry démarre en environ une milliseconde. Le pipeline lui-même est décrit plus en détail sur la page compilateur TypeScript natif et dans le fonctionnement interne du compilateur.

Quelle est la taille du binaire ?

La taille dépend de ce que vous embarquez, car seul le code que vous utilisez réellement est compilé et lié :

  • Un hello world fait environ 330 Ko.
  • Les outils CLI classiques se situent entre 2 et 5 Mo.
  • Les applications complètes qui lient de gros frameworks (Fastify, mysql2 et consorts) font environ 48 Mo.

Par contraste : un exécutable Node SEA est une copie du binaire node lui-même, donc il démarre à environ 88–118 Mo selon la plateforme avant même l'ajout de votre code, et un hello world compilé avec Bun mesure environ 60 Mo sur macOS arm64 et environ 100 Mo sur Linux x64, parce que l'intégralité du runtime Bun est embarquée.

Perry vs bun build --compile vs Node SEA

Les trois vous donnent un seul fichier que vous pouvez transmettre à quelqu'un. Ce sont par ailleurs des outils très différents, et chacun est la bonne réponse pour quelqu'un :

Perrybun build --compileNode SEA
Ce qu'il produitCode machine compilé AOT (LLVM)JS empaqueté + runtime Bun embarquéCopie du binaire node avec votre script empaqueté injecté
Modèle d'exécutionCode natif, aucun moteur JSJIT (JavaScriptCore) à l'exécutionJIT (V8) à l'exécution
Taille hello-world~330 Ko~60 Mo (macOS arm64) à plus de 100 Mo (Linux/Windows)~88–118 Mo (taille du binaire node)
Démarrage~1 ms~10 ms~30 ms
Compilation croisée10 cibles, y compris Windows/macOS/iOS depuis LinuxOui — Linux, Windows, macOS via --targetNon — copiez plutôt un binaire node par plateforme
Compatibilité JS/npmEn croissance : axios, zod v4, express, fastify, hono compilent nativement ; V8 optionnel en repli pour le resteComplète — c'est le runtime BunSémantique Node complète ; nécessite un pré-empaquetage, CommonJS uniquement sur Node 24 LTS
StatutPré-1.0StableStabilité « en développement actif » dans Node 24 LTS

Pour être honnête : si votre application s'appuie sur l'écosystème npm complet et que vous voulez un risque de compatibilité nul, Bun et Node SEA exécutent exactement la sémantique de moteur avec laquelle vous développez déjà — c'est leur force, et le coût en taille peut ne pas compter pour votre déploiement. Perry propose un compromis différent. Vous obtenez une véritable compilation ahead-of-time, de petits binaires et un démarrage en une milliseconde ; en échange, vous adoptez un compilateur pré-1.0 dont la conformité JavaScript est mesurée et publiée (test262 : String 79 %, Array 72 % à la date de v0.5.1146) plutôt qu'héritée de V8.

Comparaisons détaillées : Perry vs Bun et Perry vs Deno. Pour savoir comment les paquets npm compilent, voir Les vrais packages npm compilent désormais : axios, zod, express — et une passe de conformité.

Comparaison des performances

La compilation native offre une efficacité inégalée

MétriquePerryNode.jsBun
Taille du binaire2-5 MB~80 MB~90 MB
Temps de démarrage~1 ms~30 ms~10 ms
Dépendances runtimeAucuneNode.jsBun
Overhead mémoireMinimalV8 + GCJSC + GC

Résultats du benchmark : Jusqu'à 18x plus rapide

Perry v0.5.279 vs Node.js v25 — médiane RUNS=11, Apple M1 Max (plus bas est mieux)

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
Taille du binairePlus bas est mieux
Perry
5 MB
Node.js
80 MB
Bun
90 MB

Compilez votre premier binaire aujourd'hui

Installez avec Homebrew, APT ou winget — puis perry compile main.ts.