TypeScript-ov Go Port: Zašto biste trebali pobijediti Rust za taj posao?

Posljednje ažuriranje: 09/01/2026
  • TypeScript tim je odabrao port za potpuno prepisivanje kako bi poruke o greškama i semantika ostali identični.
  • Goovo sakupljanje smeća i prvoklasni zatvarači bili su ključni za rukovanje složenim strukturama podataka kompajlera.
  • Rustov alat za provjeru pozajmica bi prisilio na ručna rješenja za kružne reference, dodajući nepotrebnu složenost.
  • Go je omogućio generiranje zrelog izvornog koda i konkurentnost u dijeljenoj memoriji bez ikakvog dodatnog napora.

Programski jezik TypeScript

Kada je TypeScript tim odlučio da prenese svoj kompajler na novi jezik, imali su jasan cilj: da sve radi potpuno isto kao i prije. To je značilo očuvanje istih poruka o greškama i semantike na koje su se programeri oslanjali godinama. Prema riječima Andersa Hejlsberga, glavnog arhitekte, potpuno prepisivanje nije bilo moguće jer bi riskiralo narušavanje unatrag kompatibilnosti. Umjesto toga, odlučili su se za portiranje - i ta odluka je postavila temelje za iznenađujući izbor: Preći na Rust.

Za port je bio potreban jezik koji bi mogao da se nosi sa složenim internim strukturama kompajlera bez prisiljavanja na veće promjene. Tim je brzo shvatio da sakupljanje smeća i prvoklasni zatvarači nisu predmet pregovora. Go nudi oboje odmah po instalaciji, zajedno sa zrelim generisanjem izvornog koda i konkurentnošću dijeljene memorije na svim većim platformama. S druge strane, Rust bi zahtijevao značajna ručna rješenja, posebno za kružne strukture podataka kompajlera.

TypeScript 7.0
Povezani članak:
TypeScript 7.0 dolazi s Go-Powered kompajlerom, što omogućuje ubrzanje do 12 puta.

Zašto se odlučiti za Rust za Port?

Hejlsberg je objasnio da je kompajler pun roditeljskih pokazivača, rekurzivnih tipova i simbola koji se odnose jedni na druge. To stvara kružne reference koje su prirodne u jeziku sa sakupljanjem smeća. Go-ovo runtime okruženje to besprijekorno rješava, omogućavajući timu da se fokusira na port umjesto da se bori protiv jezika. Rustova provjera posuđenih podataka, iako moćna za sigurnost memorije, jednostavno ne dozvoljava taj oblik bez pribjegavanja nesigurnom kodu ili trikovima brojanja referenci. To bi dodalo složenost i rizik, bez jasne koristi.

Prilikom poređenja dva jezika, tim nije pronašao značajnu prednost Rusta u generiranju koda ili konkurentnosti. Goovo izvorno generiranje koda je već zrelo, a njegove gorutine pružaju jednostavan i efikasan model za istovremeno izvršavanje. Rustove performanse bi mogle biti nešto bolje u nekim najuobičajenijim slučajevima, ali dodatni napor potreban da bi kompajler radio sa svojim pravilima vlasništva nije bio opravdan. Port je morao biti pragmatičan, a ne demonstracija jezičkih mogućnosti.

typescript 6.0 futuro basado en go
Povezani članak:
TypeScript 6.0 i njegova budućnost zasnovana na Go-u

Kompatibilnost i semantika: Najvažniji prioritet

Primarni pokretač portiranja bio je održavanje identičnog ponašanja. Programeri se oslanjaju na poruke o greškama TypeScript-a za otklanjanje grešaka u svom kodu, a svaka promjena mogla bi poremetiti njihove radne procese. Portiranjem na Go, tim je mogao ponovo koristiti postojeću logiku i strukture podataka, osiguravajući da izlaz ostane bajt-po-bajt kompatibilan. Ovaj pristup također smanjuje rizik od uvođenja suptilnih grešaka koje bi prepisivanje moglo donijeti.

Go-ovo sakupljanje smeća bilo je ključni faktor. Interni graf čvorova i referenci kompajlera je visoko međusobno povezan, a ručno upravljanje memorijom bi bilo noćna mora. Sa Go-om, tim može automatski alocirati i oslobađati memoriju, što im omogućava da se fokusiraju na logiku kompajlera. Prvoklasni closuresi su također olakšali implementaciju različitih prolaza i transformacija koje kompajler izvodi, jer mogu prirodno uhvatiti kontekst.

Povezani članak:
Riješeno: sljedeći predložak kucanog teksta

Rustova provjera pozajmica: Prekid posla

Rustov alat za provjeru pozajmica dizajniran je da spriječi utrke podataka i memorijske greške tokom kompajliranja, ali dolazi sa strogim pravilima. Strukture podataka TypeScript kompajlera pune su ciklusa i dijeljenih referenci, koje alat za provjeru pozajmica odbacuje osim ako ne koristite nesigurne blokove ili Rc/RefCell. Hejlsberg je napomenuo da bi to prisililo na ručna zaobilazna rješenja za svaku kružnu strukturu podataka, dodajući standardne obrasce i otežavajući održavanje koda. Nije bilo prednosti generiranja koda ili konkurentnosti koja bi opravdala taj dodatni rad.

Na kraju, izbor je bio jasan. Go je nudio pravu ravnotežu jednostavnosti, performansi i kompatibilnosti. Portiranje je sada u toku, a tim je uvjeren da će pružiti isto TypeScript iskustvo s bržim i efikasnijim kompajlerom. Za programere, ovo znači da nema iznenađenja - samo isti pouzdani alat koji su oduvijek koristili, koji radi na modernijoj osnovi.

Sve u svemu, odluka da se odabere Go umjesto Rusta za port TypeScript-a svodi se na praktično inženjerstvo. Potreba za sakupljanjem smeća, prvoklasnim zatvaranjima i besprijekornim rukovanjem kružnim referencama učinila je Go prirodnim izborom. Rustove sigurnosne garancije su impresivne, ali dolaze po cijeni koju TypeScript tim nije bio spreman platiti. Rezultat je port koji čuva sve što programeri vole kod TypeScripta, a istovremeno postavlja temelje za buduća poboljšanja.

strojopis
Povezani članak:
TypeScript 5.9: Poboljšano iskustvo za programere i uvid u budućnost
Slični postovi: