Atsikratyti Wasabi -Dalis 2

Išversta iš anglų kalbos – https://blog.fogcreek.com/killing-off-wasabi-part-2/

Paskutinį kartą, aš kalbėjau apie mūsų motyvacija kurti Wasabi, palaikyti ji jau beveik dešimt metų, ir, galiausiai, žuvo jį išjungti. Šiandien aš norėčiau kalbėti apie naujas gabalas programinės įrangos, kad leido galutinis etapas, Roslyn. Roslyn yra Microsoft atviro kodo kompiliatorius platforma .NET Roslyn apima visą įgyvendinimą ir C# ir Visual Basic.NET sudarytojas.

Aš taip pat esu atleidus Wasabi naujo kodo generatorius, kaip atvirojo kodo programinę įrangą. Manau, kad tai yra pirmasis realaus pasaulio transpiler taikymo C# su Roslyn reikia atidaryti pateiktų. Viliuosi, kad šis straipsnis ir susijusios kodo bus kaip grubus kelrodis visiems, kurie nori parašyti .NET kodas generatorius naudojant Roslyn.

Praėjusiais Generatorius

Kai Wasabi 3.0 pirmą kartą buvo sukurta, Fog Creek nurodyta .NET kaip naujas posistemė tikslą. Yra dvi bendros būdų generuoti .NET asamblėja.

Pirmasis metodas .NET yra sukurti posistemė, kuri sukuria Bendrą Tarpinių Kalbų (Anksčiau žinoma kaip MSIL), bytecode formatas .NET virtualios mašinos. Privalumas sukurti CIL posistemė yra tai, kad kaupimas yra tik vienas žingsnis: nuo Japoniškos tiesiogiai į galutinį DLL išsiųsti klientams. Yra keletas trūkumų, tačiau. Pirma, CIL yra dvejetainis formatas, todėl ji reikia specialių įrankių, kad galėtų jį perskaityti. Antra, mes norėjome būti tikri, kad produkcija Wasabi yra galiojantis .NET, kuris suteiks mums vilties, kad produkcija nebuvo pažeistas kai kuriose keistai taip. Galiausiai, yra paprastas esminis skirtumas tarp Wasabi, aukšto lygio kalba, ir CIL, virtualus asamblėjos kalba.

Antrasis variantas buvo parašyti transpiler. Mes pageidaujamą ši galimybė per kuriančio raw CIL, nes mes jau turėjome patirties rašymo transpilers. Wasabi (mergautinė Thistle) pradėjo kaip transpiler su PHP, paskui pridėjo: VBScript ir JavaScript transpilers su Wasabi 2.0. Viena neigiama yra tai, kad transpiler į parengė kalbos prideda dar visiškai rengimo etapas ant ištekliai, naudojami pildant savo kalba. Bet mes naudos iš papildomų patikros pateikė šiuos etapus: FogBugz turėtų išgyventi tipo tikrinimą dviejų skirtingų kalbų, ir mes tikėjomės, csc.exe kurti teisingą bytecode mums. Taip pat, mes galėjome išmesti #line pragmas galėtų žingsnis per Wasabi kodas naudojant Visual Studio derintuvas. Į transpiler taip pat padarė XML dokumentus komentarus kurti yra labai lengva. Mes nusprendėme C#, nes mūsų tikslinė kalba, nes Wasabi yra parašyta C#, ir kabliataškiais yra kietas.

Kai mums buvo nuspręsta,, dėl transpilation, kitas žingsnis buvo pasirinkimas skleidimo būdas. Dar kartą, ten buvo du variantai jav. Pirmoji buvo ranka-roll kodo generatorius, artimųjų, plikas stygos TextWriter.Write.. Mūsų ankstesnių trijų backends naudojo šį metodą, kad mes buvo jau gana patogiai su juo. Antras variantas, kurį mes galų gale naudojant, buvo naudoti kodas kartos bibliotekos, kaip Microsoft CodeDOM, kuris yra baigęs bendro šaltinio kodo elementai kaip objektas, grafikas, panašiai kaip naršyklės DOM yra HTML elementų. Mes, tikimasi, kad CodeDOM būtų suteikti tam tikrą lygį, statinio rašyti, kad mūsų kodo generavimo procesą, kaip ir mūsų ankstesnių generatoriai visada buvo laikotarpis, tvirtinimo akivaizdžių rašybos klaidų (trūksta kabliataškiu čia, papildomai atidaryti-laikiklis ten). CodeDOM taip pat atskleidė patogus būdas sudarant tiesiogiai C#. Tačiau, mes buvo šiek tiek nusivylęs, kai mes atradome, kad CodeDOM tiesiog rašo į diską ir iš kriauklių csc.exe. Kitą dirginimas buvo, kad žodis “bendras” aš įtraukti į mano aprašymas CodeDOM: ji yra mažiausio bendro vardiklio įrankis. Iš esmės, produkcija buvo skirta sudarytojas, ne žmonių maistui. Aš jums parodysiu kelis pavyzdžius vėliau. Bet mums nereikėjo žmonėms galimybę keisti sugeneruotas C# kodas tai buvo tik svarbu, kad C#, ten buvo, kaip nuraminti parinktį, jei kažkas įvyko ne taip.

Roslyn

Gruodžio Pradžioje 2014, lankiausi NYC HQ ir kalbėjosi su John Daniels apie kai trinties Wasabi darė. Visi, kurie dirbo FogBugz turėjo žinoti du serverio kalbomis – Wasabi ir C#. Naujovė buvo perkeltas į C#, bet nedidelius pakeitimus ir klaidų tvirtinimo turėjo būti atlikta vyresnio amžiaus Wasabi dalis FogBugz. Taip pat, kaip minėta anksčiau, Wasabi turėjo du atskiri rengimo veiksmus, o tai reiškia pokyčiai paėmė per du kartus, kaip ilgai, kaip mes tikėjo, kad jie turėtų.

John pasakė, kad jis turėjo eksperimentavo su raštu valymo įrankį naudojant Microsoft naujas Roslyn biblioteka, kuri pašalino kai keistai cruft iš CodeDOM produkcija. Mes susimąstėte, per galimybę išpjovimas CodeDOM visiškai ir naudojant Roslyn kodas kartos. Aš paskatino jį ir keletą FogBugz kūrėjams sekti, kad mintis.

Pirmadienį, Vasario 9, I kopijuoti CodeDOM generatorius failą RoslynGenerator.cs, pašalinti CodeDOM naudoja ataskaitų ir pradėjo pakeisti kiekvieno metodo su Roslyn lygiaverčiai. Po kelių dienų kovoja, generatorius parengė bet sudužo dėl vykdymo. Derinimo ir klaidų nustatymo tęsėsi keletą dienų. Kai man buvo bet galia ne visi, mano kitas tikslas buvo sukurti identiški šaltinio kodą iš dviejų generatoriai, todėl aš pridėjo komandų eilutės vėliavą, kad, leiskite man pereiti generatoriai ir inicializuoti a Mercurial saugykla patikrinti skirtumas tarp šių dviejų.

Ten buvo dviejų pagrindinių kelių blokados, kad identiški kartos. Pirma, buvo varžos neatitikimas tarp dviejų kartos bibliotekos filosofija. CodeDOM atstovavimas yra permainingas grafikas, todėl aš dažnai praeiti mazgas nuorodos parametrus ir mutuoti juos kitais būdais. Roslyn yra šaltinio kodą kaip nekintamas grafikas mazgų, taigi teisingas būdas generuoti tam tikrą mazgas yra iš apačios į viršų. Tačiau, nes aš bandžiau pakeisti kopiją CodeDOM generatorius į formą, turėjau pakeisti telefono konvencijos kai kurie metodai, kurie priklauso nuo mutacijos. Yra daug patogumui metodus Roslyn, kad leis jums sukurti mutavo kopiją savo mazgas, tačiau taip buvo ne visada aišku, kur turėtų būti saugomi. Simptomas saugodami ją netinkamoje vietoje (arba pamiršta visiškai), buvo tai, kad kai kurios produkcija buvo dingęs. Paprastai, man pavyko ne, perrašyti kodas bus sugeneruotas yra nekintamas-draugiškas tvarka, bet aš turėjau sukurti kai kurie Sąrašai ir pvz srityse, kuriose mutability buvo sunku išvengti.

Antrasis užtvara buvo komentarą kartos. Šalies viduje, Krienai atstovauja komentarus, kaip ir pareiškimai (jie paveldi iš CStatement), ar CodeDOM (kuri naudoja CodeComments suvynioti į CodeCommentStatements). Tačiau, Roslyn yra sukurta taip, kad galėtų atstovauti galiojantis C# programą lossless kelią, todėl jis naudoja daug lankstesni idioma, žinomas kaip SyntaxTrivia. Tiek tarpas ir komentarai gali būti atstovaujama taip, bet faktas yra nuosavybės iš mazgas, ne mazgas pati: mazgai turi kolekcijos pirmaujančių įdomybės ir gale, įdomybės. Pavyzdžiui, išraiška 1 + 2 gali būti pavaizduoti su vienu iš šių pseudocode medžiai:

(binary-expression
operator: +
lhs: (constant-expression value: 1)
rhs: (constant-expression value: 2)
leading-trivia: (trivia-list ‘ ‘)
trailing-trivia: (trivia-list ‘ ‘)
)

Arba

(binary-expression
operator: +
lhs (constant-expression value: 1 trailing-trivia: (trivia-list ‘ ‘))
rhs (constant-expression value: 2 leading-trivia: (trivia-list ‘ ‘))
)

Bet kokiu atveju, rezultatas yra bendra erdvė tarp 1 ir+, ir dar tarp + ir 2. Komentarai yra panašiai saugomi savybių, bet mazgas, leidžiantis inline komentarus (/* … */) ir pabaigos linijos pastabų, komentarų ir linijos savo.

Man labai patinka idėja, sintaksė, įdomybės. Norėčiau grįžti laiku ir pridėti panaši funkcija su Wasabi. Tačiau, užuot bandęs atkartoti tiksliai upiorność, CodeDOM komentarą kartos, aš perėjo komentarą kartos išjungti abu generatoriai tikslais teisingumą patikrinti, tada pridėti visus komentarus Roslyn generatorius vėliau.

Vienas skundas, aš apie Roslyn yra su SyntaxKind tipas – veiklos priežastis, ji yra įgyvendinama, kaip milžiniška enum. Tačiau, tai reiškia, kad ji tipas nėra saugus – galite praeiti, bet SyntaxKind, kad bet koks metodas, kad mano viena, net jei tai gali sukelti neišvengiama gedimų. Aš galų gale, turintys nustatyti dešimtis atvejų, kai praėjo negerai SyntaxKind (pavyzdžiui, artimųjų QuestionToken, kai aš norėjau praeiti ConditionalExpression), ir Roslyn būtų mesti išimtis. Kurio tipo saugus versija, tai API galima būtų buvęs vertinamas, net jei tai buvo paprastas wrapper aplink neatskiriama enum SyntaxKind skudurais.

Idiomos ir Aiškumą

Kaip aš aptarti dar prieš tai, visą priežasties mes pereiti prie Roslyn iš CodeDOM yra tai, kad kokybė sugeneruotas kodas, o tai reiškia, konservuoti, nebuvo geras maistui. Pirmąją savaitę, Kovo, kai sukurtą kodą pagaliau atitiko produkcija CodeDOM, buvo, kai Roslyn tikrai pradėjo rodyti savo vertę. Aš paėmė savaitę ne viduryje kodo generatorius, perrašyti, todėl buvo apie 12 kūrėjas-dienų reimplement į CodeDOM generatorius, Roslyn.

Kai reimplementation buvo padaryta, aš paspaudus sunku sugebėjimus Roslyn, kad produkcija Wasabi daug daugiau idiomatic:

  • Bulio neigimą, gebėjimą naudoja !x operatoriaus, o ne lyginant x == false
  • Panašiai, ne-lygus pasikeitė nuo a == b) == false į a != b
  • Neigiami skaičiai vaizduojami kaip -n, o ne (0 – n)
  • O kilpos dabar naudoja, o(cond) kilpos, o ne naudojant initializer-mažiau( ; cond ; )
  • Taip pat su do { } while(cond); kilpos
  • Klasių, kuriose nėra pagrindo klasės nebėra aiškiai paveldėti iš objekto
  • dar- if sąlygos nebeturi būti sukurtas kaip else { if }, mažina baimės Rodyklių Stabdžių Modelis
  • pereiti atskaitomybė taip pat nebeturi būti sukurtas kaip sudėliota grandinė, if, kita- if, kita- if, kita- if, kita…
  • Wasabi naudoti C# lambdas, o ne Japoniškos susidarančių uždarymo klases. (Man teko įsitikinti, niekas nebuvo priklausomai nuo upiorność, Wasabi lambdas. Laimei, niekas nebuvo.)
  • Pašalinti nereikalingus skliaustuose, pvz., grąžinti (x – 1); if ((s == z)) { }
  • Teisingai išversti Wasabi, kad C# pirmumo taisyklių. (CodeDOM suvynioti kiekvieną dvejetainė išraiška skliaustuose.)
  • Pakeisti Wasabi runtime funkcijas, Xor, Imp, ir Eqv su inline ekvivalentai C#
  • Perrašyti beveik visą gotos kaip lygiavertė pertrauka, ar grįžti
  • Nereikia kurti tuščių failus, namespaces, arba dalinio klasės Global : GlobalBase { }
  • Gerinti string pažodinis kartos
  • Pagal pageidavimą, sukūrė euristinių dėl “netinkamų parametrų”, kad funkcijos praėjo daug pažodinis arba null parametrai yra šie parametrai pavadintas

Aš taip pat ištaisyta keletas dalykų, kad gali turėti buvo nustatyta, kad ankstesnių generatorius, bet buvo ignoruojami, nes skaitomumas produkcijos nebuvo susiję su:

  • Nuorodos į konstantos yra generuojami vietoj išvedė tiesiogine vertė nuolat
  • Šešioliktainis skaičius yra produkcija, kaip šešioliktainis
  • už kilpos su nuolat ribų nebėra kurti vietos kintamieji.
  • Wasabi matricos pradėti indeksas 1. Ar šis skaičiavimas kompiliavimo metu. Pavyzdžiui, parašyti rg(1) rg[0], o ne rg[1 – 1].
  • Inicijuoti labiausiai srityse, inline, o ne konstruktorius
  • Skaičių sumažino nereikalingų mesti raiškos (dauguma verčia sugeneruotas buvo pridėta klaidą tipas tikrintuvas!)
  • Pervardyti Wasabi sriegis-static pavienį iš __Global.__Current Global.Current
  • Nereikia priskirti null, kad neprivalomi parametrai — tai garantuoja, kad bus numatytoji vertė.
  • Numatytoji vertė ints yra 0, o ne naujas int(). Taip pat ir su longo (0L) ir Booleans (false).
  • Automatiškai perrašyti VBScript-stilius grąža (priskyrimas prie pavadinimas, pareigos) nedelsiant grįžta
  • Pašalintos kai kurios senovės skirstymas kodo generavimas
  • Atsikratė labai nedaug sąjungos tipai

Laimei, tų klaidų buvo net lengviau nustatyti naują Roslyn generatorius, nei jie buvo senais CodeDOM generatorius.

Kovo 27, FogBugz komanda ir aš nusprendžiau, kad man buvo pataikyti į tašką mažėja grįžta ir uždarytas į projektą. Aš parodė savo rezultatus steigėjai 30, ir jie paprašė manęs, kad gauti kūrėjas švino ir du labiausiai vaisingos FogBugz prisideda prie darbo išskirtinai sukurtas C# šaką, o pamatyti, kaip jis jautėsi prieš sujungiant. Kartą kūrėjai pridūrė, savo patvirtinimą, aš sujungti savo pakeitimus į FogBugz integracijos vėlai vakare, Balandžio 21 ir FogBugz Versija 8.13.104 išėjo 100% FogBugz Paklausa klientams, Gegužės 21.

Aš džiaugiuosi galėdamas pranešti, kad Wasabi Roslyn generatorius yra dabar prieinamas GitHub. Tai tikrai nėra gražus gabalas kodas: tik reikia paleisti vieną kartą, vieną kodas (FogBugz), kad aš galiu pakeisti, kiek reikia. Bet, manau, ji galėtų būti naudinga tiems, kurie vis rašote C# kodo generatorius, naudojant Roslyn.

 

 

Grįžti į pagrindinį puslapį

Leave a Reply

Your email address will not be published. Required fields are marked *