Talán,
Ebben a jellegét tekintve áttekintő cikkben megpróbáljuk megvizsgálni az Eclipse architektúra néhány alapját, mint integrált fejlesztői eszközök építésének platformját, és kezdeti képet adunk az Eclipse összetevőiről, amelyek a technológia alapját képezik. platform az „új Configurator” 1C: Enterprise számára.
Bevezetés az Eclipse architektúrába
Először nézzük meg az Eclipse architektúra néhány általános vonatkozását a példa segítségével
Mindenekelőtt meg kell jegyezni, hogy az Eclipse-t meglehetősen világos építészeti rétegzettség jellemzi, a nyelvtől független funkcionalitás elválasztásával a specifikus programozási nyelvek támogatására tervezett funkcióktól, valamint az UI-független „mag” komponensek elválasztásával a kapcsolódó összetevőktől. támogató felhasználói felülettel.
Így az Eclipse Platform közös, nyelvfüggetlen infrastruktúrát határoz meg, a Java fejlesztőeszközök pedig egy teljes értékű Java IDE-t adnak az Eclipse-hez. Az Eclipse Platform és a JDT is több komponensből áll, amelyek mindegyike vagy egy UI-független „maghoz”, vagy egy UI réteghez tartozik (1. ábra).
Rizs. 1. Eclipse Platform és JDT
Soroljuk fel az Eclipse Platform fő összetevőit:
- Runtime — Meghatározza a beépülő modul infrastruktúráját. Az Eclipse-t a moduláris felépítés jellemzi. Lényegében az Eclipse "bővítési pontok" és "kiterjesztések" gyűjteménye.
- Munkaterület — Egy vagy több projektet kezel. A projekt mappákból és fájlokból áll, amelyek közvetlenül a fájlrendszerhez vannak hozzárendelve.
- Standard Widget Toolkit (SWT) - Az operációs rendszerbe integrált alapvető felhasználói felületelemeket biztosít.
- JFace — Számos SWT-re épített felhasználói felület-keretrendszert biztosít.
- Workbench — Meghatározza az Eclipse UI paradigmáját: szerkesztők, nézetek, perspektívák.
El kell mondanunk, hogy az Eclipse Platform számos más hasznos összetevőt is kínál az integrált fejlesztői eszközök felépítéséhez, beleértve a Debug-ot, a Compare-t, a Search-ot és a Team-et. Külön említést érdemel a JFace Text – a forráskód „intelligens szerkesztőinek” építésének alapja. Sajnos ezen komponensek, valamint az UI réteg összetevőinek felületes vizsgálata sem lehetséges e cikk keretein belül, ezért a szakasz hátralévő részében a főbb „mag” összetevők áttekintésére szorítkozunk. az Eclipse Platform és a JDT.
Core Runtime
Az Eclipse plugin infrastruktúra alapja
Alapvető munkaterület
Szinte minden, az Eclipse Platformra épülő integrált fejlesztői környezet működik az Eclipse munkaterülettel. Általában ez a munkaterület tartalmazza az IDE-ben fejlesztett alkalmazás forráskódját. A munkaterület közvetlenül a fájlrendszerhez van leképezve, és mappákat és fájlokat tartalmazó projektekből áll. Ezeket a projekteket, mappákat és fájlokat hívják erőforrások munkaterület. Az Eclipse munkaterület-megvalósítása gyorsítótárként szolgál a fájlrendszerhez képest, amely lehetővé teszi az erőforrásfa bejárásának jelentős felgyorsítását. Ezen túlmenően a munkaterület számos további szolgáltatást kínál, beleértve
A Core Resources összetevő (org.eclipse.core.resources beépülő modul) felelős a munkaterület és az erőforrások támogatásáért. Ez az összetevő különösen programozott hozzáférést biztosít az űrlap munkaterületéhez erőforrás modellek. Ahhoz, hogy hatékonyan dolgozhassanak ezzel a modellel, az ügyfeleknek egyszerű módra van szükségük az erőforrásra mutató hivatkozás bemutatására. Ebben az esetben kívánatos lenne elrejteni azt az objektumot, amely közvetlenül tárolja az erőforrás állapotát a modellben a kliens hozzáférés elől. Ellenkező esetben, például egy fájl törlése esetén, a kliens továbbra is tárolhat egy olyan objektumot, amely már nem szerepel a modellben, az ebből eredő problémákkal. Az Eclipse ezt a problémát egy ún fogantyú forrás. A fogantyú kulcsként működik (csak a munkaterületen lévő erőforrás elérési útját ismeri), és teljes mértékben felügyeli a belső modellobjektumhoz való hozzáférést, amely közvetlenül tárol információkat az erőforrás állapotáról. Ez a kialakítás a minta egy változata
Rizs. A 2. ábra a Handle/Body idiómát szemlélteti az erőforrásmodellre alkalmazva. Az IResource interfész egy erőforrás leíróját képviseli, és egy API, ellentétben az ezt az interfészt megvalósító Resource osztállyal és a törzset képviselő ResourceInfo osztállyal, amelyek nem API-k. Hangsúlyozzuk, hogy a kezelő csak az erőforrás elérési útját ismeri a munkaterület gyökeréhez viszonyítva, és nem tartalmaz hivatkozást az erőforrás információira. Az erőforrás-információs objektumok egy úgynevezett „elemfát” alkotnak. Ez az adatstruktúra teljesen materializálódik a memóriában. A leírónak megfelelő erőforrás-információs példány megkereséséhez az elemfát az adott leíróban tárolt útvonalnak megfelelően kell bejárni.
Rizs. 2. IResource és ResourceInfo
Mint később látni fogjuk, az erőforrás-modell (nevezhetjük fogantyú-alapúnak) alapkialakítását az Eclipse más modelleknél is alkalmazza. Most soroljunk fel néhány jellegzetes tulajdonságot ennek a kialakításnak:
- A fogantyú egy értékobjektum. Az értékobjektumok olyan megváltoztathatatlan objektumok, amelyek egyenlősége nem azonosságon alapul. Az ilyen objektumok biztonságosan használhatók kulcsként hashed tárolókban. A kezelő több példánya hivatkozhat ugyanarra az erőforrásra. Összehasonlításukhoz az egyenlő (Object) metódust kell használni.
- A Handle meghatározza az erőforrás viselkedését, de nem tartalmaz információt az erőforrás állapotáról (az egyetlen adat, amelyet tárol, a "kulcs", az erőforrás elérési útja).
- A fogantyú olyan erőforrásra hivatkozhat, amely nem létezik (vagy olyan erőforrásra, amelyet még nem hoztak létre, vagy olyan erőforrásra, amelyet már töröltek). Egy erőforrás megléte az IResource.exists() metódussal ellenőrizhető.
- Egyes műveletek csak magában a kezelőben tárolt információk alapján hajthatók végre (ún. csak kezelő műveletek). Ilyen például az IResource.getParent(), a getFullPath() stb. Az erőforrásnak nem kell léteznie ahhoz, hogy egy ilyen művelet sikeres legyen. Azok a műveletek, amelyek sikeréhez erőforrás szükséges, CoreExceptiont dobnak, ha az erőforrás nem létezik.
Az Eclipse hatékony mechanizmust biztosít a munkaterület-erőforrás-változások értesítésére (3. ábra). Az erőforrások az Eclipse IDE-n belül végrehajtott műveletek vagy a fájlrendszerrel való szinkronizálás eredményeként változhatnak. Az értesítésekre feliratkozó ügyfelek mindkét esetben „erőforrás-delták” formájában kapnak részletes tájékoztatást a változásokról. A delta egy munkaterület-erőforrás- (al-)fa két állapota közötti változásokat írja le, és maga is egy fa, amelynek mindegyik csomópontja egy erőforrás változását írja le, és a következő szinten lévő delta-listát tartalmazza, amely leírja az alárendelt erőforrások változásait.
Rizs. 3. IResourceChangeEvent és IResourceDelta
Az erőforrás-deltákon alapuló értesítési mechanizmus a következő jellemzőkkel rendelkezik:
- Egyetlen változtatást és sok változást ugyanazzal a struktúrával írunk le, mivel a delta a rekurzív kompozíció elve alapján épül fel. Az előfizetői ügyfelek rekurzív leereszkedéssel dolgozhatják fel az erőforrás-módosítási értesítéseket a deltafán keresztül.
- A delta teljes információt tartalmaz az erőforrás változásairól, beleértve annak mozgását és/vagy a hozzá tartozó „jelölők” változásait (például a fordítási hibákat jelölőkként ábrázoljuk).
- Mivel az erőforráshivatkozások a kezelőn keresztül történnek, a delta természetesen hivatkozhat egy távoli erőforrásra.
Amint azt hamarosan látni fogjuk, az erőforrásmodell változás értesítési mechanizmus tervezésének fő összetevői más, fogantyú alapú modelleknél is relevánsak.
JDT Core
Az Eclipse munkaterület erőforrásmodellje alapvető nyelv-agnosztikus modell. A JDT Core komponens (plugin org.eclipse.jdt.core) API-t biztosít a munkaterület szerkezetének Java szemszögből történő navigálásához és elemzéséhez, az úgynevezett „Java modell” (Java modell). Ez az API Java-elemekkel van meghatározva, szemben az alapul szolgáló erőforrásmodell API-val, amely mappák és fájlok szerint van meghatározva. A Java elemfa fő interfészeit az ábra mutatja. 4.
Rizs. 4. Java modellelemek
A Java modell ugyanazt a kezelő/törzs idiómát használja, mint az erőforrásmodell (5. ábra). Az IJavaElement a fogantyú, a JavaElementInfo pedig a törzs szerepét tölti be. Az IJavaElement interfész minden Java elemre közös protokollt határoz meg. Néhány metódusa csak kezelhető: getElementName(), getParent() stb. A JavaElementInfo objektum tárolja a megfelelő elem állapotát: annak szerkezetét és attribútumait.
Rizs. 5. IJavaElement és JavaElementInfo
A Java-modellnek van némi különbsége az alapvető fogantyú/test kialakítás megvalósításában az erőforrásmodellhez képest. Ahogy fentebb megjegyeztük, az erőforrásmodellben az elemfa, amelynek csomópontjai erőforrás-információs objektumok, teljes egészében a memóriában található. De a Java-modell lényegesen nagyobb elemszámú lehet, mint az erőforrásfa, mert a .java és .class fájlok belső szerkezetét is reprezentálja: típusokat, mezőket és metódusokat.
Annak elkerülése érdekében, hogy a teljes elemfa teljesen materializálódjon a memóriában, a Java-modell megvalósítása az eleminformációk korlátozott méretű LRU gyorsítótárát használja, ahol a kulcs a handle IJavaElement. az eleminformációs objektumok igény szerint jönnek létre az elemfa navigálása közben. Ebben az esetben a legritkábban használt elemek kikerülnek a gyorsítótárból, és a modell memóriafogyasztása a megadott gyorsítótár méretre korlátozódik. Ez a fogantyú alapú tervezés másik előnye, amely teljesen elrejti az ilyen implementációs részleteket a kliens kódja elől.
A Java elemek változásainak értesítési mechanizmusa általában hasonló a munkaterület-erőforrások változásainak nyomon követésének fentebb tárgyalt mechanizmusához. A Java-modell változásait figyelni kívánó kliens feliratkozik az értesítésekre, amelyek egy IJavaElementDeltát tartalmazó ElementChangedEvent objektumként jelennek meg (6. ábra).
Rizs. 6. ElementChangedEvent és IJavaElementDelta
A Java-modell nem tartalmaz információkat a metódustörzsekről vagy a névfeloldásról, így a Java nyelven írt kód részletes elemzéséhez a JDT Core egy további (nem kezelő alapú) modellt biztosít:
Mivel a szintaktikai fák jelentős mennyiségű memóriát fogyaszthatnak, a JDT csak egy AST gyorsítótárat tárol az aktív szerkesztő számára. A Java-modelltől eltérően az AST-t jellemzően "köztes", "ideiglenes" modellnek tekintik, amelynek elemeire az ügyfelek nem hivatkozhatnak az AST létrehozásához vezető művelet kontextusán kívül.
A felsorolt három modell (Java modell, AST, kötések) együttesen képezi az alapját az „intelligens fejlesztőeszközök” JDT-ben való felépítésének, beleértve a hatékony Java szerkesztőt különféle „segítőkkel”, a forráskód feldolgozására szolgáló különféle műveleteket (beleértve az importlista rendszerezését is). nevek és formázás a testreszabott stílusnak megfelelően), keresési és átalakítási eszközök. Ebben az esetben a Java modell különleges szerepet játszik, mivel ez szolgál alapul a fejlesztés alatt álló alkalmazás szerkezetének vizuális megjelenítéséhez (például a Package Explorer, Outline, Search, Call Hierarchy, ill. Type Hierarchy).
Az 1C:Enterprise Developments Toolsban használt Eclipse összetevők
ábrán. A 7. ábra azokat az Eclipse összetevőket mutatja, amelyek az 1C:Enterprise Development Tools technológiai platformjának alapját képezik.
Rizs. 7. Az Eclipse az 1C:Enterprise Development Tools platformja
Eclipse platform alapvető infrastruktúrát biztosít. Az előző részben megvizsgáltuk ennek az infrastruktúrának néhány aspektusát.
Mint minden igazán általános célú eszköz, az EMF is alkalmas a modellezési problémák széles körének megoldására, de egyes modellosztályok (például a fentebb tárgyalt fogantyús modellek) speciális modellező eszközöket igényelhetnek. Az EMF-ről beszélni hálátlan feladat, különösen egy cikk korlátozott keretein belül, mivel ez egy külön könyv témája, és egy meglehetősen vastag. Csak annyit jegyezzünk meg, hogy az EMF mögött meghúzódó magas színvonalú általánosítási rendszer lehetővé tette a modellezéssel foglalkozó projektek egész sorának megszületését, amelyek a felső szintű projektben szerepelnek.
Az 1C:Enterprise Development Tools aktívan használja magát az EMF-et és számos más Eclipse Modeling projektet is. Különösen az Xtext az egyik alapja az olyan 1C:Enterprise nyelvek fejlesztői eszközeinek, mint a beépített programozási nyelv és a lekérdezési nyelv. Ezeknek a fejlesztőeszközöknek egy másik alapja az Eclipse Handly projekt, amelyről részletesebben is szó lesz (a felsorolt Eclipse komponensek közül még mindig ez a legkevésbé ismert).
A fogantyú alapú modellek alapvető felépítési elveit, mint például a fogantyú/test idióma, fentebb tárgyaltuk az erőforrás-modell és a Java-modell példaként való felhasználásával. Azt is megjegyezte, hogy mind az erőforrás-modell, mind a Java-modell fontos alapjai az Eclipse Java fejlesztői eszközöknek (JDT). És mivel szinte minden *DT Eclipse projekt a JDT-hez hasonló architektúrával rendelkezik, nem lenne túlzás azt állítani, hogy sok, ha nem az összes Eclipse Platform tetejére épülő IDE alapja a kezelőelemekre épülő modell. Például az Eclipse C/C++ Development Tooling (CDT) rendelkezik egy fogantyú alapú C/C++ modellel, amely ugyanazt a szerepet játszik a CDT architektúrában, mint a Java modell a JDT-ben.
A Handly előtt az Eclipse nem kínált speciális könyvtárakat a fogantyú alapú nyelvi modellek készítésére. A jelenleg létező modellek főként a Java modellkód közvetlen adaptálásával jöttek létre (más néven másolás/beillesztés), azokban az esetekben, amikor megengedi Eclipse Public License (EPL). (Nyilván ez általában nem jogi probléma mondjuk magának az Eclipse-nek a projektjeinél, de a zárt forráskódú termékeknél nem.) A benne rejlő véletlenszerűségen túl ez a technika jól ismert problémákat is felvet: a hibákhoz való alkalmazkodás során bevezetett kódduplikáció, stb. A legrosszabb az, hogy az így létrejövő modellek „önmagukban lévő dolgok” maradnak, és nem használják ki az egységesítés lehetőségét. De a fogantyú alapú nyelvi modellek közös fogalmainak és protokolljainak elkülönítése a velük való munkavégzéshez újrafelhasználható komponensek létrehozásához vezethet, hasonlóan ahhoz, ami az EMF esetében történt.
Nem arról van szó, hogy az Eclipse nem értette ezeket a kérdéseket. Még 2005-ben
Bizonyos értelemben a Handly projekt megközelítőleg ugyanazokat a problémákat hivatott megoldani, mint az EMF, de kezelőelemekre épülő modellekre, és elsősorban nyelviekre (vagyis valamilyen programozási nyelv szerkezetének elemeit reprezentálva). A Handly tervezése során kitűzött fő célok az alábbiak:
- A témakör főbb absztrakcióinak azonosítása.
- Az erőfeszítések csökkentése és a fogantyú alapú nyelvi modellek megvalósításának minőségének javítása a kód újrafelhasználásával.
- Egységes metaszintű API biztosítása a kapott modellekhez, lehetővé téve olyan közös IDE komponensek létrehozását, amelyek nyelvi leíró alapú modellekkel működnek.
- Rugalmasság és méretezhetőség.
- Integráció Xtext-el (külön rétegben).
A gyakori fogalmak és protokollok kiemelése érdekében a nyelvi leíró alapú modellek meglévő implementációit elemeztük. A Handly által biztosított főbb interfészek és alapvető megvalósítások az ábrán láthatók. 8.
Rizs. 8. A Handly elemek közös felületei és alapvető megvalósításai
Az IElement interfész egy elem fogantyúját képviseli, és minden Handly-alapú modell elemében közös. Az absztrakt osztály Element az általánosított fogantyú/test mechanizmust valósítja meg (9. ábra).
Rizs. 9. IEelem és általános fogantyú/test megvalósítás
Ezenkívül a Handly egy általánosított mechanizmust biztosít a modellelemek változásainak értesítésére (10. ábra). Mint látható, nagyjából hasonló az erőforrás-modellben és a Java-modellben megvalósított értesítési mechanizmusokhoz, és az IElementDelta-t használja az elemváltozási információk egységes megjelenítésére.
Rizs. 10. A Handly értesítési mechanizmus általános felületei és alapvető megvalósításai
A fentebb tárgyalt Handly rész (9. és 10. ábra) szinte bármilyen fogantyús modell ábrázolására használható. Az alkotáshoz nyelvi modellek, a projekt további funkcionalitást kínál - különösen a forrásszöveg-struktúra elemeihez közös felületeket és alapvető megvalósításokat, az ún. forráselemek (8. ábra). Az ISourceFile felület egy forrásfájlt, az ISourceConstruct pedig a forrásfájl egy elemét képviseli. A SourceFile és SourceConstruct absztrakt osztályok általánosított mechanizmusokat valósítanak meg a forrásfájlokkal és azok elemeivel való munkavégzés támogatására, például a szöveges pufferekkel való munkavégzés, a forrásszöveg elemeinek koordinátáihoz való kötődés, a modellek egyeztetése a munkamásolat puffer aktuális tartalmával. stb. Ezeknek a mechanizmusoknak a megvalósítása általában nagy kihívást jelent, és a Handly jelentősen csökkentheti a handly-alapú nyelvi modellek fejlesztésének erőfeszítéseit, ha jó minőségű alapmegvalósításokat biztosít.
A fent felsorolt alapvető mechanizmusokon kívül a Handly infrastruktúrát biztosít szöveges pufferekhez és pillanatképekhez, támogatja a forráskód-szerkesztőkkel való integrációt (beleértve az Xtext szerkesztővel való azonnali integrációt), valamint néhány gyakori felhasználói felület-összetevőt, dolgozzon forráskód-szerkesztőkkel. Kézenfekvő modellek, mint például az outline framework. Képességeinek illusztrálására a projekt számos példát mutat be, beleértve a Java-modell Handly-ben való megvalósítását. (A Java-modell JDT-ben való teljes megvalósításához képest ezt a modellt szándékosan leegyszerűsítették a jobb áttekinthetőség érdekében.)
Amint azt korábban megjegyeztük, a Handly kezdeti tervezése és az azt követő fejlesztés során a fő hangsúly a méretezhetőségen és a rugalmasságon volt, és továbbra is az.
A fogantyús modellek elvileg meglehetősen jól méretezhetők „tervezés szerint”. Például a fogantyú/test idióma lehetővé teszi a modell által fogyasztott memória mennyiségének korlátozását. De vannak árnyalatok is. Így a Handly skálázhatósági tesztelése során problémát fedeztek fel az értesítési mechanizmus megvalósításában - amikor nagyszámú elemet megváltoztattak, a delták létrehozása túl sok időt vett igénybe. Kiderült, hogy ugyanez a probléma volt a JDT Java modellben is, amelyből egykor adaptálták a megfelelő kódot. Kijavítottuk a Handly hibáját, és elkészítettünk egy hasonló javítást a JDT-hez, amelyet köszönettel fogadtunk. Ez csak egy példa arra, hogy a Handly bevezetése a meglévő modellmegvalósításokba potenciálisan hasznos lehet, mert ebben az esetben egy ilyen hiba egyetlen helyen javítható.
Ahhoz, hogy a Handly implementálása a meglévő modellmegvalósításokba technikailag megvalósítható legyen, a könyvtárnak jelentős rugalmassággal kell rendelkeznie. A fő probléma a visszamenőleges kompatibilitás fenntartása az API-modellben. Ezt a problémát ben megoldották
A rugalmasságnak más vonatkozásai is vannak. Például a Handly szinte semmilyen korlátozást nem ír elő a modell szerkezetére vonatkozóan, és használható mind az általános célú, mind a tartományspecifikus nyelvek modellezésére. A forrásfájl szerkezetének felépítése során Handly nem ír elő semmilyen konkrét AST-megjelenítési formát, és elvileg nem is követeli meg magának az AST-nek a jelenlétét, így biztosítja a kompatibilitást szinte minden elemzési mechanizmussal. Végül, a Handly támogatja a teljes integrációt az Eclipse munkaterülettel, de közvetlenül is működhet fájlrendszerekkel, köszönhetően a
Jelenlegi verzió
Mint fentebb említettük, az egyik ilyen termék az 1C:Enterprise Development Tools, ahol a Handly-t a kezdetektől fogva az ilyen 1C:Enterprise nyelvek magas szintű struktúrájának elemeinek modellezésére használják, mint a beépített programozási nyelv és a lekérdezési nyelv. . Egy másik termék kevésbé ismert a nagyközönség számára. Ez
Reméljük, hogy az API stabilitását garantáló 1.0-s verzió megjelenése és a projekt inkubációs állapotból való kilépése után a Handlynek új elfogadói lesznek. Eközben a projekt folytatja az API tesztelését és továbbfejlesztését, évente két "nagy" kiadást adnak ki – júniusban (ugyanaz a dátum, mint az egyidejű Eclipse kiadás) és decemberben, így kiszámítható ütemezést biztosítanak, amelyre az alkalmazók támaszkodhatnak. Hozzátehetjük azt is, hogy a projekt „hibaaránya” folyamatosan alacsony szinten marad, és a Handly a legelső verziók óta megbízhatóan dolgozik a korai alkalmazók termékeiben. Az Eclipse Handly további felfedezéséhez használhatja
Forrás: will.com