Dev & Code 57 min agoZu Lesezeichen hinzufügen

Andrew Healey fügt das Schlüsselwort `defer` – ein Grundpfeiler von Go-Code – direkt in den TypeScript-Compiler ein, der nun in Go geschrieben ist. Ein Schulbeispiel, um Parser, Checker und Emitter zu verstehen.
Seit Microsoft die Neuschreibung des TypeScript-Compilers in Go (das Projekt „TypeScript Native“, das eine ~10-fache Geschwindigkeit im Vergleich zum historischen tsc in TypeScript anstrebt) angekündigt hat, ist der Quellcode des Compilers zu einem sehr schönen Spielplatz geworden. Andrew Healey veröffentlicht auf seinem Blog einen sehr lehrreichen Artikel, in dem er in seinem Fork das Schlüsselwort defer – einer der ergonomischen Grundpfeiler der Sprache Go – zu TypeScript hinzufügt.
Zur Erinnerung für diejenigen, die vor allem aus dem JS-Stack kommen: In Go plant defer eine Funktion so, dass sie ausgeführt wird, wenn die umschließende Funktion zurückkehrt. Es ist äquivalent zu einem try { … } finally { … } ohne Boilerplate, wobei der Aufruf zur Bereinigung direkt neben dem Aufruf steht, der ihn erforderlich gemacht hat:
f, _ := os.Open("file.txt")
defer f.Close() // wird ausgeführt, wenn die Funktion verlassen wird
// … Rest des Codes Das Muster wird massiv genutzt, um Ressourcen (Dateien, Mutexe, Verbindungen) freizugeben, ohne sich in Verschachtelungen zu verlieren.
Das Interesse des Artikels liegt nicht darin, dass „Go’s defer morgen in TypeScript sein wird“ (Spoiler: nein). Es geht darum, Schritt für Schritt zu verfolgen, was ein moderner Compiler macht, wenn man ein Schlüsselwort hinzufügt. Healey durchläuft dabei:
defer als dedizierten Token statt als gewöhnlichen Identifier zu erkennen.defer in der Grammatik stehen darf (auf Statement-Ebene, ja; in Ausdrücken, nein).defer in JavaScript zu übersetzen, was in seinem Fall darauf hinausläuft, die umschließende Funktion in ein try/finally einzuhüllen und die deferrierten Callbacks in einem Array zu stapeln, das beim Unwinding ausgeführt wird.Der letzte Schritt ist der lehrreichste: defer in Go ist ein echter Sprachmechanismus (vom Runtime implementiert), während man in JS nichts Vergleichbares hat – man muss es daher durch ein Desugaring simulieren, mit den Kompromissen, die das mit sich bringt (Performance, Exceptions, await etc.).
Da der TypeScript-Compiler in Go Open Source ist, ist diese Art von Übung genau das, was man lesen sollte, um:
Wir stellen nebenbei fest, dass Healeys Patch als Demo und nicht als PR upstream vorgeschlagen wird – das TC39 hat defer nie für JavaScript standardisiert, und Microsoft treibt keine proprietären Erweiterungen dieser Art in TypeScript voran.
Merken Sie sich: Der eigentliche Gewinn der Go-Neuschreibung von tsc ist nicht nur die Geschwindigkeit – es ist auch ein Compiler, dessen Code endlich für einen Leser zugänglich ist, der kein Experte für fortgeschrittenes TypeScript ist. Diese Art von pädagogischen Patches wird sich vervielfachen, und das ist eine hervorragende Schule.
Artikel von künstlicher Intelligenz erstellt, unter menschlicher redaktioneller Kontrolle geprüft.