Vercel Labs a publié scriptc, un compilateur TypeScript vers natif sous licence Apache-2.0 hébergé sur GitHub. Il compile du TypeScript non modifié — vérifié par le véritable compilateur TypeScript — en exécutables natifs autonomes, sans Node, sans V8 et sans moteur JavaScript dans le binaire par défaut. Un programme compilé pèse environ 170-200 Ko avec un démarrage d'environ 2,4 ms, contre ~47 ms pour Node ; l'empreinte mémoire typique (RSS) est de 1-4 Mo contre 67-116 Mo pour Node.
Le compilateur classe chaque construction dans l'un des trois niveaux explicites : compilé statiquement (le défaut), exécuté dynamiquement via un moteur quickjs-ng embarqué (~620 Ko, activé avec --dynamic) pour le JS livré par les dépendances npm ou le code typé any, et rejeté avec un code d'erreur précis, un extrait de code et généralement une piste de réécriture. La commande `scriptc coverage` indique quelles instructions se compilent statiquement et quels blocages subsistent. Les valeurs qui repassent du dynamique vers le statique sont validées à l'exécution : un type mensonger lève un TypeError rattrapable au lieu de corrompre la mémoire.
La surface statique couvre les classes avec héritage simple et dispatch dynamique, les closures, les génériques monomorphisés, les unions discriminées, async/await sur des fibres stackful, les exceptions, la déstructuration, les itérateurs, les template literals et des expressions régulières exactes au sens ECMAScript. La bibliothèque standard comprend des chaînes UTF-16 exactes, des arrays/Maps/Sets fidèles à JS, du JSON avec casts validés à l'exécution, Math, les typed arrays, Buffer et des hiérarchies d'Error typées. Une grande partie de l'API Node est prise en charge — fs, path, process, child_process, os, crypto, url, zlib, timers — ainsi que la pile serveur (net, http, https, tls via mbedTLS intégré, dgram, dns, fs.watch, readline) et fetch avec le sous-ensemble web WHATWG sur la pile net/TLS native. Avec --dynamic, les paquets npm sont résolus selon l'algorithme de Node et embarqués à la compilation ; les binaires ne lisent jamais node_modules à l'exécution.
La correction est garantie de deux façons : un corpus de tests différentiels de plus de 800 programmes s'exécute sous Node et en binaire natif avec correspondance octet par octet de stdout, stderr et des codes de sortie ; et l'ensemble du corpus est relancé sous AddressSanitizer avec audit du comptage de références, où fuites et use-after-free font échouer le build. Les divergences assumées vis-à-vis de Node (quelques dizaines, surtout autour du timing et des propriétés des objets d'erreur) sont documentées et numérotées ; rien ne diverge silencieusement. Le formatage des nombres est en shortest-roundtrip, vérifié par fuzzing contre Node sur un million de doubles.
Les échappatoires incluent comptime(() => ...) pour l'évaluation au moment du build, un FFI natif (--ffi) reliant des déclarations TypeScript de signatures à des appels C ABI, et des casts vérifiés où JSON.parse(...) as Config insère une validation à l'exécution nommant le chemin fautif. Côté architecture, tsc parse et type-vérifie vers un IR typé, duquel un backend LLVM (par défaut) ou un backend C de référence lisible génère du code compilé avec clang. L'installation se fait via `npm install -g scriptc` ; clang est requis, macOS arm64 est la plateforme principale, et les binaires Linux et Windows sont cross-compilés avec leurs propres lanes de tests différentiels. Le projet est jeune mais a déjà attiré l'attention, avec 750 étoiles sur GitHub.
Commentaires
Pas encore de commentaire — écris le premier.
Lance la discussion
Pas de compte ni de mot de passe — saisis simplement ton adresse e-mail et nous t’envoyons un lien de connexion à usage unique. Première visite ? Tout se met en place automatiquement.
Ton évaluation sera appliquée automatiquement après ta connexion.
Vérifie ta boîte mail
Nous avons envoyé un lien de connexion à …. Ouvre-le sur cet appareil — cet onglet te connectera automatiquement.
En attente de ton clic …
·