Eclipse som teknologisk plattform för 1C:Enterprise Development Tools

Antagligen, Eclipse behöver inte lĂ€ngre nĂ„gon sĂ€rskild introduktion. MĂ„nga kĂ€nner till Eclipse tack vare Eclipse Java Development Tools (JDT). Just denna populĂ€ra öppen kĂ€llkods Java IDE förknippas av de flesta utvecklare med ordet “Eclipse”. Men Eclipse Ă€r ocksĂ„ en utbyggbar plattform för integration av utvecklingsverktyg (Eclipse Platform), och en rad IDE:er som bygger pĂ„ den, inklusive JDT. Eclipse omfattar ocksĂ„ Eclipse Project, ett övergripande projekt som koordinerar utvecklingen av Eclipse Platform och JDT, samt Eclipse SDK – den levererade produkten av denna utveckling. Slutligen Ă€r Eclipse en öppen kĂ€llkods-stiftelse med ett stort samhĂ€lle av projekt, av vilka mĂ„nga inte alls Ă€r skrivna i Java eller relaterar till utvecklingsverktyg (till exempel projekt Eclipse IoT och Eclipse Science). VĂ€rlden av Eclipse Ă€r mycket mĂ„ngsidig.

I denna artikel, som har en översiktlig karaktÀr, ska vi försöka utforska nÄgra grundlÀggande aspekter av Eclipse-arkitekturen som en plattform för utveckling av integrerade utvecklingsverktyg och ge en första förstÄelse av komponenterna i Eclipse som utgör fundamentet för den teknologiska plattformen för den "nya Konfiguratorn" 1C:Enterprise, 1C:Enterprise Utvecklingsverktyg. Naturligtvis kommer en sÄdan genomgÄng ofrÄnkomligen att vara ganska ytlig och begrÀnsad, ocksÄ dÀrför att vi riktar oss till en publik som inte bara Àr utvecklare av Eclipse. Vi hoppas dock att Àven erfarna Eclipse-utvecklare kan hitta intressant information i artikeln. Till exempel kommer vi att berÀtta om en av "hemligheterna med Eclipse", ett relativt nytt och fortfarande lite kÀnt projekt Eclipse Handly, som grundades och stöds av företaget 1C.
Eclipse som teknologisk plattform för 1C:Enterprise Development Tools

Introduktion till Eclipse-arkitekturen

Vi ska först titta pÄ nÄgra allmÀnna aspekter av Eclipse-arkitekturen med hjÀlp av Eclipse Java Development Tools (JDT). Valet av just JDT som exempel Àr inte slumpmÀssigt. Detta var den första integrerade utvecklingsmiljön som dök upp i Eclipse. De andra *DT-projekten i Eclipse, sÄsom Eclipse C/C++ Development Tooling (CDT), skapades senare och lÄnade bÄde grundlÀggande arkitekturprinciper och specifika kodfragment frÄn JDT. De arkitektoniska grunderna som lagts i JDT Àr fortfarande aktuella för nÀstan alla IDE:er som byggts ovanpÄ Eclipse Platform, inklusive 1C:Enterprise Development Tools.

Först och frÀmst bör det pÄpekas att Eclipse kÀnnetecknas av en tydlig arkitektonisk uppdelning, dÀr sprÄkoberoende funktionalitet separeras frÄn funktionaliteten avsedd för specifika programmeringssprÄk, och dÀr UI-oberoende "kÀrnkomponenter" separeras frÄn komponenter relaterade till stödet för anvÀndargrÀnssnittet.

Eclipse Plattformen definierar en gemensam, sprÄkoberoende infrastruktur, medan Java utvecklingsverktyg tillför Eclipse en fullt funktionell Java IDE. BÄde Eclipse Plattformen och JDT bestÄr av flera komponenter, dÀr var och en hör till antingen det UI-oberoende "kÀrnan" eller UI-lagret (se bild 1).

Eclipse som teknologisk plattform för 1C:Enterprise Development Tools
Bild 1. Eclipse Plattform och JDT

LÄt oss lista de viktigaste komponenterna i Eclipse Plattformen:

  • Körning — Definierar plugin-infrastrukturen. Eclipse kĂ€nnetecknas av en modulĂ€r arkitektur. I grunden Ă€r Eclipse en samling av "utvidgningspunkter" och "utvidgningar".
  • Arbetsyta — Hanterar ett eller flera projekt. Ett projekt bestĂ„r av mappar och filer som direkt Ă„terspeglas i filsystemet.
  • Standard Widget Toolkit (SWT) — TillhandahĂ„ller grunderna för anvĂ€ndargrĂ€nssnittet, integrerat med operativsystemet.
  • JFace — TillhandahĂ„ller ett antal UI-ramverk byggda ovanför SWT.
  • Workbench — Definierar UI-paradigmen för Eclipse: redaktörer, vyer, perspektiv.

Det bör nĂ€mnas att Eclipse Plattformen ocksĂ„ erbjuder mĂ„nga andra anvĂ€ndbara komponenter för att bygga integrerade utvecklingsverktyg, bland vilka Debug, Compare, Search och Team kan nĂ€mnas. En sĂ€rskild omtanke gĂ„r till JFace Text – grunden för att bygga "smartare kĂ€llkodredigerare". TyvĂ€rr Ă€r det inte möjligt att ge en snabb översikt av dessa komponenter, liksom komponenterna i UI-lagret i denna artikel, sĂ„ i den Ă„terstĂ„ende delen av detta avsnitt kommer vi att begrĂ€nsa oss till att ge en översikt över de viktigaste "kĂ€rnkomponenterna" i Eclipse Plattformen och JDT.

KÀrn Körning

Eclipses plugin-infrastruktur Àr baserad pÄ OSGi och tillhandahÄlls av projektet Eclipse Equinox. Varje Eclipse-plugin Àr en OSGi-bundle. OSGi-specifikationen definierar bland annat mekanismer för versionering och beroendeupplösning. Utöver dessa standardmekanismer introducerar Equinox begreppet utvidgningspunktVarje plugin kan definiera sina egna utvidgningspunkter och tillföra ytterligare funktionalitet till systemet ("utvidgningar"), genom att anvÀnda utvidgningspunkter som definieras av samma eller andra plugins. En detaljerad beskrivning av mekanismerna bakom OSGi och Equinox ligger utanför ramen för denna artikel. Det bör noteras att moduleringen i Eclipse Àr heltÀckande (varje delsystem, inklusive Runtime, bestÄr av en eller flera plugins), och praktiskt taget allt i Eclipse Àr en utvidgning. Dessa principer var inbakade i Eclipse-arkitekturen lÄngt innan OSGi infördes (vid den tidpunkten anvÀndes en egen teknologi, som till stor del liknar OSGi).

Core Workspace

NÀstan varje integrerad utvecklingsmiljö baserad pÄ Eclipse Platform arbetar med Eclipse workspace. Workspace innehÄller vanligtvis kÀllkoden för den applikation som utvecklas i IDE:n. Workspace speglar direkt filsystemet och bestÄr av projekt som innehÄller mappar och filer. Dessa projekt, mappar och filer kallas resurser workspace. Implementeringen av workspace i Eclipse fungerar som en cache i förhÄllande till filsystemet, vilket avsevÀrt ökar hastigheten för traversering av resurs trÀdet. Dessutom tillhandahÄller workspace en rad extra tjÀnster, inklusive mekanismen för notifiering av resursÀndringar och infrastrukturen för inkrementella byggare.

Komponenten Core Resources (plugin org.eclipse.core.resources) Àr ansvarig för att stödja workspace och dess resurser. Denna komponent ger i synnerhet programmatisk Ätkomst till workspace i form av resursmodeller.För att arbeta effektivt med denna modell behöver kunderna ett enkelt sÀtt att representera en lÀnk till en resurs. Det skulle vara önskvÀrt att objektet som lagrar resursens tillstÄnd direkt i modellen Àr dolt för kundÄtkomst. Annars, vid till exempel borttagning av en fil, skulle klienten kunna fortsÀtta att hÄlla ett objekt som inte lÀngre finns i modellen, vilket skulle leda till problem. Eclipse löser detta problem genom att anvÀnda nÄgot som kallas handle resursen. Handle fungerar som en nyckel (den vet endast sökvÀgen till resurserna i workspace) och kontrollerar helt och hÄllet Ätkomsten till det interna modellobjektet, som direkt lagrar information om resursens tillstÄnd. Denna design Àr en variation av mönstret Handle/Body.

Figur 2 illustrerar idiomen Handle/Body i förhÄllande till resursmodellen. GrÀnssnittet IResource representerar handtaget för resursen och fungerar som ett API, till skillnad frÄn klassen Resource som implementerar detta grÀnssnitt, samt klassen ResourceInfo som representerar kroppen, vilka inte Àr API:er. Det Àr vÀrt att pÄpeka att handtaget endast kÀnner till sökvÀgen till resursen relativt rötter i arbetsytan och inte innehÄller en referens till resource info. Objekten resource info bildar det sÄ kallade "elementtrÀd". Denna dat Struktur Àr helt materialiserad i minnet. För att hitta en instans av resource info som motsvarar ett visst handtag, traverseras elementtrÀdet enligt sökvÀgen som lagras i detta handtag.

Eclipse som teknologisk plattform för 1C:Enterprise Development Tools
Figur 2. IResource och ResourceInfo

Som vi kommer att se senare anvÀnds den grundlÀggande designen av resursmodellen (som kan kallas handtagsbaserad) i Eclipse och för andra modeller. LÄt oss nu lista nÄgra karakteristiska egenskaper hos denna design:

  • Handtaget Ă€r en vĂ€rdeobjekt (value object). VĂ€rdeobjekt Ă€r icke-mutanabla (immutable) objekt, vars likhet inte baseras pĂ„ identitet. SĂ„dana objekt kan anvĂ€ndas sĂ€kert som nycklar i hashade containrar. Flera instanser av ett handtag kan referera till samma resurs. För att jĂ€mföra dem bör metoden equals(Object) anvĂ€ndas.
  • Handtaget definierar resurens beteende, men innehĂ„ller ingen information om resurens tillstĂ„nd (de enda uppgifter det lagrar Ă€r "nyckeln", sökvĂ€gen till resursen).
  • Handtaget kan referera till en icke-existerande resurs (antingen en resurs som Ă€nnu inte har skapats eller en resurs som redan har tagits bort). Existensen av resursen kan kontrolleras med metoden IResource.exists().
  • Vissa operationer kan utföras enbart baserat pĂ„ informationen som lagras i sjĂ€lva handtaget (sĂ„ kallade handtagsbara operationer). Exempel pĂ„ detta inkluderar IResource.getParent(), getFullPath(), osv. Resursen behöver inte nödvĂ€ndigtvis existera för att en sĂ„dan operation ska lyckas. Operationer som krĂ€ver att resursen existerar för att lyckas kastar ett undantag (CoreException) om resursen inte finns.

Eclipse tillhandahÄller en effektiv mekanism för notifiering om förÀndringar i resurser i arbetsytan (se bild 3). Resurser kan förÀndras bÄde genom ÄtgÀrder som utförs i Eclipse IDE och genom att synkronisera med filsystemet. I bÄda fallen fÄr de registrerade klienterna detaljerad information om förÀndringarna i form av "resursdeltan" (resource delta). Deltat beskriver förÀndringarna mellan tvÄ tillstÄnd av (under-)trÀdet med resurser i arbetsytan och Àr sjÀlvt ett trÀd dÀr varje nod beskriver förÀndringen av en viss resurs och innehÄller en lista med deltan pÄ nÀsta nivÄ som beskriver förÀndringar i underordnade resurser.

Eclipse som teknologisk plattform för 1C:Enterprise Development Tools
Bild 3. IResourceChangeEvent och IResourceDelta

Den notifieringsmekanism som baseras pÄ resursdeltan har följande egenskaper:

  • En enskild förĂ€ndring och flera förĂ€ndringar beskrivs med samma struktur, eftersom deltastrukturen bygger pĂ„ principen om rekursiv komposition. Klienter som registrerat sig kan bearbeta notifieringar om resursförĂ€ndringar genom att rekursivt traversera delta-trĂ€det.
  • Deltat innehĂ„ller all information om resursĂ€ndringen, inklusive dess flyttning och/eller Ă€ndring av tillhörande "markörer" (dĂ€r markörer representerar till exempel kompilatorfel).
  • Eftersom referenser till resurser görs via handles kan deltat naturligt referera till en borttagen resurs.

Som vi snart kommer att se Àr de grundlÀggande komponenterna i designen av notifieringsmekanismen för resursmodellens förÀndringar ocksÄ relevanta för andra handle-baserade modeller.

JDT Core

Modellen för resurser i Eclipse-arbetsytan Àr en grundlÀggande sprÄkoberoende model. Komponenten JDT Core (plugin org.eclipse.jdt.core) tillhandahÄller ett API för navigering och analys av arbetsytans struktur ur ett Java-perspektiv, den sÄ kallade "Java-modellen" (Java-modell). Detta API definieras i termer av Java-element, till skillnad frÄn det underliggande API:t för resursmodellen, som definieras i termer av mappar och filer. De viktigaste grÀnssnitten för Java-elementens trÀd visas i bild 4.

Eclipse som teknologisk plattform för 1C:Enterprise Development Tools
Bild 4. Element i Java-modellen

Java-modellen anvÀnder samma idiom handle/body som resursmodellen (fig. 5). IJavaElement Àr handle, medan JavaElementInfo fungerar som body. GrÀnssnittet IJavaElement definierar ett protokoll som Àr gemensamt för alla Java-element. Vissa av dess metoder Àr endast handle: getElementName(), getParent() osv. JavaElementInfo-objektet lagrar tillstÄndet för det motsvarande elementet: dess struktur och attribut.

Eclipse som teknologisk plattform för 1C:Enterprise Development Tools
Fig. 5. IJavaElement och JavaElementInfo

Java-modellen har vissa skillnader i implementationen av den grundlÀggande handle/body-designen jÀmfört med resursmodellen. Som nÀmnts tidigare innehÄller resursmodellens elementtrÀd, vars noder Àr objekt med resursinformation, helt i minnet. Men i Java-modellen kan det finnas betydligt fler element Àn i resurstrÀdet, eftersom den Àven representerar den interna strukturen av .java- och .class-filer: typer, fÀlt och metoder.

För att undvika full materialisering av hela elementtrÀdet i minnet anvÀnder implementationen av Java-modellen en begrÀnsad LRU-cache för elementinfo, dÀr nyckeln Àr handle IJavaElement. Elementinfo-objekt skapas vid behov nÀr navigering genom elementtrÀdet sker. De minst anvÀnda elementen trÀngs ut frÄn cachen, och minnesanvÀndningen frÄn modellen hÄlls inom den angivna storleken pÄ cachen. Detta Àr ytterligare en fördel med handle-baserad design, som helt döljer sÄdana implementationsdetaljer frÄn klientkoden.

Mekanismen för notifiering av Àndringar i Java-element Àr i allmÀnhet liknande den mekanism för förÀndringsspÄrning som diskuterades ovan för resursarbetsytan. Klienten som önskar följa Àndringar i Java-modellen prenumererar pÄ notifieringar som presenteras i form av ett objekt ElementChangedEvent, som innehÄller IJavaElementDelta (fig. 6).

Eclipse som teknologisk plattform för 1C:Enterprise Development Tools
Fig. 6. ElementChangedEvent och IJavaElementDelta

Java-modellen innehÄller ingen information om kroppar för metoder eller namnutredning, sÄ för en detaljerad analys av kod skriven i Java tillhandahÄller JDT Core en ytterligare (icke-handle-baserad) modell: abstrakt syntaxtrÀd (abstrakt syntaxtrÀd, AST). AST representerar resultatet av syntaxanalysen av den ursprungliga texten. Noder i AST motsvarar elementen i strukturen för den ursprungliga modulen (deklarationer, operationer, uttryck osv.) och innehÄller information om koordinaterna för det motsvarande elementet i den ursprungliga texten, samt (som valfritt) information om namnupplösning i form av lÀnkar till sÄ kallade bindings. Bindningar Àr objekt som representerar namngivna entiteter, sÄsom typer, metoder och variabler, som Àr kÀnda för kompilatorn. Till skillnad frÄn noderna i AST, som bildar ett trÀd, stöder bindningar korsreferenser och bildar i allmÀnhet en graf. Den abstrakta klassen ASTNode Àr en gemensam basklass för alla noder i AST. Underklasser av ASTNode motsvarar specifika syntaktiska konstruktioner i Java-sprÄket.

Eftersom syntaktiska trÀd kan anvÀnda en betydande mÀngd minne, cachen JDT endast ett AST för den aktiva redigeraren. Till skillnad frÄn Java-modellen betraktas AST vanligtvis som en "intermediÀr", "temporÀr" modell, vars element kunder inte bör behÄlla referenser till utanför kontexten för operationen som ledde till skapandet av AST.

De tre nÀmnda modellerna (Java-modell, AST, bindningar) utgör tillsammans grunden för att bygga "intelligenta utvecklingsverktyg" i JDT, inklusive en kraftfull Java-redigerare med olika "hjÀlpare", olika operationer för att bearbeta kÀllkoden (som organisering av importlista för namn och formatering enligt den konfigurerade stilen), verktyg för sökning och refaktorisering. HÀr spelar Java-modellen en sÀrskild roll, eftersom den anvÀnds som grund för den visuella representationen av strukturen för den utvecklade applikationen (till exempel i Package Explorer, Outline, Search, Call Hierarchy och Type Hierarchy).

Eclipse-komponenterna som anvÀnds i 1C:Enterprise Developments Tools

Figur 7 visar Eclipse-komponenterna som utgör grunden för den teknologiska plattformen för 1C:Enterprise Development Tools.

Eclipse som teknologisk plattform för 1C:Enterprise Development Tools
Figur 7. Eclipse som plattform för 1C:Enterprise Development Tools

Eclipse-plattformen tillhandahÄller grundlÀggande infrastruktur. Vi har granskad nÄgra aspekter av denna infrastruktur i den föregÄende delen.

Eclipse Modeling Framework (EMF) tillhandahÄller generella verktyg för modellering av strukturerad data. EMF Àr integrerat med Eclipse-plattformen, men kan ocksÄ anvÀndas separat i vanliga Java-applikationer. MÄnga nybörjare inom Eclipse-utveckling Àr redan vÀl bekanta med EMF, Àven om de kanske inte helt förstÄr detaljerna i Eclipse-plattformen. En av anledningarna till dess vÀlförtjÀnta popularitet Àr den universella designen, som inkluderar en enhetlig meta-nivÄ-API som gör det möjligt att arbeta generellt med vilken EMF-modell som helst. De grundlÀggande implementationerna av EMF för modelobjekt och systemet för kodgenerering frÄn meta-modellen ökar avsevÀrt utvecklingshastigheten och minskar mÀngden fel. EMF innehÄller Àven mekanismer för serialisering av modeller, spÄrning av förÀndringar i modeller och mycket mer.

Som med alla verkligt universella verktyg Àr EMF lÀmpligt för att lösa ett brett spektrum av uppgifter relaterade till modellering, men vissa typer av modeller (som de hanterade modeller som diskuterats ovan) kan behöva mer specialiserade verktyg för modellering. Att prata om EMF Àr en otacksam uppgift, sÀrskilt inom ramen för en enda artikel, eftersom det Àr ett Àmne för en separat bok, och en ganska tjock sÄdan. Vi ska bara pÄpeka att det kvalitativa systemet för generaliseringar som ligger till grund för EMF har gjort det möjligt för en hel rad projekt, som Àgnas Ät modellering, att se dagens ljus och som ingÄr i det övergripande projektet. Eclipse Modellering tillsammans med sjÀlva EMF. Ett av dessa projekt Àr Eclipse Xtext.

Eclipse Xtext tillhandahĂ„ller infrastrukturen för "textuell modellering". Xtext anvĂ€nder ANTLR för syntaktisk analys av kĂ€lltext och EMF för att representera den resulterande ASG (abstract semantic graph, som i huvudsak Ă€r en kombination av AST och bindings), Ă€ven kallad "semantisk modell". Grammatiken för det sprĂ„k som modelleras med Xtext beskrivs pĂ„ sitt eget Xtext-sprĂ„k. Detta gör det möjligt att inte bara generera en grammatisk beskrivning för ANTLR, utan ocksĂ„ att erhĂ„lla en mekanism för serialisering av AST (dvs. Xtext tillhandahĂ„ller bĂ„de parser och unparser), kontextuell hjĂ€lp och en rad andra sprĂ„kkomponenter. Å andra sidan Ă€r sprĂ„ket för grammatikbeskrivning som anvĂ€nds i Xtext mindre flexibelt jĂ€mfört med sprĂ„ket för grammatikbeskrivning i ANTLR. DĂ€rför Ă€r det ibland nödvĂ€ndigt att "böja" det implementerade sprĂ„ket till Xtext, vilket vanligtvis inte Ă€r ett problem om det handlar om ett nyutvecklat sprĂ„k, men kan vara oacceptabelt för sprĂ„k med redan etablerad syntax. Trots detta Ă€r Xtext för nĂ€rvarande det mest mogna, funktionellt kompletta och universella verktyget i Eclipse för att bygga programmeringssprĂ„k och verktyg för dem. SĂ€rskilt Ă€r det ett perfekt verktyg för snabb prototypframstĂ€llning. domĂ€nspecifika sprĂ„k (domain-specific language, DSL). Förutom det nĂ€mnda "sprĂ„kets kĂ€rna" baserad pĂ„ ANTLR och EMF, erbjuder Xtext mĂ„nga anvĂ€ndbara komponenter av högre nivĂ„, inklusive indexeringsmekanismer, inkrementell byggnation, "smart redigerare" och mycket, mycket mer, men lĂ€mnar sprĂ„kbaserade handle-baserade modeller utanför. Precis som EMF Ă€r Xtext ett Ă€mne vĂ€rt en egen bok, och vi kommer knappast att kunna berĂ€ttar om alla dess möjligheter ens kort.

1C:Enterprise Development Tools anvÀnder bÄde EMF i sig och en rad andra projekt inom Eclipse Modeling. SÀrskilt Àr Xtext en av grundpelarna i utvecklingsverktygen för sÄdana sprÄk inom 1C: Företag, sÄsom det inbyggda programmeringssprÄket och frÄgesprÄket. En annan grund för dessa utvecklingsverktyg Àr projektet Eclipse Handly, som vi kommer att gÄ mer pÄ djupet med (av de nÀmnda komponenterna inom Eclipse Àr det hittills den minst kÀnda).

Eclipse Handly, ett underprojekt till det överordnade projektet Eclipse Technology, skapades som ett resultat av det initiala kodbidraget till Eclipse Foundation frÄn företaget 1C Är 2014. Sedan dess har företaget 1C fortsatt att stödja utvecklingen av projektet: committers pÄ Handly Àr anstÀllda hos företaget. Projektet Àr litet, men upptar en ganska unik nisch inom Eclipse: dess huvudsakliga mÄl Àr att stödja utvecklingen av handle-baserade modeller.

De grundlÀggande arkitekturprinciperna för handle-baserade modeller, sÄsom handle/body-idiomet, har diskuterats ovan med exempel frÄn resursmodellen och Java-modellen. Det noterades dÀr att bÄde resursmodellen och Java-modellen Àr viktiga grundstenar för Eclipse Java Development Tools (JDT). Eftersom nÀstan alla *DT-projekt i Eclipse har en arkitektur liknande JDT, Àr det ingen överdrift att sÀga att handle-baserade modeller ligger till grund för mÄnga, om inte alla, IDE:er byggda ovanpÄ Eclipse Platform. Till exempel innehÄller Eclipse C/C++ Development Tooling (CDT) en handle-baserad modell för C/C++, som spelar samma roll i CDT:s arkitektur som Java-modellen gör i JDT.

Innan Handly lanserades erbjöd Eclipse inga specialiserade bibliotek för att bygga sprĂ„kbaserade handle-modeller. De nuvarande modellerna skapades mestadels genom direkt anpassning av koden frĂ„n Java-modellen (Ă€ven kĂ€nd som copy/paste), i de fall dĂ€r det Ă€r tillĂ„tet enligt Eclipse Public License (EPL). (Det Ă€r uppenbart att, till exempel, för Eclipses egna projekt vanligtvis inte Ă€r ett juridiskt problem, vilket inte kan sĂ€gas om produkter med stĂ€ngd kĂ€llkod.) Förutom den karaktĂ€ristiska bristen pĂ„ systematik leder denna metodik till vĂ€lkĂ€nda problem: kodduplicering, fel som införts genom anpassningar, osv. Ännu vĂ€rre, de resulterande modellerna förblir "en sak för sig" och utnyttjar inte den befintliga potentialen för enhetlighet. Att identifiera gemensamma begrepp och protokoll för sprĂ„kbaserade handle-modeller skulle kunna leda till skapandet av Ă„teranvĂ€ndbara komponenter för arbete med dem, pĂ„ liknande sĂ€tt som det hĂ€nde i fallet med EMF.

Det gÄr inte att sÀga att det i Eclipse inte funnits en förstÄelse för dessa problem. Redan 2005 Martin Aeschlimann, med en sammanfattning av erfarenheterna frÄn utvecklingen av CDT-prototypen, argumenterade Behovet av att skapa en gemensam infrastruktur för sprÄkmodeller, inklusive handle-baserade modeller. Men som det ofta Àr, pÄ grund av mer prioriterade uppgifter, kom vi aldrig till genomförandet av dessa idéer. Under tiden kvarstÄr kodfaktoriseringen av *DT-projekt som en av de Àmnen som inte Àr tillrÀckligt utforskade inom Eclipse.

PÄ ett visst sÀtt syftar projektet Handly till att lösa ungefÀr samma uppgifter som EMF, men för handle-baserade modeller, frÀmst sprÄkliga (dvs. som representerar strukturelement av ett visst programmeringssprÄk). Nedan listas de huvudsakliga mÄlen som sattes vid utformningen av Handly:

  • Uppdelning av de grundlĂ€ggande abstraktionerna i Ă€mnesomrĂ„det.
  • Minska anstrĂ€ngningarna och öka kvaliteten pĂ„ implementeringen av sprĂ„kliga handle-baserade modeller genom Ă„teranvĂ€ndning av kod.
  • TillhandahĂ„lla ett enhetligt API pĂ„ meta-nivĂ„ till de resulterande modellerna, vilket möjliggör skapandet av gemensamma IDE-komponenter som arbetar med sprĂ„kliga handle-baserade modeller.
  • Flexibilitet och skalbarhet.
  • Integration med Xtext (i ett separat lager).

För att identifiera gemensamma begrepp och protokoll har befintliga implementationer av sprÄkliga handle-baserade modeller analyserats. De grundlÀggande grÀnssnitten och de grundlÀggande implementationerna som tillhandahÄlls av Handly visas i figur 8.

Eclipse som teknologisk plattform för 1C:Enterprise Development Tools
Figur 8. Gemensamma grÀnssnitt och grundlÀggande implementationer av Handly-element.

GrÀnssnittet IElement representerar handtaget av ett element och Àr gemensamt för elementen i alla modeller baserade pÄ Handly. Den abstrakta klassen Element implementerar den generiska mekanismen handle/body (figur 9).

Eclipse som teknologisk plattform för 1C:Enterprise Development Tools
Figur 9. IElement och generisk implementering av handle/body.

Dessutom tillhandahÄller Handly en generell mekanism för notifiering av förÀndringar av modelelement (figur 10). Som man kan se Àr den i stora drag liknande notifieringsmekanismerna implementerade i resursmodellen och Java-modellen, och anvÀnder IElementDelta för en enhetlig presentation av information om förÀndringen av ett element.

Eclipse som teknologisk plattform för 1C:Enterprise Development Tools
Figur 10. Gemensamma grÀnssnitt och grundlÀggande implementationer av Handlys notifieringsmekanism.

Den del av Handly som diskuterats ovan (figur 9 och 10) kan anvÀndas för att representera praktiskt taget alla handle-baserade modeller. För att skapa sprÄkliga modeller erbjuder projektet ytterligare funktionalitet - i synnerhet gemensamma grÀnssnitt och grundlÀggande implementationer för elementen i strukturen av den ursprungliga texten, de sÄ kallade source elements. (fig. 8). GrÀnssnittet ISourceFile representerar en ursprungsfil, medan ISourceConstruct Àr ett element inom ursprungsfilen. Abstrakta klasserna SourceFile och SourceConstruct implementerar generiska mekanismer för att stödja arbetet med ursprungsfiler och deras element, till exempel arbete med textbuffertar, bindning till koordinater av elementet i den ursprungliga texten, samordning av modellen med det aktuella innehÄllet i arbetskopians buffert, etc. Implementeringen av dessa mekanismer Àr vanligtvis en ganska komplex uppgift, och Handly kan avsevÀrt minska utvecklingsinsatserna för sprÄkmodeller baserade pÄ handles genom att erbjuda kvalitativa grundimplementationer.

Förutom de grundlÀggande mekanismerna som nÀmnts ovan, erbjuder Handly infrastruktur för textbuffertar och snapshots, stöd för integration med kÀllkodseditorer (inklusive den inbyggda integrationen med Xtext-editor), samt vissa allmÀnna UI-komponenter som arbetar med Handly-baserade modeller, sÄsom outline-ramverket. För att illustrera sina möjligheter tillhandahÄller projektet flera exempel, inklusive en implementering av en Java-modell baserad pÄ Handly. (JÀmfört med den fullstÀndiga implementeringen av Java-modellen i JDT, Àr denna modell avsiktligt nÄgot förenklad för större tydlighet.)

Som nÀmnts tidigare har stort fokus lagts pÄ skalbarhet och flexibilitet vid den initiala designen och den fortsatta utvecklingen av Handly.

I princip skalas handle-baserade modeller ganska vĂ€l "by design". Till exempel möjliggör idiomet handle/body att begrĂ€nsa mĂ€ngden minne som modellen anvĂ€nder. Men det finns ocksĂ„ nyanser. Under tester av Handly för skalbarhet upptĂ€cktes ett problem i implementeringen av notifieringsmekanismen – att bygga deltas tog för mycket tid vid Ă€ndring av ett stort antal element. Det visade sig att samma problem Ă€ven fanns i Java-modellen JDT, frĂ„n vilken den motsvarande koden en gĂ„ng anpassades. Vi Ă„tgĂ€rdade felet i Handly och förberedde en motsvarande patch för JDT, som mottogs med tacksamhet. Detta Ă€r bara ett exempel pĂ„ nĂ€r implementeringen av Handly i befintliga modellimplementationer skulle kunna vara potentiellt anvĂ€ndbar, eftersom detta skulle ha möjliggjort att Ă„tgĂ€rda felet pĂ„ ett enda stĂ€lle.

För att göra integrationen av Handly tekniskt möjlig i befintliga implementationer av modeller mÄste biblioteket uppvisa betydande flexibilitet. Huvudproblemet Àr att bevara bakÄtkompatibiliteten för modellens API. Denna uppgift har lösts i Handly 0.5 genom en tydlig separation av det modell-specifika API:t, som definieras och kontrolleras helt av utvecklaren, frÄn det enhetliga meta-nivÄ API:t som tillhandahÄlls av biblioteket. Detta gör inte bara teknisk integration av Handly i befintliga implementationer möjlig, utan ger ocksÄ utvecklaren av den nya modellen betydande frihet vid utformningen av API:t.

Flexibilitet har ocksÄ andra aspekter. Till exempel stÀller Handly nÀstan inga krav pÄ modellens struktur och kan anvÀndas för bÄde allmÀnna programmeringssprÄk och domÀnspecifika sprÄk. Vid bygget av grundfilens struktur föreskriver Handly ingen specifik form av AST-representation och krÀver i princip inte ens förekomsten av AST, vilket sÀkerstÀller kompatibilitet med nÀstan alla syntaktiska analysmekanismer. Slutligen stöder Handly fullstÀndig integration med Eclipse workspace, men kan ocksÄ fungera direkt med filsystem, tack vare integrationen med Eclipse File System (EFS).

Den nuvarande versionen Handly 0.6 slÀpptes i december 2016. Trots att projektet för nÀrvarande Àr i inkubationsfasen och API:t Ànnu inte Àr slutgiltigt faststÀllt, anvÀnds Handly redan i tvÄ stora kommersiella produkter som vÄgat agera som "tidiga anvÀndare", och hittills har de inte Ängrat detta.

Som nĂ€mnts tidigare Ă€r en av dessa produkter 1C:Enterprise Development Tools, dĂ€r Handly anvĂ€nds frĂ„n början för att modellera elementen i den hög-nivĂ„ strukturen för sprĂ„k som ingĂ„r i 1C:Enterprise, sĂ„som det inbyggda programmeringssprĂ„ket och frĂ„gesprĂ„ket. Den andra produkten Ă€r mindre kĂ€nd för allmĂ€nheten. Det Ă€r Codasip Studio, en integrerad miljö för design av domĂ€nspecifika processorer (application-specific instruction-set processor, ASIP), som anvĂ€nds bĂ„de inom det tjeckiska företaget Codasip och av dess kunder, bland vilka AMD, AVG, Mobileye, Sigma Designs. Codasip anvĂ€nder Handly i produktion sedan 2015, med version Handly 0.2. Den senaste versionen av Codasip Studio anvĂ€nder version 0.5, som slĂ€pptes i juni 2016. Ondƙej Ilčík, som leder utvecklingen av IDE pĂ„ Codasip, Ă€r i kontakt med projektet och ger viktig feedback frĂ„n externa anvĂ€ndare. Han lyckades till och med hitta lite fritid för att direkt delta i projektutvecklingen genom att implementera ett anvĂ€ndargrĂ€nssnitt (ungefĂ€r 4000 rader kod) för ett av Handly-exemplen, en Java-modell. Mer information FramgĂ„ngshistorier för projektet.

Vi hoppas att efter lanseringen av version 1.0 med garanti för API:ets stabilitet och projektets uttrĂ€de ur inkubationsstaten, kommer Handly fĂ„ nya anvĂ€ndare. Tills dess fortsĂ€tter projektet att testa och förbĂ€ttra API:t, med tvĂ„ stora versioner som slĂ€pps varje Ă„r – i juni (samma datum som den samtidiga utgivningen av Eclipse) och december, vilket ger ett förutsĂ€gbart schema som anvĂ€ndare kan lita pĂ„. Dessutom Ă€r buggrate för projektet stadig och Handly har pĂ„litligt fungerat i produkterna hos tidiga anvĂ€ndare sedan de första versionerna. För vidare kĂ€nnedom om Eclipse Handly kan du anvĂ€nda Kom igĂ„ng-guide och Arkitektonisk översikt.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster