Waarskynlik,
In hierdie oorsigartikel sal ons probeer om sommige van die basiese beginsels van die Eclipse-argitektuur te oorweeg as 'n platform vir die bou van geïntegreerde ontwikkelingsinstrumente en 'n aanvanklike idee gee van die Eclipse-komponente wat die grondslag vorm van die tegnologiese platform vir die " nuwe konfigurator” 1C: Enterprise,
Inleiding tot die Eclipse-argitektuur
Kom ons kyk eers na 'n paar algemene aspekte van die Eclipse-argitektuur deur 'n voorbeeld te gebruik
Eerstens moet daarop gelet word dat Eclipse gekenmerk word deur 'n redelik duidelike argitektoniese stratifikasie, met die skeiding van taalonafhanklike funksionaliteit van die funksionaliteit wat ontwerp is om spesifieke programmeertale te ondersteun, en die skeiding van UI-onafhanklike "kern" (kern) komponente van komponente wat met gebruikersondersteuning verband hou.
Byvoorbeeld, die Eclipse-platform definieer 'n gemeenskaplike, taalonafhanklike infrastruktuur, en die Java-ontwikkelingsinstrumente voeg 'n volledige Java IDE by Eclipse. Beide die Eclipse Platform en die JDT bestaan uit verskeie komponente, wat elk 'n UI-onafhanklike "kern" of 'n UI-laag is (Figuur 1).
Rys. 1. Eclipse Platform en JDT
Ons lys die hoofkomponente van die Eclipse-platform:
- Runtime - Definieer die inprop-infrastruktuur. Eclipse het 'n modulêre argitektuur. Eclipse is in wese 'n versameling van "uitbreidingspunte" en "uitbreidings".
- Werkruimte - Bestuur een of meer projekte. 'n Projek bestaan uit dopgehou en lêers wat direk na die lêerstelsel gekarteer word.
- Standaard Widget Toolkit (SWT) - Verskaf basiese gebruikerskoppelvlak-elemente wat met die bedryfstelsel geïntegreer is.
- JGesig - Bied 'n reeks UI-raamwerke wat bo-op SWT gebou is.
- Werkbank - Definieer die Eclipse UI-paradigma: redakteurs, sienings, perspektiewe.
Ek moet sê dat die Eclipse-platform baie ander nuttige komponente bied vir die bou van geïntegreerde ontwikkelingsinstrumente, waaronder Ontfouting, Vergelyk, Soek en Span. Ons moet ook JFace Text noem - die basis vir die bou van "slim redigeerders" van die bronkode. Ongelukkig is selfs 'n vlugtige hersiening van hierdie komponente, sowel as die UI-laagkomponent, nie moontlik binne die raamwerk van hierdie artikel nie, so in die res van hierdie afdeling sal ons ons beperk tot die hersiening van die hoof "kern" komponente van die Eclipse Platform en JDT.
kern looptyd
Die Eclipse Plugin Framework is gebaseer op
kern werkspasie
Byna enige IDE wat bo-op die Eclipse-platform gebou is, werk saam met die Eclipse-werkspasie. Dit is die werkspasie wat gewoonlik die bronkode bevat van die toepassing wat in die IDE ontwikkel word. Werkspasie kaart direk na die lêerstelsel en bestaan uit projekte wat dopgehou en lêers bevat. Hierdie projekte, dopgehou en lêers word genoem hulpbronne werkspasie. Die implementering van werkspasie in Eclipse dien as 'n kas in verhouding tot die lêerstelsel, wat die deurkruising van hulpbronboom aansienlik kan bespoedig. Daarbenewens bied werkspasie 'n aantal bykomende dienste, insluitend
Die Core Resources-komponent (org.eclipse.core.resources-inprop) is verantwoordelik vir die ondersteuning van die werkspasie en sy hulpbronne. Hierdie komponent bied veral programmatiese toegang tot die werkspasie in die vorm hulpbronmodelle. Om effektief met hierdie model te werk, het kliënte 'n eenvoudige manier nodig om 'n skakel na 'n hulpbron voor te stel. Terselfdertyd sal dit wenslik wees om die voorwerp wat die toestand van die hulpbron direk in die model stoor, weg te steek vir kliënttoegang. Andersins, in die geval van byvoorbeeld die verwydering van 'n lêer, kan die kliënt voortgaan om 'n voorwerp te hou wat nie meer in die model is nie, met die daaropvolgende probleme. Eclipse los hierdie probleem op deur die sg hanteer hulpbron. Handvatsel dien as 'n sleutel (dit ken net die pad na die hulpbron in die werkspasie) en beheer heeltemal toegang tot die interne modelvoorwerp, wat inligting oor die toestand van die hulpbron direk stoor. Hierdie ontwerp is 'n variasie van die patroon
Rys. 2 illustreer die handvatsel/liggaam-idioom soos toegepas op 'n hulpbronmodel. Die IResource-koppelvlak verteenwoordig die handvatsel van 'n hulpbron en is 'n API, anders as die Resource-klas wat hierdie koppelvlak implementeer, en die ResourceInfo-klas wat liggaam verteenwoordig, wat nie API's is nie. Ons beklemtoon dat handvatsel slegs die pad na die hulpbron ken relatief tot die werkspasiewortel en nie 'n skakel na hulpbroninligting bevat nie. Hulpbroninligting-objekte vorm wat bekend staan as 'n "elementboom". Hierdie datastruktuur word volledig in die geheue gematerialiseer. Om 'n hulpbroninligting-instansie te vind wat ooreenstem met een of ander handvatsel, word die elementboom deurkruis volgens die pad wat in daardie handvatsel gestoor is.
Rys. 2. IResource en ResourceInfo
Soos ons later sal sien, word die basiese ontwerp van die hulpbronmodel (jy kan dit handvatselgebaseerd noem) in Eclipse en vir ander modelle gebruik word. Intussen is hier 'n paar van die onderskeidende kenmerke van hierdie ontwerp:
- Handvatsel is 'n waarde-objek. Waarde-objekte is onveranderlike objekte waarvan die gelykheid nie op identiteit gebaseer is nie. Sulke voorwerpe kan veilig as 'n sleutel in gehakte houers gebruik word. Veelvuldige gevalle van handvatsel kan na dieselfde hulpbron verwys. Om hulle te vergelyk, gebruik die gelyk (Object) metode.
- Handvatsel definieer die gedrag van die hulpbron, maar bevat nie inligting oor die toestand van die hulpbron nie (die enigste data wat dit stoor is die "sleutel", die pad na die hulpbron).
- Hanteer kan verwys na 'n hulpbron wat nie bestaan nie (óf 'n hulpbron wat nog nie geskep is nie, óf 'n hulpbron wat reeds uitgevee is). Die bestaan van 'n hulpbron kan nagegaan word met behulp van die IResource.exists() metode.
- Sommige bewerkings kan geïmplementeer word uitsluitlik op grond van die inligting wat in die handvatsel self gestoor is (die sogenaamde handvatsel-alleen-operasies). Voorbeelde is IResource.getParent(), getFullPath(), ens. Die hulpbron hoef nie te bestaan vir so 'n operasie om te slaag nie. Bewerkings wat vereis dat die hulpbron bestaan om suksesvol te wees, gooi 'n uitsondering (CoreException) as die hulpbron nie bestaan nie.
Eclipse bied 'n doeltreffende meganisme om veranderinge aan werkspasiehulpbronne in kennis te stel (Figuur 3). Hulpbronne kan beide verander as gevolg van aksies wat in die Eclipse IDE self uitgevoer word, en as gevolg van sinchronisasie met die lêerstelsel. In beide gevalle word kliënte wat op die kennisgewings inteken, voorsien van gedetailleerde inligting oor die veranderinge in die vorm van "hulpbrondelta's" (hulpbrondelta). 'n Delta beskryf veranderinge tussen twee toestande van 'n werkruimte hulpbron (sub-) boom en is self 'n boom, waarvan elke nodus 'n verandering aan een of ander hulpbron beskryf en bevat 'n lys van volgende vlak delta's wat veranderinge aan kinderhulpbronne beskryf.
Rys. 3. IResourceChangeEvent en IResourceDelta
Die kennisgewingmeganisme gebaseer op hulpbrondeltas het die volgende kenmerke:
- 'n Enkele verandering en baie veranderinge word met dieselfde struktuur beskryf, aangesien die delta volgens die beginsel van rekursiewe samestelling gebou is. Intekenaarkliënte kan hulpbronveranderingkennisgewings verwerk deur rekursief te daal in die deltaboom.
- Die delta bevat volledige inligting oor die verandering van die hulpbron, insluitend die beweging daarvan en/of verandering van die "merkers" wat daarmee geassosieer word (merkers verteenwoordig byvoorbeeld samestellingsfoute).
- Omdat hulpbronverwysings deur die handvatsel gemaak word, kan die delta natuurlik na 'n afgeleë hulpbron verwys.
Soos ons binnekort sal sien, is die hoofontwerpelemente van die kennisgewingmeganisme vir hulpbronmodelverandering ook relevant vir ander handvatselgebaseerde modelle.
JDT kern
Die Eclipse-werkruimtehulpbronmodel is 'n fundamentele taalonafhanklike model. Die JDT Core-komponent (org.eclipse.jdt.core-inprop) verskaf 'n API om die werkspasiestruktuur vanuit 'n Java-perspektief te navigeer en te ontleed, die sogenaamde "Java-model" (java model). Hierdie API word gedefinieer in terme van Java-elemente, in teenstelling met die onderliggende hulpbronmodel API, wat in terme van dopgehou en lêers gedefinieer word. Die hoofkoppelvlakke van die Java-elementboom word in Fig. 4.
Rys. 4. Java Model Elemente
Die Java-model gebruik dieselfde handvatsel/liggaam-idioom as die hulpbronmodel (Figuur 5). IJavaElement is die handvatsel en JavaElementInfo is die liggaam. Die IJavaElement-koppelvlak definieer 'n protokol wat algemeen is vir alle Java-elemente. Sommige van sy metodes is slegs handvatsel: getElementName(), getParent(), ensovoorts. Die JavaElementInfo-objek stoor die toestand van die ooreenstemmende element: sy struktuur en eienskappe.
Rys. 5. IJavaElement en JavaElementInfo
Die Java-model het 'n paar verskille in die implementering van die basiese handvatsel/liggaamontwerp in vergelyking met die hulpbronmodel. Soos hierbo genoem, in 'n hulpbronmodel, is 'n elementboom waarvan die nodusse hulpbroninligting-objekte is, geheel en al in die geheue vervat. Maar 'n Java-model kan 'n baie groter aantal elemente as 'n hulpbronboom hê, want dit bevat ook die interne struktuur van .java- en .class-lêers: tipes, velde en metodes.
Om te verhoed dat die hele elementboom in die geheue heeltemal materialiseer, gebruik die Java-modelimplementering 'n groottebeperkte elementinligting LRU-kas, waar die sleutel hanteer IJavaElement is. Elementinligting-objekte word op aanvraag geskep soos die elementboom navigeer word. In hierdie geval word die elemente wat die minste gebruik word, uit die kas verwyder, en die geheueverbruik van die model bly beperk deur die gespesifiseerde kasgrootte. Dit is nog 'n voordeel van handvatselgebaseerde ontwerp, wat sulke implementeringbesonderhede heeltemal van kliëntkode verberg.
Die meganisme om veranderinge aan Java-elemente in kennis te stel, is oor die algemeen soortgelyk aan die meganisme om werkspasiehulpbronveranderinge na te spoor wat hierbo bespreek is. 'n Kliënt wat veranderinge in die Java-model wil naspoor, teken in op kennisgewings, wat voorgestel word as 'n ElementChangedEvent-objek wat 'n IJavaElementDelta bevat (Figuur 6).
Rys. 6.ElementChangedEvent en IJavaElementDelta
Die Java-model bevat nie inligting oor die liggaam van metodes of naamresolusie nie, so vir 'n gedetailleerde ontleding van kode wat in Java geskryf is, verskaf JDT Core 'n bykomende (nie-handvatsel-gebaseerde) model:
Omdat sintaksisbome 'n aansienlike hoeveelheid geheue kan verbruik, kas die JDT slegs een AST, per aktiewe redigeerder. Anders as die Java-model, word die AST oor die algemeen beskou as 'n "intermediêre", "tydelike" model waarvan die elemente nie deur kliënte behou moet word buite die konteks van die operasie wat die AST geskep het nie.
Hierdie drie modelle (Java-model, AST, bindings) vorm saam die basis vir die bou van "intelligente ontwikkelingshulpmiddels" in JDT, insluitend 'n kragtige Java-redigeerder met verskeie "helpers", verskeie aksies vir die verwerking van bronkode (insluitend die organisering van 'n naaminvoerlys en formatering volgens die pasgemaakte styl), soek- en herfaktoreringsinstrumente. In hierdie geval speel die Java-model 'n spesiale rol, aangesien dit gebruik word as die basis vir die visuele voorstelling van die struktuur van die ontwikkelde toepassing (byvoorbeeld in die Pakketverkenner, Oorsig, Soek, Oproephiërargie en Tik hiërargie).
Eclipse-komponente wat in 1C:Enterprise Developments Tools gebruik word
Op fig. Figuur 7 toon die Eclipse-komponente wat die grondslag vorm van die tegnologieplatform vir 1C:Enterprise Development Tools.
Rys. 7. Eclipse as 'n platform vir 1C:Enterprise Development Tools
Eclipse Platform verskaf die basiese infrastruktuur. Ons het 'n paar aspekte van hierdie infrastruktuur in die vorige afdeling behandel.
Soos enige werklik veelsydige instrument, is EMF geskik vir 'n wye reeks modelleringstake, maar sommige klasse modelle (byvoorbeeld die handvatselgebaseerde modelle wat hierbo bespreek is) sal dalk meer gespesialiseerde modelleringsgereedskap benodig. Om oor EMF te praat is 'n ondankbare taak, veral binne die beperkte raamwerk van een artikel, aangesien dit die onderwerp van 'n aparte boek is, en nogal 'n dik een. Ons let net op dat die kwalitatiewe stelsel van veralgemenings onderliggend aan die EMF die geboorte van 'n hele reeks modelleringsprojekte moontlik gemaak het wat by die topvlakprojek ingesluit is.
1C: Ondernemingsontwikkelingshulpmiddels gebruik beide EMF self en 'n aantal ander Eclipse Modeling-projekte aktief. Xtext is veral een van die grondslae van ontwikkelingsinstrumente vir sulke 1C: Enterprise-tale as die ingeboude programmeertaal en navraagtaal. Nog 'n basis vir hierdie ontwikkelingsinstrumente is die Eclipse Handly-projek, waaroor ons in meer besonderhede sal stilstaan (van die Eclipse-komponente wat gelys is, is dit steeds die minste bekend).
Die basiese argitektoniese beginsels van handvatselgebaseerde modelle, soos die handvatsel/liggaam-idioom, is hierbo bespreek deur die hulpbronmodel en die Java-model as voorbeeld te gebruik. Dit het ook opgemerk dat beide die hulpbronmodel en die Java-model belangrike grondslae is vir die Eclipse Java-ontwikkelingsinstrumente (JDT). En aangesien byna alle Eclipse *DT-projekte 'n argitektuur soortgelyk aan JDT het, sal dit nie 'n groot oordrywing wees om te sê dat handvatselgebaseerde modelle onderliggend is aan baie, indien nie alle IDE's wat bo-op die Eclipse-platform gebou is nie. Byvoorbeeld, Eclipse C/C++ Development Tooling (CDT) het 'n handvatselgebaseerde C/C++-model wat dieselfde rol in die CDT-argitektuur speel as die Java-model in die JDT.
Voor Handly het Eclipse nie gespesialiseerde biblioteke aangebied vir die bou van handvatselgebaseerde taalmodelle nie. Modelle wat vandag bestaan, is hoofsaaklik geskep deur die Java-modelkode direk aan te pas (ook bekend as kopieer/plak), in gevalle waar dit toelaat Eclipse Public License (EPL). (Natuurlik, vir byvoorbeeld Eclipse se eie projekte, is dit gewoonlik nie 'n regskwessie nie, wat nie die geval is vir geslotebronprodukte nie.) Benewens sy kenmerkende lukraak, lei hierdie tegniek tot bekende probleme: kodeduplisering wat deur wanneer daar by foute aangepas word, ens. Nog erger, die resulterende modelle bly "dinge op sigself" en gebruik nie die bestaande potensiaal vir eenwording nie. Maar die toekenning van algemene konsepte en protokolle vir taalhandvatselgebaseerde modelle kan lei tot die skepping van herbruikbare komponente om daarmee te werk, soortgelyk aan wat in die geval van EMF gebeur het.
Dit is nie te sê dat Eclipse nie 'n begrip van hierdie probleme gehad het nie. Terug in 2005
In 'n sekere sin is die Handly-projek ontwerp om ongeveer dieselfde take as EMF op te los, maar vir handvatselgebaseerde modelle, en hoofsaaklik taalmodelle (dit wil sê, wat elemente van die struktuur van 'n sekere programmeertaal verteenwoordig). Die volgende is die hoofontwerpdoelwitte vir Handly:
- Isolasie van die hoofabstraksies van die vakgebied.
- Die vermindering van die moeite en die verbetering van die kwaliteit van die implementering van taalhandvatselgebaseerde modelle deur kodehergebruik.
- Die verskaffing van 'n verenigde metavlak-API aan die resulterende modelle, wat dit moontlik maak om algemene IDE-komponente te skep wat met taalhandvatselgebaseerde modelle werk.
- Buigsaamheid en skaalbaarheid.
- Integrasie met Xtext (in 'n aparte laag).
Om algemene konsepte en protokolle uit te lig, is die bestaande implementering van taalhandvatselgebaseerde modelle ontleed. Die hoofkoppelvlakke en basisimplementerings wat deur Handly verskaf word, word in Figuur 8-XNUMX getoon. XNUMX.
Rys. 8. Algemene koppelvlakke en basiese implementering van Handly-elemente
Die IElement-koppelvlak verteenwoordig die handvatsel van 'n element en is algemeen vir elemente van alle Handly-gebaseerde modelle. Die abstrakte klas Element implementeer 'n generiese handvatsel/liggaammeganisme (Figuur 9).
Rys. 9. IElement en generiese implementering van handvatsel/liggaam
Daarbenewens bied Handly 'n algemene kennisgewingmeganisme vir die verandering van modelelemente (Fig. 10). Soos u kan sien, is dit in algemene terme soortgelyk aan die kennisgewingmeganismes wat in die hulpbronmodel en die Java-model geïmplementeer is, en gebruik IElementDelta vir 'n verenigde voorstelling van elementveranderingsinligting.
Rys. 10. Algemene koppelvlakke en basiese implementering van die Handly-kennisgewingmeganisme
Die deel van Handly wat hierbo beskou word (Fig. 9 en 10) kan gebruik word om byna enige handvatsel-gebaseerde modelle voor te stel. Vir die skep linguistiese modelle, bied die projek bykomende funksionaliteit - in die besonder, algemene koppelvlakke en basisimplementerings vir bronteksstruktuurelemente, die sg. bronelemente (Fig. 8). Die ISourceFile-koppelvlak verteenwoordig 'n bronlêer, en ISourceConstruct verteenwoordig 'n element binne die bronlêer. Die abstrakte klasse SourceFile en SourceConstruct implementeer generiese meganismes om werk met bronlêers en hul elemente te ondersteun, byvoorbeeld werk met teksbuffers, binding aan elementkoördinate in die bronteks, versoening van die model met die huidige inhoud van die werkkopiebuffer, ens. . Die implementering van hierdie meganismes is gewoonlik nogal 'n uitdaging, en Handly kan die moeite om handvatselgebaseerde taalmodelle te ontwikkel aansienlik verminder deur kwaliteit basisimplementerings te verskaf.
Benewens die kernmeganismes hierbo gelys, bied Handly 'n teksbuffer en momentopname-infrastruktuur, ondersteuning vir integrasie met bronkode-redigeerders (insluitend out-of-the-box-integrasie met die Xtext-redigeerder), sowel as 'n paar algemene UI-komponente wat werk met Handly-modelle soos die buitelynraamwerk. Om sy vermoëns te illustreer, verskaf die projek verskeie voorbeelde, insluitend die implementering van die Java-model op Handly. (In vergelyking met die volledige implementering van die Java-model in die JDT, is hierdie model doelbewus ietwat vereenvoudig vir beter duidelikheid.)
Soos vroeër genoem, was en is Handly se aanvanklike ontwerp en ontwikkeling sterk gefokus op skaalbaarheid en buigsaamheid.
In beginsel skaal handvatselgebaseerde modelle goed "volgens ontwerp". Byvoorbeeld, die handvatsel/liggaam-idioom laat jou toe om die hoeveelheid geheue wat deur die model verbruik word, te beperk. Maar daar is ook nuanses. Dus, wanneer Handly getoets is vir skaalbaarheid, is 'n probleem gevind in die implementering van die kennisgewingmeganisme - wanneer 'n groot aantal elemente verander word, het die bou van delta's te veel tyd geneem. Dit het geblyk dat dieselfde probleem teenwoordig is in die JDT Java-model, waaruit die ooreenstemmende kode op een slag aangepas is. Ons het 'n fout in Handly reggemaak en 'n soortgelyke pleister vir JDT voorberei, wat met dank ontvang is. Dit is net een voorbeeld waar die implementering van Handly in bestaande modelimplementerings potensieel voordelig kan wees, aangesien dit moontlik sal wees om so 'n fout op net een plek reg te stel.
Om die inbedding van Handly in bestaande modelimplementerings tegnies haalbaar te maak, moet die biblioteek hoogs buigsaam wees. Die grootste probleem is om terugwaartse verenigbaarheid met die model API te handhaaf. Hierdie probleem is opgelos in
Buigsaamheid het ook ander aspekte. Handly plaas byvoorbeeld byna geen beperkings op die struktuur van die model nie en kan gebruik word om algemene doeltale sowel as domeinspesifieke tale te modelleer. Wanneer die bronlêerstruktuur saamgestel word, skryf Handly geen spesifieke vorm van AST-voorstelling voor nie en vereis in beginsel nie eers die teenwoordigheid van 'n AST self nie, en verseker dus versoenbaarheid met byna enige ontledingsmeganisme. Laastens ondersteun Handly volle integrasie met die Eclipse-werkspasie, maar kan ook direk met lêerstelsels werk danksy die integrasie daarvan met
Huidige weergawe
Soos hierbo genoem, is een van hierdie produkte 1C:Enterprise Development Tools, waar Handly van die begin af gebruik word om elemente van die hoëvlakstruktuur van sulke 1C:Enterprise-tale as 'n ingebedde programmeertaal en 'n navraagtaal te modelleer. Nog 'n produk is minder bekend aan die algemene publiek. Hierdie
Ons hoop dat Handly na die vrystelling van weergawe 1.0 met 'n waarborg van API-stabiliteit en die uitgang van die projek uit die inkubasietoestand ook nuwe gebruikers sal hê. Intussen gaan die projek voort om die API verder te toets en te verfyn, met twee "groot" vrystellings per jaar, in Junie (dieselfde datum as die gelyktydige Eclipse-vrystelling) en Desember, wat 'n voorspelbare skedule bied waarop gebruikers kan staatmaak. Ons kan ook byvoeg dat die "fouttempo" van die projek op 'n konstante lae vlak bly en Handly werk sedert die heel eerste weergawes betroubaar in die produkte van vroeë aannemers. Vir verdere vertroudheid met Eclipse Handly, kan jy gebruik
Bron: will.com