·5 Min. Lesezeit

Perry: TypeScript direkt zu Maschinencode kompilieren

Wie Perry die Node.js-Runtime eliminiert und 2x schnellere Performance mit winzigen Binaries liefert

Das TypeScript-Runtime-Problem

TypeScript ist zur Sprache der Wahl für Millionen von Entwicklern geworden. Die Typsicherheit, exzellente Tooling-Unterstützung und die vertraute JavaScript-Syntax machen es ideal für alles von Web-Apps bis zu serverseitigem Code. Aber es gibt einen Haken.

Um TypeScript auszuführen, brauchst du Node.js. Und Node.js bringt Ballast mit:

  • 80+ MB Runtime: Jedes Deployment enthält die gesamte V8-JavaScript-Engine
  • Cold-Start-Overhead: Lambda-Funktionen und Container verbringen Hunderte von Millisekunden nur mit dem Starten von Node.js
  • Speicherverbrauch: Der Garbage Collector und JIT-Compiler von V8 verursachen erheblichen Memory-Overhead
  • Distributionskomplexität: Du kannst nicht einfach ein Binary ausliefern – Nutzer brauchen Node.js installiert

Für viele Anwendungsfälle spielt dieser Overhead keine Rolle. Aber für CLI-Tools, Serverless-Funktionen, Edge-Computing und Embedded-Systeme zählt jedes Megabyte und jede Millisekunde.

Was wäre, wenn du TypeScript direkt zu Maschinencode kompilieren könntest?

Einführung von Perry

Perry ist ein nativer TypeScript-Compiler, geschrieben in Rust. Er kompiliert deinen TypeScript-Code direkt zu eigenständigen Executables – kein Node.js, keine V8, keine Runtime erforderlich.

Die Ergebnisse sind beeindruckend:

  • 2-5 MB Binaries statt 80 MB Node.js-Installationen
  • ~1ms Startzeit statt Hunderten von Millisekunden
  • 2.2x schnellere Ausführung im Vergleich zu Node.js
  • Single-File-Distribution – liefere einfach das Executable aus

Perry ist kein Spielzeug oder Proof-of-Concept. Es unterstützt echte TypeScript-Features: Generics, Klassen, async/await, Closures und mehr.

Wie Perry funktioniert

Perrys Architektur nutzt bewährte Rust-Komponenten:

1. SWC für Parsing

Perry verwendet SWC (Speedy Web Compiler) zum Parsen von TypeScript. SWC wird bereits in Tools wie Next.js und Deno wegen seiner Performance eingesetzt – es ist 20x schneller als Babel. In Rust geschrieben, bietet es einen schnellen, präzisen TypeScript-Parser, der die gesamte Syntax der Sprache verarbeitet.

2. HIR-Transformation

Der geparste Abstract Syntax Tree (AST) wird in eine High-Level Intermediate Representation (HIR) transformiert. Diese Repräsentation ist für die nächste Phase optimiert: die Code-Generierung. In dieser Phase führt Perry Typanalyse und Optimierungsdurchläufe durch.

3. Cranelift Code-Generierung

Cranelift generiert den finalen Maschinencode. Es ist derselbe Code-Generator, der von Wasmtime und anderen WebAssembly-Runtimes verwendet wird. Cranelift produziert effizienten nativen Code für x86-64, ARM64 und andere Architekturen.

4. NaN-Boxing für Union Types

TypeScripts Union Types (wie string | number) stellen eine Herausforderung für native Kompilierung dar. Perry verwendet NaN-Boxing – eine clevere Technik, die Typinformationen in den ungenutzten Bits von 64-Bit-Floats kodiert – um dynamische Typen zur Laufzeit effizient darzustellen.

Performance-Benchmarks

Die Zahlen sprechen für sich:

| Metrik | Node.js | Perry | Verbesserung | |--------|---------|-------|--------------| | Binary-Größe | ~80 MB | 2-5 MB | 16-40x kleiner | | Cold Start | 200-500ms | ~1ms | 200-500x schneller | | Ausführung | Baseline | 2.2x schneller | 2.2x |

Für CLI-Tools, die einmal laufen und beenden, ist der Unterschied bei der Startzeit transformativ. Ein Node.js-CLI verbringt möglicherweise 300ms nur mit dem Starten, bevor es eine einzige Zeile deines Codes ausführt. Ein Perry-kompiliertes CLI ist bereits fertig.

TypeScript-Feature-Unterstützung

Perry unterstützt die TypeScript-Features, die Entwickler tatsächlich nutzen:

  • Generics: Volle Unterstützung für generische Typen
  • Klassen: Vererbung, statische Member, Zugriffsmodifikatoren
  • Async/Await: Native Async-Unterstützung ohne Promise-Overhead
  • Closures: First-Class-Funktionen-Unterstützung
  • Type Guards: Runtime-Typeinschränkung
  • Enums: Sowohl String- als auch numerische Enums
  • Module: ES-Modul Import/Export

npm-Ökosystem-Kompatibilität

Eines der beeindruckendsten Features von Perry ist die native Reimplementierung populärer npm-Pakete. Anstatt JavaScript durch V8 laufen zu lassen, werden diese Pakete in Rust reimplementiert:

  • Datenbank: PostgreSQL, MongoDB, MySQL, SQLite
  • Sicherheit: bcrypt, crypto, jwt
  • HTTP: fetch, HTTP-Client/Server
  • Utilities: Buffer, path, fs, os, child_process
  • Daten: JSON, Math, Date, RegExp

27+ Pakete werden derzeit unterstützt, und weitere werden hinzugefügt. Das bedeutet, dass dein bestehender TypeScript-Code, der diese Libraries verwendet, ohne Modifikation zu nativem Code kompiliert werden kann.

Anwendungsfälle

CLI-Tools

Perry ist ideal für Kommandozeilen-Tools. Anstatt zu verlangen, dass Nutzer Node.js installieren, lieferst du ein einzelnes Executable. Die sofortige Startzeit lässt das Tool nativ anfühlen – weil es das ist.

# Traditionelles Node.js CLI
npm install -g my-cli  # Erfordert Node.js
my-cli --help          # 200ms Startzeit

# Perry-kompiliertes CLI
./my-cli --help        # <1ms Startzeit

Serverless-Funktionen

Cold Starts töten die Serverless-Performance. Eine Lambda-Funktion, die 500ms für den Cold Start braucht, verbrennt Geld und frustriert Nutzer. Perry-kompilierte Funktionen starten in Millisekunden, was Serverless für latenzempfindliche Workloads praktikabel macht.

Edge Computing

Edge-Runtimes wie Cloudflare Workers haben strikte Größenlimits. Perrys 2-5 MB Binaries passen dort, wo 80 MB Node.js-Installationen nie passen würden. Deploye TypeScript auf die Edge ohne Kompromisse bei den Sprachfeatures.

Embedded Systems

IoT-Geräte und Embedded-Systeme haben oft begrenzte Ressourcen. Perry bringt TypeScripts Developer Experience in Umgebungen, wo Node.js nie eine Option war.

Erste Schritte

Perry ist Open Source unter MIT- und Apache-2.0-Lizenzen. Besuche perryts.com um:

  1. Den Compiler herunterzuladen für deine Plattform
  2. Die Dokumentation zu lesen für Details zur Sprachunterstützung
  3. Beispiele zu erkunden von Perry-kompilierten Anwendungen
  4. Zum Projekt beizutragen auf GitHub

Die Zukunft von TypeScript

Perry repräsentiert einen fundamentalen Wandel dessen, was mit TypeScript möglich ist. Durch die Eliminierung der Runtime eröffnet es TypeScript für Anwendungsfälle, die vorher unpraktisch waren – von Embedded-Systemen bis zu High-Frequency-Trading-Bots.

Das Projekt wird aktiv entwickelt und das Ökosystem wächst. Je mehr npm-Pakete native Implementierungen bekommen und die TypeScript-Feature-Abdeckung erweitert wird, desto praktikabler wird Perry für den Produktionseinsatz.

Wenn du dir jemals gewünscht hast, dass TypeScript zu nativem Code kompilieren könnte, macht Perry diesen Traum zur Realität.


Perry ist ein Open-Source-Projekt. Besuche perryts.com um mehr zu erfahren.

Fragen oder Feedback zu diesem Artikel? Wir freuen uns, von dir zu hören.

typescriptcompilerrustperformanceopen-source
Perry: TypeScript direkt zu Maschinencode kompilieren | Skelpo