Vercel Labs hat scriptc veröffentlicht, einen unter Apache-2.0 lizenzierten TypeScript-nach-nativ-Compiler auf GitHub. Er übersetzt unverändertes TypeScript — geprüft vom echten TypeScript-Compiler — in eigenständige native Executables, ohne Node, ohne V8 und ohne JavaScript-Engine im Standard-Binary. Ein kompiliertes Programm liegt bei etwa 170-200 KB mit rund 2,4 ms Startzeit, verglichen mit etwa 47 ms bei Node; der typische Speicherverbrauch (RSS) beträgt 1-4 MB gegenüber 67-116 MB bei Node.

Der Compiler ordnet jedes Konstrukt einer von drei expliziten Stufen zu: statisch kompiliert (Standard), dynamisch ausgeführt über eine eingebettete quickjs-ng-Engine (~620 KB, aktivierbar mit --dynamic) etwa für mitgeliefertes JS aus npm-Paketen oder any-typisierten Code, und abgelehnt mit spezifischem Fehlercode, Code-Frame und meist einem Hinweis zur Umformulierung. Der Befehl `scriptc coverage` zeigt, welche Anweisungen statisch kompilieren und welche Blocker verbleiben. Werte, die aus dynamischem zurück in statischen Code wechseln, werden zur Laufzeit validiert — ein lügender Typ wirft einen abfangbaren TypeError statt Speicher zu korrumpieren.

Die statische Sprachoberfläche umfasst Klassen mit Einfachvererbung und dynamischem Dispatch, Closures, monomorphisierte Generics, discriminated Unions, async/await auf stackful Fibers, Exceptions, Destructuring, Iteratoren, Template Literals und ECMAScript-exakte reguläre Ausdrücke. Die Standardbibliothek bietet UTF-16-exakte Strings, JS-exakte Arrays/Maps/Sets, JSON mit laufzeitvalidierten Casts, Math, Typed Arrays, Buffer und typisierte Error-Hierarchien. Große Teile der Node-API werden unterstützt — fs, path, process, child_process, os, crypto, url, zlib, Timer — plus der Server-Stack (net, http, https, tls über vendored mbedTLS, dgram, dns, fs.watch, readline) sowie fetch mit dem WHATWG-Web-Subset über den nativen Net/TLS-Stack. Mit --dynamic werden npm-Pakete per Node-Algorithmus aufgelöst und zur Build-Zeit eingebettet; Binaries lesen zur Laufzeit niemals node_modules.

Korrektheit wird zweifach abgesichert: Ein differentielles Testkorpus von über 800 Programmen läuft sowohl unter Node als auch als natives Binary, wobei stdout, stderr und Exit-Codes Byte für Byte übereinstimmen müssen; zudem läuft das gesamte Korpus unter AddressSanitizer mit Referenzzähl-Audit, wobei Leaks und Use-after-free als Build-Fehler gelten. Dokumentierte, nummerierte Abweichungen von Node existieren (einige Dutzend, vor allem bei Timing-Interna und Error-Objekt-Eigenschaften); nichts weicht stillschweigend ab. Zahlenformatierung ist Shortest-Roundtrip, per Fuzzing an einer Million Doubles gegen Node verifiziert.

Als Escape Hatches dienen comptime(() => ...) für zur Build-Zeit ausgewertete Ausdrücke, ein natives FFI (--ffi) für C-ABI-Aufrufe über rein deklarative TypeScript-Signaturen sowie geprüfte Casts, bei denen JSON.parse(...) as Config eine Laufzeitvalidierung einfügt, die den problematischen Pfad benennt. Architektonisch parst und typprüft tsc in ein typisiertes IR, aus dem ein LLVM-Backend (Standard) oder ein lesbares C-Referenz-Backend Code erzeugt, der mit clang kompiliert wird. Die Installation erfolgt über `npm install -g scriptc`; clang wird benötigt, macOS arm64 ist die primäre Plattform, Linux- und Windows-Builds entstehen per Cross-Kompilierung mit eigenen Test-Lanes. Das Projekt ist noch früh, erregte aber bereits Aufmerksamkeit mit 750 Sternen auf GitHub.