Ilmselt, ei vaja enam erilist tutvustust. Paljud tunnevad Eclipse'i tĂ€nu Eclipse Java arendustööriistadele (). Just see populaarne avatud lĂ€htekoodiga Java IDE seostatakse enamiku arendajate seas sĂ”naga âEclipseâ. Kuid Eclipse on ka arendustööriistade integreerimise laiendatav platvorm (Eclipse Platform) ja terve rida selle pĂ”hjal ehitatud IDE-sid, sealhulgas JDT. Eclipse on ka Eclipse Project, kĂ”rgema taseme projekt, mis koordineerib Eclipse Platvormi ja JDT arendust, ning Eclipse SDK â selle arenduse tulemus. LĂ”puks on Eclipse avatud lĂ€htekoodiga fond, millel on suur projektide kogukond, kusjuures kaugel mitte kĂ”ik neist on kirjutatud Java keeles vĂ”i seotud arendustööriistadega (nĂ€iteks projektid ja ). Eclipse'i maailm on vĂ€ga mitmekesine.
Antud artiklis, mille iseloom on ĂŒlevaatlik, proovime kĂ€sitleda mĂ”ningaid Eclipse'i arhitektuuri pĂ”hialuseid kui integreeritud arendustööriistade platvormi ning anda esialgne ĂŒlevaade Eclipse'i komponentidest, mis moodustavad 1C: EttevĂ”tte âuue Konfiguratoriâ tehnoloogilise platvormi aluse, . Loomulikult on selline kĂ€sitlus paratamatult pinnapealne ja ĂŒsna piiratud, sealhulgas seetĂ”ttu, et me ei keskendu ainult Eclipse arendajatele sihtrĂŒhmana. Siiski loodame, et isegi kogenud Eclipse arendajad leiavad artiklist huvitavat teavet. NĂ€iteks rÀÀgime ĂŒhest Eclipse'i "saladusest", suhteliselt uuest ja praegu veel vĂ€he tuntud projektist. , mis on loodud ja mida toetab ettevĂ”te 1C.

Eclipse'i arhitektuuri tutvustus
Alustame mĂ”nede ĂŒldiste aspektide vaatlemist Eclipse'i arhitektuurist nĂ€itena (JDT). Just JDT valimine nĂ€iteks ei ole juhuslik. See on esimene integreeritud arenduskeskkond, mis ilmus Eclipse'is. ĂlejÀÀnud *DT projektid Eclipse'is, nagu Eclipse C/C++ Development Tooling (CDT), loodi hiljem ja laenasid nii pĂ”hialuste arhitektuuri kui ka ĂŒksikute koodifragmente JDT-st. JDT-sse rajatud arhitektuuri alused on endiselt asjakohased peaaegu iga Eclipse Platformi peal ehitatud IDE jaoks, sealhulgas 1C:Enterprise Development Tools.
Eclipse'i iseloomustab selge arhitektuuriline kihistumine, kus keele-dependeeritud funktsionaalsus eraldatakse keele-sÔltumatust funktsionaalsusest, samuti eraldatakse UI-sÔltumatud "tuum" komponendid, mis on seotud kasutajaliidese toetamisega.
Eclipse Platform mÀÀratleb ĂŒhtse, keele-sĂ”ltumatu infrastruktuuri, samas kui Java arendustööriistad lisavad Eclipse'ile funktsionaalsuse, et muuta see tĂ€isfunktsionaalseks Java IDE-ks. N nii Eclipse Platform kui ka JDT koosnevad mitmest komponendist, millest igaĂŒks kuulub kas UI-sĂ”ltumatu "tuuma" vĂ”i UI kihi alla (vt joonis 1).

Joonis 1. Eclipse Platform ja JDT
Loetlege Eclipse Platformi pÔhikomponendid:
- Runtime â MÀÀratleb plugin'ite infrastruktuuri. Eclipse'i iseloomustab modulaalne arhitektuur. Tegelikult on Eclipse kogum "laienduspunkte" ja "laiendusi".
- Workspace â Haldate ĂŒhte vĂ”i mitut projekti. Projekt koosneb kaustadest ja failidest, mis kuvatakse otse failisĂŒsteemis.
- Standard Widget Toolkit (SWT) â Pakub pĂ”hielemente, mis on integreeritud operatsioonisĂŒsteemiga.
- JFace â Pakub mitmeid UI raamistikku, mis on ehitatud SWT peale.
- Workbench â MÀÀratleb Eclipse'i UI-paradigma: redigeerijad, vaated, perspektiivid.
Oluline on mĂ€rkida, et Eclipse Platform pakub palju muid kasulikke komponente integreeritud arendustööriistade loomiseks, sealhulgas Debug, Compare, Search ja Team. Eriti tuleks mainida JFace Text'i â aluseks "intelligentsete" koodiredaktorite loomiseks. Kahjuks on isegi nende komponentide kiire ĂŒlevaade, samuti UI-kihi komponendid, selle artikli raames vĂ”imatu, seega piirdume jĂ€rgnevas osas Eclipse Platformi ja JDT peamiste "tuum" komponentide ĂŒlevaatusega.
Core Runtime
Eclipse'i pluginainfrastruktuur pĂ”hineb ja selle eest vastutab projekt . Iga Eclipse'i plugin on OSGi-pakk. OSGi spetsifikatsioon mÀÀratleb muu hulgas versioonihaldamise ja sĂ”ltuvuste lahendamise mehhanismid. Lisaks nendele standardsetele mehhanismidele tutvustab Equinox mĂ”istet laiendamispunkt.. Iga plugin vĂ”ib mÀÀrata oma laienduspunktid ja tuua sĂŒsteemi tĂ€iendavat funktsionaalsust (âlaiendusedâ), kasutades selle sama vĂ”i teiste pluginatega mÀÀratud laienduspunktide sĂŒsteemi. OSGi ja Equinox mehhanismide ĂŒksikasjalik kirjeldus ĂŒletab selle artikli raame. Oluline on mĂ€rkida, et Eclipse'is on modulariseerimine kĂ”ikehĂ”lmav (iga alamsĂŒsteem, sealhulgas Runtime, koosneb ĂŒhest vĂ”i mitmest pluginast) ja praktiliselt kĂ”ik Eclipse'is on laiendamine. Need pĂ”himĂ”tted olid Eclipse'i arhitektuuri juurdunud veel enne OSGi rakendamist (sel ajal kasutati oma tehnoloogiat, mis oli mitmeti OSGi sarnane).
Tuumikula
Peaaegu iga integreeritud arenduskeskkond, mis on ĂŒles ehitatud Eclipse Platformi pĂ”hjal, töötab Eclipse'i tööruumi (workspace) kaudu. Just tööruum sisaldab tavaliselt IDE-s arendatava rakenduse lĂ€htekoodi. Tööruum peegeldub otse failisĂŒsteemis ja koosneb projektidest, mis sisaldavad kaustu ja faile. Need projektid, kaustad ja failid on nimetatud ressurssideks workspace. Workspace'i realiseerimine Eclipse'is toimib nagu vahemĂ€lu failisĂŒsteemi suhtes, mis kiirendab oluliselt ressursi puu lĂ€bimist. Lisaks pakub workspace mitmeid tĂ€iendavaid teenuseid, sealhulgas ja .
Workspace'i ja selle ressursside toetamise eest vastutab komponent Core Resources (plugin org.eclipse.core.resources). TĂ€psemalt pakub see komponent programmilist ligipÀÀsu workspace'ile jĂ€rgmise ressursimudeli. Efektiivseks töötamiseks selle mudeliga vajavad kliendid lihtsat viisi ressursi lingi esitamiseks. Samal ajal oleks soovitav peita kliendi ligipÀÀsu alt objekt, mis otseselt sĂ€ilitab ressursi oleku mudelis. Vastasel juhul, nĂ€iteks faili kustutamise korral, vĂ”ib klient jĂ€tkuvalt hoida objekti, mida mudelis enam ei eksisteeri, mis vĂ”ib pĂ”hjustada mitmeid probleeme. Eclipse lahendab selle ĂŒlesande, kasutades nn handle ressurs. Handle toimib vĂ”tmena (see tunneb ainult teed ressursile tööruumis) ja kontrollib tĂ€ielikult ligipÀÀsu mudeli sisemisele objektile, mis salvestab teavet ressursi oleku kohta. See disain on variatsioon mustrist .
Joonis 2 illustreerib Handle/Body idiomi ressursimudeli kontekstis. IResource liides esindab ressursi handle'it ja on API, erinevalt Resource klassist, mis seda liidest rakendab, ja ResourceInfo klassist, mis esindab body't, mis ei ole API. TÔstame esile, et handle tunneb ainult teed ressursile tööruumi juurest ja ei sisalda viidet resource info'le. Resource info objektid moodustavad nn "elementide puu" (element tree). See andmestruktuur on tÀielikult materialiseeritud mÀlus. Et leida resource info eksemplar, mis vastab teatud handle'ile, kÀiakse element tree lÀbi vastavalt sellele handle'is hoitavale teele.

Joonis 2. IResource ja ResourceInfo
Nagu me hiljem nÀeme, kasutatakse ressursimudeli pÔhikujundust (mida vÔib nimetada handle-pÔhiseks) Eclipse'is ning teistes mudelites. Aga enne kui toome vÀlja mÔned selle disaini eripÀrad:
- Handle on vÀÀrtusobjekt (value object). VÀÀrtusobjektid on muutumatud (immutable) objektid, mille vÔrdsus ei pÔhine identiteedil. Selliseid objekte saab ohutult kasutada vÔtmena hashitud konteinerites. Mitmed handle'i eksemplarid vÔivad viidata samale resursile. Nende vÔrdlemiseks tuleb kasutada meetodit equals(Object).
- Handle mÀÀratleb ressursi kĂ€itumise, kuid ei sisalda teavet ressursi oleku kohta (ainukesed andmed, mida ta salvestab, on âvĂ”tiâ, tee ressursini).
- Handle vÔib viidata mitteeksisteerivale ressursile (kas ressursile, mis pole veel loodud, vÔi ressursile, mis on juba kustutatud). Ressursi olemasolu saab kontrollida meetodi IResource.exists() abil.
- MÔned operatsioonid vÔivad olla rakendatud ainult handle'is endas salvestatud teabe alusel (nii nimetatud ainult handle'i operatsioonid). NÀiteks on IResource.getParent(), getFullPath jne. Ressurss ei pea eksisteerima, et sellist operatsiooni edukalt tÀita. Operatsioonid, mille edukaks tÀitmiseks on vajalik ressursi olemasolu, viskavad erandi (CoreException), kui ressurss ei eksisteeri.
Eclipse pakub tĂ”husat mehhanismi tööruumi ressursside muutuste teavitamiseks. Ressursid vĂ”ivad muutuda nii Eclipse IDE-s endas toimuva tegevuse tĂ”ttu kui ka failisĂŒsteemiga sĂŒnkroonimise tulemusena. MĂ”lemal juhul antakse teavitustele registreerunud klientidele ĂŒksikasjalik teave muudatuste kohta 'ressursi delta' kujul. Delta kirjeldab muudatusi kahe (al)puu tööruumi ressursside oleku vahel ja on ise puu, kus iga sĂ”lm kirjeldab teatud ressursi muutust ning sisaldab nimekirja jĂ€rgmise tasandi deltadest, mis kirjeldavad alamresursside muudatusi.

Joonis 3. IResourceChangeEvent ja IResourceDelta
Resursi deltadest pÔhinev teavitamise mehhanism omab jÀrgmisi omadusi:
- Ăhtne muudatus ja mitmed muudatused on kirjeldatud sama struktuuriga, kuna delta on ĂŒles ehitatud rekursiivse kompositsiooni pĂ”himĂ”ttel. Klientide tellijad saavad töötleda ressursside muudatusi teavitusi, rakendades rekursiivset allakĂ€iku deltade puul.
- Deleht sisaldab kogu teavet ressursi muudatuste kohta, sealhulgas selle liikumise ja/vĂ”i sellega seotud âmarkeriteâ muutmise kohta (markerite kujul esitatakse nĂ€iteks kompileerimisvead).
- Kuna ressursile viidatakse handle'i kaudu, saab deleht loomulikult viidata ka eemalolevale ressurssile.
Nagu me varsti nÀeme, on ressursimudeli muutmise teavitamismehhanismi peamised komponendid asjakohased ka teiste handle-pÔhiste mudelite jaoks.
JDT Core
Eclipse workspace'i ressursimudel on pĂ”hialuseks olev keelest sĂ”ltumatu mudel. JDT Core komponent (plugin org.eclipse.jdt.core) pakub API-d workspace'i struktuuri navigeerimiseks ja analĂŒĂŒsimiseks Java vaatepunktist, nii nimetatud âJava mudelâ (Java mudel). See API on mÀÀratletud Java elementide mĂ”istetena, erinevalt ressursimudeli alusele API-st, mis on mÀÀratletud kaustade ja failide mĂ”istetena. Java elementide puu peamised liidesed on kujutatud joonisel 4.

Joonis 4. Java mudeli elemendid
Java mudel kasutab sama handle/body idiomi kui ressursside mudel (vt joonis 5). IJavaElement on handle ja JavaElementInfo mĂ€ngib body rolli. IJavaElementi liides mÀÀratleb protokolli, mis on ĂŒhine kĂ”igile Java elementidele. MĂ”ned selle meetoditest on ainult handle-ettepanekud: getElementName(), getParent() jne. JavaElementInfo objekt salvestab vastava elemendi oleku: selle struktuuri ja atribuudid.

Joonis 5. IJavaElement ja JavaElementInfo
Java mudelil on mĂ”ned erinevused baseeruva handle/body disaini rakendamisel vĂ”rreldes ressursside mudeliga. Nagu ĂŒlalmainitud, on ressursside mudelis element tree, mille sĂ”lmedeks on resource info objektid, tĂ€ielikult mĂ€lus. Kuid Java mudelis vĂ”ib elementide arv olla mĂ€rkimisvÀÀrselt suurem kui ressursside puus, kuna seal on esindatud ka .java ja .class failide sisemine struktuur: tĂŒĂŒbid, vĂ€ljad ja meetodid.
Kuna vĂ€ltida kogu elemendi puu materjaliseerimist mĂ€lu piiresse, kasutab Java mudeli implementatsioon piiratud suurusega LRU-vahemĂ€lu elementinfo jaoks, kus vĂ”tmena kasutatakse handle IJavaElementi. Elementinfo objekte luuakse nĂ”udmisel, kui navigeeritakse elemendi puus. Selle kĂ€igus tĂ”rjutakse kĂ”ige vĂ€hem sagedasti kasutatud elemendid vahemĂ€lust vĂ€lja, hoides mudeli mĂ€lutarbimise mÀÀratud vahemĂ€lu suuruses. See on veel ĂŒks eelis handle-pĂ”hisele disainile, mis peidab neid teostuse detaile tĂ€ielikult kliendikoodilt.
Java elementide muutmise teavitamise mehhanism on ĂŒldiselt sarnane ĂŒlaltoodud tööruumi ressursside muutuste jĂ€lgimise mehhanismile. Klient, kes soovib jĂ€lgida muutusi Java mudelis, registreerib end teavitustele, mis esitatakse ElementChangedEvent objekti vormis, mis sisaldab IJavaElementDelta't (joon. 6).

Joon. 6. ElementChangedEvent ja IJavaElementDelta
Java mudel ei sisalda teavet meetodite kehade vĂ”i nimede lahendamise kohta, seetĂ”ttu pakub JDT Core tĂ€iendavat (mitte handle-pĂ”hist) mudelit Java koodianalĂŒĂŒsiks: (abstraktne sĂŒntaksipuu, AST). AST esindab lĂ€hte teksti sĂŒntaksianalĂŒĂŒsi tulemust. AST sĂ”lmed vastavad lĂ€hte mooduli struktuuri elementidele (deklaratsioonid, operaatorid, vĂ€ljendid jne) ja sisaldavad teavet vastava elemendi koordinaatide kohta lĂ€hte tekstis ning (valikuliselt) teavet nimede lahendamise kohta viidete kujul niisugustele seosed. Sidemed on objektid, mis esindavad nimelisi entiteete, nagu tĂŒĂŒbid, meetodid ja muutujad, mis on kompilaatorile teada. Erinevalt AST sĂ”lmedest, mis moodustavad puu, toetavad sidemed ristviiteid ja ĂŒldiselt moodustavad graafi. Abstraktne klass ASTNode on kĂ”igi AST sĂ”lmede ĂŒhine baasklass. ASTNode alamklassid vastavad Java keele konkreetsetele sĂŒntaktilistele konstruktsioonidele.
Kuna sĂŒntaksipuud vĂ”ivad tarbida mĂ€rkimisvÀÀrselt palju mĂ€lu, salvestab JDT ainult ĂŒhe AST aktiivse redaktori jaoks. Erinevalt Java mudelist kĂ€sitletakse AST-d tavaliselt kui "vahe" vĂ”i "ajutine" mudel, mille elementidele ei tohiks klientidel hoida viiteid vĂ€ljaspool konteksti, mis viis AST loomisele.
Loetletud kolm mudelit (Java mudel, AST, sidemed) moodustavad koos âintelligentsete arendustööriistadeâ aluse JDT-s, sealhulgas vĂ”imas Java redaktor koos erinevate âabimeestegaâ, erinevad lĂ€htekoodi töötlemise toimingud (sealhulgas nime importimise loendi korraldamine ja vormindamine vastavalt seatud stiilile), otsingutööriistad ja refaktoreerimise tööriistad. Samuti mĂ€ngib Java mudel erilist rolli, kuna just seda kasutatakse arendatava rakenduse struktuuri visuaalse esitamise aluseks (nĂ€iteks Package Exploreris, Outline'is, Search'is, Call Hierarchy's ja Type Hierarchy's).
Eclipse'i komponendid, mida kasutatakse 1C:Enterprise Development Tools'is
Kujutisel 7 on nÀidatud Eclipse'i komponente, mis moodustavad 1C:Enterprise Development Tools'i tehnoloogilise platvormi aluse.

Kujutis 7. Eclipse platvormina 1C:Enterprise Development Tools'i jaoks
Eclipse Platvorm pakub pÔhistruktuuri. Oleme eelnevas jaotises arutanud selle infrastruktuuri mÔningaid aspekte.
(EMF) pakub ĂŒldisi vahendeid struktureeritud andmete modelleerimiseks. EMF on integreeritud Eclipse Platvormiga, kuid seda saab kasutada ka eraldi tavalistes Java rakendustes. Sage on see, et algajad Eclipse arendajad on juba EMF-iga hĂ€sti tuttavad, kuigi nad ei pruugi veel Eclipse Platvormi nĂŒansse tĂ€ielikult mĂ”ista. Ăks pĂ”hjuseid, miks see on nii austatud, on universaalne disain, mis sisaldab ka ĂŒhtset metataseme API-d, mis vĂ”imaldab ĂŒldiselt töötada igasuguste EMF mudelitega. EMF-i pakutavad mudeli objektide pĂ”hiteostused ja mudeli koodigeneratsiooni alamsĂŒsteem meta-mudelist suurendavad oluliselt arendamiskiirust ja vĂ€hendavad vigade arvu. Samuti sisaldab EMF mehhanisme mudelite serialiseerimiseks, mudeli muudatuste jĂ€lgimiseks ja palju muud.
Nagu igasugune tĂ”eliselt universaalne tööriist, sobib EMF mitmesuguste modelleerimisega seotud ĂŒlesannete lahendamiseks, kuid mĂ”ned mudeliklassid (nt eespool kĂ€sitletud handle-pĂ”hised mudelid) vĂ”ivad vajada spetsiifilisemaid modelleerimisvahendeid. EMF-st rÀÀkida on tĂ€namatu ĂŒlesanne, eriti ĂŒhe artikli piiratud raames, kuna see on eraldi raamatu teema ja ĂŒsna paks. Tuleb mĂ€rkida, et kvaliteetne ĂŒldistuste sĂŒsteem, mis EMF-i aluseks on, on vĂ”imaldanud luua terve rea modelleerimise projekte, mis kuuluvad ĂŒlemise taseme projekti. koos ise EMF-iga. Ăks selline projekt on Eclipse Xtext.
pakub âtekstimudeliâ infrastruktuuri. Xtext kasutab sĂŒntaktilise analĂŒĂŒsi jaoks algtekstist ja EMF tulemuse ASG (abstraktse semantilise graafiku, mis sisuliselt ĂŒhendab AST ja sidumised), mida nimetatakse ka "semantilise mudeliks". Xtext'i abil modelleeritud keele grammatika on kirjeldatud selle enda Xtext keeles. See vĂ”imaldab mitte ainult generaatori grammatika kirjeldust ANTLR-ile, vaid ka AST serialiseerimise mehhanismi (st Xtext pakub nii parserit kui unparserit), kontekstitundlikku vihjet ning mitmeid muid keelekomponente. Teiselt poolt on grammatika kirjeldamise keel, mida Xtext kasutab, vĂ€hem paindlik vĂ”rreldes nĂ€iteks ANTLR-i grammatika kirjeldamise keelega. SeetĂ”ttu tuleb mĂ”nikord Xtext'i elluviimiseks "kĂ”verdada" rakendatavat keelt, mis ei ole tavaliselt probleemiks, kui on tegemist nullist arendatava keelega, kuid vĂ”ib olla vastuvĂ”etamatu juba vĂ€ljakujunenud sĂŒntaksiga keeltele. sellest hoolimata on Xtext praegu kĂ”ige kĂŒpsem, funktsionaalselt tĂ€ielik ja universaalne tööriist Eclipse'is programmeerimiskeelte ja nende arendustööriistade ehitamiseks. Eriti sobib see kiire prototĂŒĂŒpimise jaoks. (domain-specific language, DSL). Lisaks eelpool mainitud ANTLR-i ja EMF-i pĂ”hjalisele âkeele tuumaleâ pakub Xtext palju kasulikke kĂ”rgema taseme komponente, sealhulgas indekseerimise mehhanisme, inkrementaalset ehitust, ânutikat redaktoritâ ja palju muud, kuid jĂ€tab kĂ”rvale keele mudelid, mis pĂ”hinevad kĂ€epidemetel. Nagu EMF, on Xtext teema, mis vÀÀrib eraldi raamatut, ja me tĂ”enĂ€oliselt ei suuda isegi pinnapealselt rÀÀkida kĂ”ikidest selle vĂ”imalustest.
1C:Enterprise Development Tools kasutavad aktiivselt nii EMF-i ennast kui ka mitmeid teisi Eclipse Modeling projekte. Eriti on Xtext ĂŒks peamisi arendustööriistu selliste 1C:Enterprise keelte jaoks nagu sisseehitatud programmeerimiskeel ja pĂ€ringukeel. Teine selle arendustööriistade alus on projekt Eclipse Handly, millest me rÀÀgime lĂ€hemalt (kĂ”ikidest loetletud Eclipse komponentidest on see seni kĂ”ige vĂ€hem tuntud).
, alusprojekt kĂ”rgtaseme projektile Eclipse Technology, tekkis 2014. aastal 1C ettevĂ”tte algse koodikontributsiooni tulemusena Eclipse Foundationis. Sellest ajast alates jĂ€tkab firma 1C projekti arendamise toetamist: Handly committerâid on ettevĂ”tte töötajad. Projekt on vĂ€ike, kuid omab ĂŒsna ainulaadset niĆĄĆĄi Eclipseâis: selle peamine eesmĂ€rk on toetada handle-pĂ”histe mudelite arendamist.
Handle-pÔhiste mudelite peamised arhitektuurilised pÔhimÔtted, nagu handle/body idiom, on varem arutatud ressursimudeli ja Java mudeli nÀitel. Seal mÀrgiti, et nii ressursimudel kui Java mudel on olulised alused Eclipse Java arendustööriistade (JDT) jaoks. Kuna praktiliselt kÔik Eclipse'i *DT projektid jagavad arhitektuuri JDT-ga, ei ole liialdus öelda, et handle-pÔhised mudelid on paljude, kui mitte kÔikide Eclipse'i Platformi peal ehitatud IDE-de aluseks. NÀiteks Eclipse C/C++ Development Tooling (CDT) sisaldab handle-pÔhist mudelit C/C++, mis mÀngib arhitektuuris CDT sama rolli, mida Java mudel JDT-s.
Enne Handly ilmumist ei pakkunud Eclipse spetsialiseeritud raamatukogusid kĂ€epidemepĂ”histe mudelite loomiseks. Olemasolevad mudelid loodi enamasti Java mudeli koodi otsese kohandamise kaudu (nt kopeerimine / kleepimine), kui see on lubatud Eclipse'i avaliku litsentsi (EPL) alusel. (On selge, et Eclipse'i enda projektide jaoks pole see tavaliselt juriidiliselt probleem, kuid see ei kehti suletud lĂ€htekoodiga toodete kohta.) Lisaks iseloomulikule sĂŒsteemitusle toob selline meetod kaasa hĂ€sti tuntud probleemid: koodi dubleerimise, kohandamise kĂ€igus sisse toodud vead jne. Mis veelgi hullem, saadud mudelid jÀÀvad "asjaks endas" ega kasuta olemasolevat potentsiaali ĂŒhtlustamiseks. Nimelt vĂ”iks kĂ€epidemepĂ”histe mudelite jaoks ĂŒldiste mĂ”istete ja protokollide eristamine viia korduvkasutatavate komponendi loomisele, nagu see juhtus EMF-i puhul.
Ei saa öelda, et Eclipse'is ei oleks neid probleeme mĂ”istetud. Juba 2005. aastal , kokku vĂ”ttes CDT prototĂŒĂŒbi arendamise kogemust, keelemudelite, sealhulgas handle-pĂ”histe mudelite, ĂŒhise infrastruktuuri loomise vajadus. Kuid nagu sageli juhtub, jĂ€i nende ideede elluviimine sagedamate ĂŒlesannete tĂ”ttu lĂ”puks tegemata. Vahepeal jÀÀb koodi faktoreerimine *DT-projektide seas endiselt ĂŒhel halvasti arendatud teemal Eclipse'is.
Teatud mĂ”ttes on projekt Handly suunatud sarnastele ĂŒlesannetele nagu EMF, kuid handle-pĂ”histe mudelite jaoks, eelkĂ”ige keeleliseks (st programmeerimiskeele struktuurielemente esindavaks). Allpool on loetletud peamised eesmĂ€rgid, mis seati Handly projekteerimisel:
- Peamiste valdkonnaabstraktsioonide eristamine.
- Keeltestrateegiate handle-pÔhiste mudelite rakendamise pingutuste vÀhendamine ja kvaliteedi tÔstmine koodi taaskasutamise kaudu.
- Ăhtse API pakkumine, mis tagab meta-taseme tulemuseks olevate mudelite, mis vĂ”imaldab luua ĂŒhiseid IDE komponente, mis töötavad keele handle-pĂ”histe mudelitega.
- Paindlikkus ja skalaarne lahendus.
- Integratsioon Xtextiga (eraldi kihina).
Ăhiskontseptsioonide ja protokollide esile tĂ”stmiseks on analĂŒĂŒsitud olemasolevaid keele-baasil mudeleid. Peamised liidesed ja pĂ”hiimplementatsioonid, mida Handly pakub, on nĂ€htavad joonisel 8.

Joonis 8. Ăhised liidesed ja pĂ”hiimplementatsioonid Handly elementide jaoks
IElement liides esindab elemendi handle'it ja on ĂŒhine kĂ”igi Handly-pĂ”histe mudelite elementide jaoks. Abstraktne klass Element rakendab ĂŒldist handle/body mehhanismi (joonis 9).

Joonis 9. IElement ja ĂŒldine handle/body rakendus
Lisaks pakub Handly ĂŒldist mehhanismi mudeli elementide muudatustest teavitamiseks (joonis 10). Nagu nĂ€ha, sarnaneb see ĂŒldjoontes ressursside mudeli ja Java-mudeli teavitamismehanismidega ning kasutab IElementDelta'd, et esitada teavet elemendi muudatuste kohta ĂŒhtselt.

Joonis 10. Ăhised liidesed ja pĂ”hiimplementatsioonid Handly teavitamismehhanismi jaoks
Ălaltoodud Handly osa (joonised 9 ja 10) vĂ”ib kasutada praktiliselt kĂ”igi handle-pĂ”histe mudelite esindamiseks. Loome keeleseid mudelid pakuvad tĂ€iendavaid funktsioone â eelkĂ”ige ĂŒldisi liideseid ja baasilahendusi algteksti struktuuri elementide jaoks, nii-öelda allikaelemendid (joonis 8). ISourceFile liides esindab algfaili, samas kui ISourceConstruct on element algfailis. Abstraktsed klassid SourceFile ja SourceConstruct rakendavad ĂŒldisi mehhanisme algfailide ja nende elementidega töötamiseks, nĂ€iteks tekstipuhvereid, elemendi seotust algteksti koordinaatidega, mudelite kooskĂ”lastamist töötava koopia praeguse sisu ĂŒle jne. Nende mehhanismide rakendamine on tavaliselt ĂŒsna keeruline ĂŒlesanne, ning Handly vĂ”ib oluliselt vĂ€hendada keelepĂ”histe mudelite arendamiseks vajalikku vaeva, pakkudes kvaliteetseid baasilahendusi.
Lisaks ĂŒlaltoodud peamistele mehhanismidele pakub Handly tekstivaru ja "snapshootide" infrastruktuuri, toetust integreerimiseks lĂ€htekoodi redaktoritega (sealhulgas "kastist vĂ€ljas" integreerimine Xtext redaktoriga) ning mĂ”ned ĂŒldised UI-komponendid, mis töötavad Handly mudelitega, nagu outline framework. Oma vĂ”imaluste illustreerimiseks esitab projekt mitmeid nĂ€iteid, sealhulgas Java mudeli rakenduse Handly-l. (VĂ”rreldes Java-mudeli tĂ€ieliku rakendusega JDT-s, on see mudel tahtlikult veidi lihtsustatud, et tagada paremat arusaadavust.)
Nagu eelnevalt mainitud, on Handly algse projekteerimise ja edasise arendamise kÀigus suurenenud tÀhelepanu pööratud skaleeritavusele ja paindlikkusele.
Tegelikult on handle-pĂ”hised mudelid âdisainiltâ piisavalt hĂ€sti skaleeritavad. NĂ€iteks vĂ”imaldab handle/body idiom piirata mudeli mĂ€lutarbimist. Kuid on ka nĂŒansse. NĂ€iteks tootlikkuse testimisel avastati Handly skaleeritavuses probleem, mis oli seotud teavitamise mehhanismi rakendamisega â kui muudeti suurt hulka elemente, vĂ”ttis deltasid koostamine liiga kaua aega. Selgus, et sama probleem oli olemas ka Java-mudelis JDT, millest vastav kood omal ajal kohandatud oli. Parandasime Handly vead ja ettevalmistatud sarnane plaastr JDT jaoks, mis vĂ”eti tĂ€nuga vastu. See on vaid ĂŒks nĂ€ide, kus Handly kasutuselevĂ”tt olemasolevates mudelites vĂ”iks potentsiaalselt kasulik olla, kuna sellise vea saaks sel juhul parandada vaid ĂŒhes kohas.
Kuna Handly sisseviimine olemasolevates mudelites oleks tehniliselt vĂ”imalik, peab teek olema piisavalt paindlik. Peamine probleem on sĂ€ilitada mudeli API tagurpidi ĂŒhilduvus. See ĂŒlesanne on lahendatud mudeli API spetsiifilise selge eristamise kaudu, mida mÀÀratleb ja kontrollib tĂ€ielikult arendaja, ning ĂŒhise taseme API kaudu, mida pakub raamatukogu. See mitte ainult ei vĂ”imalda tehniliselt Handly integreerimist olemasolevatesse rakendustesse, vaid annab ka uue mudeli arendajale mĂ€rkimisvÀÀrse vabaduse API projekteerimisel.
Paindlikkusel on ka teised aspektid. NĂ€iteks ei kehtesta Handly mingeid piiranguid mudeli struktuurile ja seda saab kasutada nii ĂŒldotstarbeliste kui ka spetsialiseeritud keelte modelleerimiseks. Algfaili struktuuri ehitamisel ei nĂ”ua Handly mingit kindlat AST esitamise vormi ja ei nĂ”ua isegi AST olemasolu, pakkudes seega ĂŒhilduvust praktiliselt igasuguste sĂŒntaksianalĂŒĂŒsi mehhanismidega. LĂ”puks toetab Handly tĂ€ielikku integratsiooni Eclipse'i töökeskkonnaga, kuid vĂ”ib samuti töötada otse failisĂŒsteemidega, tĂ€nu integratsioonile (EFS).
Praegune versioon ilmus 2016. aasta detsembris. Kuigi projekt on praegu inkubeerimise faasis ja API ei ole lĂ”plikult kindlaks mÀÀratud, kasutatakse Handlyt juba kahel suurel kommertstootel, mis julgesid astuda "varajaste omaks vĂ”tjate" ritta, ja peame ĂŒtlema, et nad ei kahetse seda.
Nagu eelnevalt mainitud, on ĂŒks nende toodetest â 1C:Enterprise Development Tools, kus Handlyt kasutatakse algusest peale 1C:EttevĂ”tte kĂ”rgema taseme struktuurielementide modelleerimiseks, sealhulgas sisseehitatud programmeerimiskeele ja pĂ€ringute keele jaoks. Teine toode on laiemale publikule vĂ€hem tuntud. See on , probleemide lahendamisele suunatud protsessorite integreeritud disainikeskkond (application-specific instruction-set processor, ASIP), mida kasutatakse nii TĆĄehhi ettevĂ”ttes Codasip sees kui ka tema klientide seas, nende hulgas , , , . Codasip kasutab Handly't tootmises alates 2015. aastast, alustades versioonist Handly 0.2. Viimane praegu saadaval olev versioon Codasip Studio's kasutab versiooni 0.5, mis ilmus juunis 2016. OndĆej IlÄĂk, kes juhib IDE arendust Codasipis, on projektiga pidevalt kontaktis, pakkudes ÀÀrmiselt olulist tagasisidet «kolmanda osapoole adopteerijatelt». Ta leidis isegi natuke vaba aega, et otseselt osaleda projekti arendamisel, luues UI kihi (~ 4000 rida koodi) ĂŒhe Handly nĂ€ite, Java mudeli, jaoks. TĂ€iendavat teavet «esimese kĂ€e» kasutamise kohta Handly adopteerijatelt saab leida lehelt projekti.
Loodame, et pĂ€rast versiooni 1.0 vĂ€ljalaskmist, mis tagab API stabiilsuse, ja projekti inkubatsioonist vĂ€ljumist, tuleb Handly'le ka uusi adaptereid. Seni jĂ€tkab projekt API katsetamist ja edasist tĂ€iustamist, andes vĂ€lja kaks âsuurâ versiooni aastas â juunis (sama kuupĂ€eval, mil toimub samaaegne Eclipse'i vĂ€ljaanne) ja detsembris, tagades ennustatavad ajakavad, millele adapterid vĂ”ivad toetuda. Samuti vĂ”ib lisada, et projekti âvea mÀÀrâ pĂŒsib pidevalt madalal tasemel ja Handly töötab usaldusvÀÀrselt varajaste kasutajate toodetes alates esimestest versioonidest. Eclipse Handly'ga edasise tutvumise jaoks saab kasutada ja .
Allikas: habr.com
