- TypeScripti meeskond valis pordi, et teha täielik ümberkirjutus, et veateated ja semantika oleksid identsed.
- Go prügikoristus ja esmaklassilised sulgemised olid kompilaatori keerukate andmestruktuuride käsitlemiseks hädavajalikud.
- Rusti laenukontrollija oleks sundinud ringviidete puhul käsitsi lahendusi kasutama, lisades tarbetut keerukust.
- Go pakkus küpset natiivset koodi genereerimist ja jagatud mälu samaaegsust ilma igasuguste lisapingutusteta.

Kui TypeScripti meeskond otsustas oma kompilaatori uude keelde portida, oli neil selge eesmärk: hoida kõik täpselt nii nagu varem. See tähendas täpselt sama veateadete ja semantika säilitamist, millele arendajad on aastaid toetunud. Peaarhitekti Anders Hejlsbergi sõnul ei olnud täielik ümberkirjutamine võimalik, kuna see oleks rikkunud tagasiühilduvuse. Selle asemel valisid nad pordi – ja see otsus lõi pinnase üllatavaks valikuks: Rusti asemele asumine.
Port vajas keelt, mis suudaks hakkama saada kompilaatori keerukate sisemiste struktuuridega ilma suuri muudatusi tegemata. Meeskond sai kiiresti aru, et prügikoristus ja esmaklassilised sulgemised ei ole läbirääkimiste objektiks. Go pakub mõlemat kohe karbist võttes koos küpse natiivse koodi genereerimise ja jagatud mälu samaaegsusega kõigil suurematel platvormidel. Rust seevastu oleks nõudnud märkimisväärseid käsitsi lahendusi, eriti kompilaatori ringandmestruktuuride puhul.
Miks minna sadama jaoks rooste üle
Hejlsberg selgitas, et kompilaator on täis vanemviideid, rekursiivseid tüüpe ja sümboleid, mis viitavad üksteisele. Need loovad ringviiteid, mis on prügikoristust kasutavas keeles loomulikud. Go käituskeskkond saab sellega sujuvalt hakkama, võimaldades meeskonnal keskenduda pordile, mitte keelega võitlemisele. Rusti laenamiskontroll, kuigi mälu turvalisuse tagamiseks võimas, ei võimalda seda kuju ilma ebaturvalise koodi või viidete loendamise trikkideta. See lisaks keerukust ja riski, ilma selge tasuta.
Kahe keele võrdlemisel ei leidnud meeskond Rusti puhul olulist eelist koodi genereerimisel ega samaaegsusel. Go natiivne koodi genereerimine on juba küps ja selle gorutiinid pakuvad lihtsat ja tõhusat mudelit samaaegseks täitmiseks. Rusti jõudlus võib mõnel ääremaal olla veidi parem, kuid kompilaatori omandireeglitega töötamiseks vajalik lisapingutus ei olnud õigustatud. Port pidi olema pragmaatiline, mitte keelefunktsioonide demonstratsioon.
Ühilduvus ja semantika: peamine prioriteet
Portimise peamine eesmärk oli säilitada identne käitumine. Arendajad sõltuvad oma koodi silumisel TypeScripti veateadetest ja iga muudatus võib nende töövooge rikkuda. Go-le portides sai meeskond olemasolevat loogikat ja andmestruktuure taaskasutada, tagades väljundi bait-baidilt ühilduvuse. See lähenemisviis vähendab ka ümberkirjutamisega kaasnevate peente vigade tekkimise ohtu.
Go prügikoristus oli võtmetähtsusega. Kompilaatori sisemine sõlmede ja viidete graaf on omavahel tihedalt seotud ning käsitsi mälu haldamine oleks õudusunenägu. Go abil saab meeskond mälu automaatselt eraldada ja vabastada, võimaldades neil keskenduda kompilaatori loogikale. Esmaklassilised sulgemised hõlbustasid ka kompilaatori erinevate läbimiste ja teisenduste rakendamist, kuna need suudavad konteksti loomulikul teel jäädvustada.
Rusti laenukontrollija: tehingu katkestaja
Rusti laenamiskontrollija on loodud kompileerimise ajal andmevõidujooksude ja mäluvigade vältimiseks, kuid sellel on ranged reeglid. TypeScripti kompilaatori andmestruktuurid on täis tsükleid ja jagatud viiteid, mille laenamiskontrollija tagasi lükkab, kui te ei kasuta ohtlikke plokke või Rc/RefCelli. Hejlsberg märkis, et see sunniks iga ringandmestruktuuri puhul käsitsi lahendusi otsima, lisades malli ja muutes koodi hooldamise raskemaks. Selle lisatöö õigustamiseks polnud koodi genereerimise ega samaaegsuse eelist.
Lõpuks oli valik selge. Go pakkus õiget tasakaalu lihtsuse, jõudluse ja ühilduvuse vahel. Port on nüüd valmimisel ja meeskond on kindel, et see pakub sama TypeScripti kogemust kiirema ja tõhusama kompilaatoriga. Arendajate jaoks tähendab see mingeid üllatusi – lihtsalt sama usaldusväärne tööriist, mida nad on alati kasutanud, töötab moodsamal alusel.
Kõike arvesse võttes taandub otsus valida TypeScripti pordi jaoks Go Rusti asemel praktilisele inseneritööle. Prügikoristus, esmaklassilised sulgemised ja ringviidete sujuv käsitlemine tegid Gost loomuliku valiku. Rusti ohutusgarantiid on muljetavaldavad, kuid need tulevad hinnaga, mida TypeScripti meeskond ei olnud nõus maksma. Tulemuseks on port, mis säilitab kõik, mida arendajad TypeScripti juures armastavad, luues samal ajal aluse tulevastele täiustustele.