TypeScriptin Go-portti: Miksi Go voittaa Rustin?

Viimeisin päivitys: 09/01/2026
Kirjoittaja: C SourceTrail
  • TypeScript-tiimi valitsi portin, jolla tehdään täydellinen uudelleenkirjoitus virheilmoitusten ja semantiikan säilyttämiseksi ennallaan.
  • Go:n roskienkeruu ja ensiluokkaiset sulkemiset olivat välttämättömiä kääntäjän monimutkaisten tietorakenteiden käsittelyssä.
  • Rustin lainaustarkistin olisi pakottanut manuaalisiin kiertotapoihin kehäviittausten osalta, mikä olisi lisännyt tarpeetonta monimutkaisuutta.
  • Go tarjosi kypsän natiivin koodin generoinnin ja jaetun muistin samanaikaisuuden ilman ylimääräistä vaivaa.

TypeScript-ohjelmointikieli

Kun TypeScript-tiimi päätti portata kääntäjänsä uudelle kielelle, heillä oli selkeä tavoite: pitää kaikki toiminnassa täsmälleen kuten ennenkin. Tämä tarkoitti niiden virheilmoitusten ja semantiikan säilyttämistä, joihin kehittäjät olivat luottaneet vuosien ajan. Pääarkkitehdin Anders Hejlsbergin mukaan täydellinen uudelleenkirjoitus ei ollut mahdollinen, koska se olisi vaarantanut taaksepäin yhteensopivuuden. Sen sijaan he päättivät portata kääntäjänsä – ja tämä päätös loi pohjan yllättävälle valinnalle: Rustin sijaan.

Porttaus tarvitsi kielen, joka kykenisi käsittelemään kääntäjän monimutkaisia ​​sisäisiä rakenteita pakottamatta suuria muutoksia. Tiimi ymmärsi nopeasti, että roskienkeruusta ja ensiluokkaisista sulkemisista ei voinut neuvotella. Go tarjoaa molemmat suoraan paketista, sekä kypsän natiivin koodin luonnin että jaetun muistin rinnakkaisuuden kaikilla tärkeimmillä alustoilla. Rust puolestaan ​​olisi vaatinut merkittäviä manuaalisia kiertoteitä, erityisesti kääntäjän kehämäisten tietorakenteiden osalta.

TypeScript 7.0
Aiheeseen liittyvä artikkeli:
TypeScript 7.0 toimitetaan Go-pohjaisella kääntäjällä, joka tarjoaa jopa 12-kertaisen nopeudenlisäyksen

Miksi kannattaa ruostetta satamassa?

Hejlsberg selitti, että kääntäjä on täynnä ylätason osoittimia, rekursiivisia tyyppejä ja symboleja, jotka viittaavat toisiinsa. Nämä luovat kehäviittauksia, jotka ovat luonnollisia roskienkeruukielessä. Go:n ajonaikainen ympäristö käsittelee tämän saumattomasti, jolloin tiimi voi keskittyä porttaukseen kielen kanssa taistelemisen sijaan. Rustin lainaustarkistin, vaikka se on tehokas muistin turvallisuuden kannalta, ei yksinkertaisesti salli tätä muotoa turvautumatta vaaralliseen koodiin tai viittausten laskentatemppuihin. Tämä lisäisi monimutkaisuutta ja riskejä ilman selkeää hyötyä.

Vertaillessaan kahta kieltä tiimi ei löytänyt merkittävää etua Rustin koodinluonnissa tai samanaikaisuudessa. Go:n natiivi koodinluonti on jo kypsää, ja sen gorutiinit tarjoavat yksinkertaisen ja tehokkaan mallin samanaikaiseen suoritukseen. Rustin suorituskyky saattaa olla hieman parempi joissakin reunatapauksissa, mutta kääntäjän omistajuussääntöjen toimimiseen vaadittava lisätyö ei ollut perusteltua. Porttauksen piti olla pragmaattinen, ei kielen ominaisuuksien esittely.

konekirjoitus 6.0 futuro basado en go
Aiheeseen liittyvä artikkeli:
TypeScript 6.0 ja sen Go-pohjainen tulevaisuus

Yhteensopivuus ja semantiikka: Tärkeintä

Porttauksen ensisijainen ajuri oli identtisen toiminnan ylläpitäminen. Kehittäjät ovat riippuvaisia ​​TypeScriptin virheilmoituksista koodinsa debugaamisessa, ja mikä tahansa muutos voi rikkoa heidän työnkulkujaan. Go-porttauksella tiimi voi käyttää uudelleen olemassa olevaa logiikkaa ja tietorakenteita varmistaen, että tuloste pysyy tavu tavulta yhteensopivana. Tämä lähestymistapa vähentää myös uudelleenkirjoituksen mahdollisesti aiheuttamien hienovaraisten virheiden riskiä.

Go:n roskienkeruu oli keskeinen mahdollistaja. Kääntäjän sisäinen solmujen ja viittausten graafi on erittäin yhteydessä toisiinsa, ja manuaalinen muistinhallinta olisi painajainen. Go:n avulla tiimi voi varata ja vapauttaa muistia automaattisesti, jolloin he voivat keskittyä kääntäjän logiikkaan. Ensiluokkaiset sulkemiset helpottivat myös kääntäjän suorittamien erilaisten läpikulkujen ja muunnosten toteuttamista, koska ne pystyvät tallentamaan kontekstin luonnollisesti.

Aiheeseen liittyvä artikkeli:
Ratkaistu: seuraava konekirjoitusmalli

Rustin lainatarkistin: Sopimuksen rikkoja

Rustin lainaustarkistin on suunniteltu estämään datakilpailuja ja muistivirheitä käännösaikana, mutta sillä on tiukat säännöt. TypeScript-kääntäjän tietorakenteet ovat täynnä syklejä ja jaettuja viittauksia, jotka lainaustarkistin hylkää, ellet käytä vaarallisia lohkoja tai Rc/RefCelliä. Hejlsberg huomautti, että tämä pakottaisi manuaalisiin kiertotekoihin jokaisen ympyränmuotoisen tietorakenteen kohdalla, lisäisi vakiomuotoista koodia ja vaikeuttaisi koodin ylläpitoa. Ei ollut koodin luonti- tai samanaikaisuusetua, joka oikeuttaisi tämän ylimääräisen työn.

Lopulta valinta oli selvä. Go tarjosi oikean tasapainon yksinkertaisuuden, suorituskyvyn ja yhteensopivuuden välillä. Porttaus on nyt käynnissä, ja tiimi on varma, että se tarjoaa saman TypeScript-kokemuksen nopeammalla ja tehokkaammalla kääntäjällä. Kehittäjille tämä tarkoittaa, ettei yllätyksiä tule – vain sama luotettava työkalu, jota he ovat aina käyttäneet, nykyaikaisemmalla pohjalla.

Kaiken kaikkiaan päätös valita Go Rustin sijaan TypeScript-porttaukseen perustuu käytännön suunnitteluun. Roskienkeruun, ensiluokkaisten sulkeutumisten ja ympyräviittausten saumattoman käsittelyn tarve teki Gosta luonnollisen valinnan. Rustin turvallisuustakuut ovat vaikuttavia, mutta ne tulevat hinnalla, jota TypeScript-tiimi ei ollut halukas maksamaan. Tuloksena on porttaus, joka säilyttää kaiken, mitä kehittäjät rakastavat TypeScriptissä, ja luo samalla pohjan tuleville parannuksille.

konekirjoitusteksti
Aiheeseen liittyvä artikkeli:
TypeScript 5.9: Parannettu kehittäjäkokemus ja kurkistus tulevaisuuteen
Related viestiä: