Հավանաբար
Այս հոդվածում, որն իր բնույթով ակնարկ է, մենք կփորձենք դիտարկել Eclipse ճարտարապետության որոշ հիմունքներ՝ որպես ինտեգրված զարգացման գործիքներ կառուցելու հարթակ և նախնական պատկերացում տալ Eclipse բաղադրիչների մասին, որոնք կազմում են տեխնոլոգիայի հիմքը: հարթակ «նոր կոնֆիգուրատորի» 1C: Enterprise-ի համար:
Eclipse Architecture-ի ներածություն
Եկեք նախ նայենք Eclipse ճարտարապետության որոշ ընդհանուր ասպեկտներին՝ օգտագործելով օրինակը
Նախևառաջ, հարկ է նշել, որ Eclipse-ին բնորոշ է բավականին հստակ ճարտարապետական շերտավորում՝ լեզվից անկախ ֆունկցիոնալության տարանջատմամբ հատուկ ծրագրավորման լեզուներին աջակցելու համար նախատեսված ֆունկցիոնալությունից և UI-ից անկախ «հիմնական» բաղադրիչների տարանջատմամբ կապված բաղադրիչներից: աջակցող օգտագործողի միջերեսով:
Այսպիսով, Eclipse պլատֆորմը սահմանում է ընդհանուր, լեզվից անկախ ենթակառուցվածք, իսկ Java-ի մշակման գործիքները Eclipse-ին ավելացնում են լիարժեք Java IDE: Ե՛վ Eclipse պլատֆորմը, և՛ JDT-ը բաղկացած են մի քանի բաղադրիչներից, որոնցից յուրաքանչյուրը պատկանում է կամ UI-ից անկախ «միջուկին», կամ UI շերտին (Նկար 1):
Բրինձ. 1. Eclipse Platform և JDT
Եկեք թվարկենք Eclipse հարթակի հիմնական բաղադրիչները.
- Runtime — Սահմանում է plugin-ի ենթակառուցվածքը: Խավարումը բնութագրվում է մոդուլային ճարտարապետությամբ: Ըստ էության, Eclipse-ը «երկարացման կետերի» և «ընդլայնումների» հավաքածու է։
- Աշխատանքային տարածք — Կառավարում է մեկ կամ մի քանի նախագծեր: Նախագիծը բաղկացած է թղթապանակներից և ֆայլերից, որոնք քարտեզագրված են անմիջապես ֆայլային համակարգին:
- Ստանդարտ վիդջեթների գործիքակազմ (SWT) - Ապահովում է հիմնական ինտերֆեյսի տարրերը, որոնք ինտեգրված են օպերացիոն համակարգին:
- JFace — Ապահովում է մի շարք UI շրջանակներ՝ կառուցված SWT-ի վրա:
- Workbench — Սահմանում է Eclipse UI պարադիգմը՝ խմբագիրներ, տեսակետներ, հեռանկարներ:
Պետք է ասել, որ Eclipse պլատֆորմը տրամադրում է նաև բազմաթիվ այլ օգտակար բաղադրիչներ՝ ինտեգրված զարգացման գործիքներ ստեղծելու համար, այդ թվում՝ Debug, Compare, Search և Team: Հարկ է հատուկ նշել JFace Text-ը, որը հիմք է հանդիսանում սկզբնական կոդի «խելացի խմբագիրներ» ստեղծելու համար: Ցավոք, այս բաղադրիչների, ինչպես նաև UI շերտի բաղադրիչների նույնիսկ հպանցիկ ուսումնասիրությունը հնարավոր չէ այս հոդվածի շրջանակներում, ուստի այս բաժնի մնացած մասում մենք կսահմանափակվենք հիմնական «հիմնական» բաղադրիչների ակնարկով: Eclipse հարթակը և JDT-ն:
Հիմնական Runtime
Eclipse հավելվածի ենթակառուցվածքը հիմնված է
Հիմնական աշխատանքային տարածք
Գրեթե ցանկացած ինտեգրված զարգացման միջավայր, որը կառուցված է Eclipse պլատֆորմի վերևում, աշխատում է Eclipse աշխատանքային տարածքի հետ: Դա աշխատանքային տարածքն է, որը սովորաբար պարունակում է IDE-ում մշակված հավելվածի սկզբնական կոդը: Աշխատանքային տարածքը քարտեզագրվում է անմիջապես ֆայլային համակարգին և բաղկացած է նախագծերից, որոնք պարունակում են թղթապանակներ և ֆայլեր: Այս նախագծերը, թղթապանակները և ֆայլերը կոչվում են ռեսուրսներ աշխատանքային տարածք. Աշխատանքային տարածքի իրականացումը Eclipse-ում ծառայում է որպես քեշ ֆայլային համակարգի հետ կապված, ինչը հնարավորություն է տալիս զգալիորեն արագացնել ռեսուրսների ծառի անցումը: Բացի այդ, աշխատանքային տարածքը տրամադրում է մի շարք լրացուցիչ ծառայություններ, այդ թվում
Core Resources բաղադրիչը (org.eclipse.core.resources plugin) պատասխանատու է աշխատանքային տարածքին և դրա ռեսուրսներին աջակցելու համար: Մասնավորապես, այս բաղադրիչը ապահովում է ծրագրային մուտք դեպի աշխատանքային տարածք ձևով ռեսուրսների մոդելներ. Այս մոդելի հետ արդյունավետ աշխատելու համար հաճախորդներին անհրաժեշտ է ռեսուրսի հղումը ներկայացնելու պարզ միջոց: Այս դեպքում, ցանկալի կլիներ, որ այն օբյեկտը, որն ուղղակիորեն պահում է ռեսուրսի վիճակը մոդելում, հաճախորդի հասանելիությունից թաքցնելը։ Հակառակ դեպքում, օրինակ, ֆայլը ջնջելու դեպքում, հաճախորդը կարող է շարունակել պահել այն օբյեկտը, որն այլևս մոդելում չէ՝ դրանից բխող խնդիրներով: Eclipse-ը լուծում է այս խնդիրը՝ օգտագործելով մի բան, որը կոչվում է բռնակ ռեսուրս. Handle-ը գործում է որպես բանալի (այն գիտի միայն աշխատանքային տարածքում գտնվող ռեսուրսի ուղին) և ամբողջությամբ վերահսկում է մուտքը ներքին մոդելի օբյեկտ, որն ուղղակիորեն պահում է տեղեկատվություն ռեսուրսի վիճակի մասին: Այս դիզայնը նախշի տարբերակ է
Բրինձ. Նկար 2-ը ցույց է տալիս Handle/Body բառապաշարը, ինչպես կիրառվում է ռեսուրսի մոդելի համար: IRResource ինտերֆեյսը ներկայացնում է ռեսուրսի բռնիչը և հանդիսանում է API, ի տարբերություն Resource դասի, որն իրականացնում է այս ինտերֆեյսը, և ResourceInfo դասի, որը ներկայացնում է մարմինը, որոնք API-ներ չեն: Մենք շեշտում ենք, որ handle-ը գիտի միայն ռեսուրսի ուղին աշխատանքային տարածքի արմատի համեմատ և չի պարունակում ռեսուրսի տեղեկատվության հղում: Ռեսուրսների տեղեկատվական օբյեկտները կազմում են այսպես կոչված «տարրերի ծառ»: Այս տվյալների կառուցվածքը ամբողջությամբ նյութականացված է հիշողության մեջ: Բռնակին համապատասխանող ռեսուրսի տեղեկատվության օրինակը գտնելու համար տարրի ծառը անցնում է այդ բռնակում պահվող ուղու համաձայն:
Բրինձ. 2. IRResource և ResourceInfo
Ինչպես կտեսնենք ավելի ուշ, ռեսուրսների մոդելի հիմնական դիզայնը (մենք կարող ենք այն անվանել բռնակի վրա հիմնված) օգտագործվում է Eclipse-ում նաև այլ մոդելների համար: Առայժմ, եկեք թվարկենք այս դիզայնի մի քանի տարբերակիչ հատկություններ.
- Բռնակը արժեքային օբյեկտ է: Արժեքային օբյեկտները անփոփոխ օբյեկտներ են, որոնց հավասարությունը հիմնված չէ ինքնության վրա: Նման առարկաները կարող են ապահով կերպով օգտագործվել որպես բանալի հաշված տարաներում: Բռնակի բազմաթիվ օրինակներ կարող են հղում կատարել նույն ռեսուրսին: Նրանց համեմատելու համար հարկավոր է օգտագործել հավասար (Object) մեթոդը։
- Handle-ը սահմանում է ռեսուրսի վարքագիծը, բայց չի պարունակում տեղեկատվություն ռեսուրսի վիճակի մասին (միակ տվյալը, որը պահում է «բանալին» է՝ դեպի ռեսուրս տանող ճանապարհը):
- Handle-ը կարող է վերաբերել ռեսուրսին, որը գոյություն չունի (կամ ռեսուրս, որը դեռ չի ստեղծվել, կամ ռեսուրս, որն արդեն ջնջվել է): Ռեսուրսի առկայությունը կարելի է ստուգել IResource.exists() մեթոդի միջոցով։
- Որոշ գործողություններ կարող են իրականացվել՝ հիմնվելով միայն բռնակում պահվող տեղեկատվության վրա (այսպես կոչված՝ միայն բռնակով գործողություններ): Օրինակներ են IResource.getParent(), getFullPath() և այլն: Նման գործողության հաջողության համար ռեսուրսը պետք չէ գոյություն ունենալ: Գործողությունները, որոնք պահանջում են ռեսուրսի գոյությունը հաջողության հասնելու համար, գցում են CoreException, եթե ռեսուրսը գոյություն չունի:
Eclipse-ն ապահովում է աշխատանքային տարածքի ռեսուրսների փոփոխությունների ծանուցման արդյունավետ մեխանիզմ (Նկար 3): Ռեսուրսները կարող են փոխվել կամ Eclipse IDE-ում կատարված գործողությունների արդյունքում, կամ ֆայլային համակարգի հետ համաժամացման արդյունքում: Երկու դեպքում էլ ծանուցումներին բաժանորդագրված հաճախորդներին տրամադրվում է մանրամասն տեղեկատվություն փոփոխությունների մասին «ռեսուրսների դելտաների» տեսքով: Դելտան նկարագրում է աշխատանքային տարածքի ռեսուրսի (ենթածառի) երկու վիճակների միջև փոփոխությունները և ինքնին ծառ է, որի յուրաքանչյուր հանգույց նկարագրում է ռեսուրսի փոփոխությունը և պարունակում է հաջորդ մակարդակի դելտաների ցանկ, որոնք նկարագրում են երեխայի ռեսուրսների փոփոխությունները:
Բրինձ. 3. IResourceChangeEvent և IResourceDelta
Ռեսուրսների դելտաների վրա հիմնված ծանուցման մեխանիզմն ունի հետևյալ բնութագրերը.
- Մեկ փոփոխություն և բազմաթիվ փոփոխություններ նկարագրված են նույն կառուցվածքով, քանի որ դելտան կառուցված է ռեկուրսիվ կազմի սկզբունքով։ Բաժանորդների հաճախորդները կարող են մշակել ռեսուրսների փոփոխության ծանուցումները՝ օգտագործելով ռեկուրսիվ ծագումը դելտաների ծառի միջով:
- Դելտան պարունակում է ամբողջական տեղեկատվություն ռեսուրսի փոփոխությունների մասին, ներառյալ դրա շարժը և/կամ դրա հետ կապված «մարկերների» փոփոխությունները (օրինակ, կոմպիլյացիայի սխալները ներկայացված են որպես նշիչներ):
- Քանի որ ռեսուրսների հղումները կատարվում են բռնակի միջոցով, դելտան, բնականաբար, կարող է հղում կատարել հեռավոր ռեսուրսին:
Ինչպես շուտով կտեսնենք, ռեսուրսների մոդելի փոփոխության ծանուցման մեխանիզմի նախագծման հիմնական բաղադրիչները տեղին են նաև բռնակի վրա հիմնված այլ մոդելների համար:
JDT Core
Eclipse աշխատանքային տարածքի ռեսուրսի մոդելը հիմնարար լեզվաագնոստիկ մոդել է: JDT Core բաղադրիչը (plugin org.eclipse.jdt.core) ապահովում է API՝ Java-ի տեսանկյունից աշխատանքային տարածքի կառուցվածքը նավարկելու և վերլուծելու համար, այսպես կոչված «Java մոդելը» (Java մոդելը) Այս API-ն սահմանվում է Java-ի տարրերով, ի տարբերություն հիմքում ընկած ռեսուրսների մոդելի API-ի, որը սահմանվում է թղթապանակների և ֆայլերի առումով: Java տարրերի ծառի հիմնական միջերեսները ներկայացված են Նկ. 4.
Բրինձ. 4. Java Model Elements
Java մոդելն օգտագործում է նույն բռնակ/մարմնի արտահայտությունը, ինչ ռեսուրսի մոդելը (Նկար 5): IJavaElement-ը բռնակն է, իսկ JavaElementInfo-ն խաղում է մարմնի դերը: IJavaElement ինտերֆեյսը սահմանում է բոլոր Java տարրերի համար ընդհանուր արձանագրություն: Դրա որոշ մեթոդներ միայն handle-ով են՝ getElementName(), getParent() և այլն: JavaElementInfo օբյեկտը պահպանում է համապատասխան տարրի վիճակը՝ նրա կառուցվածքը և ատրիբուտները:
Բրինձ. 5. IJavaElement և JavaElementInfo
Java մոդելը որոշ տարբերություններ ունի հիմնական բռնակի/մարմնի դիզայնի իրականացման մեջ՝ համեմատած ռեսուրսների մոդելի հետ: Ինչպես նշվեց վերևում, ռեսուրսների մոդելում տարրերի ծառը, որի հանգույցները ռեսուրսի տեղեկատվական օբյեկտներ են, ամբողջությամբ պարունակվում է հիշողության մեջ: Բայց Java մոդելը կարող է զգալիորեն ավելի մեծ թվով էլեմենտներ ունենալ, քան ռեսուրսների ծառը, քանի որ այն նաև ներկայացնում է .java և .class ֆայլերի ներքին կառուցվածքը՝ տեսակներ, դաշտեր և մեթոդներ:
Հիշողության մեջ տարրերի ամբողջ ծառի ամբողջական նյութականացումից խուսափելու համար Java մոդելի ներդրումն օգտագործում է տարրերի տեղեկատվության սահմանափակ չափի LRU քեշ, որտեղ բանալին IJavaElement-ի կարգավորիչն է: տարրի տեղեկատվական օբյեկտները ստեղծվում են ըստ պահանջի, քանի որ տարրի ծառը նավարկվում է: Այս դեպքում ամենաքիչ օգտագործվող տարրերը դուրս են մղվում քեշից, և մոդելի հիշողության սպառումը մնում է սահմանափակված քեշի նշված չափով: Սա բռնակի վրա հիմնված դիզայնի ևս մեկ առավելություն է, որն ամբողջությամբ թաքցնում է իրականացման նման մանրամասները հաճախորդի կոդից:
Java տարրերի փոփոխություններին ծանուցելու մեխանիզմը ընդհանուր առմամբ նման է վերը քննարկված աշխատանքային տարածքի ռեսուրսների փոփոխություններին հետևելու մեխանիզմին: Հաճախորդը, որը ցանկանում է վերահսկել Java մոդելի փոփոխությունները, բաժանորդագրվում է ծանուցումների, որոնք ներկայացված են որպես ElementChangedEvent օբյեկտ, որը պարունակում է IJavaElementDelta (Նկար 6):
Բրինձ. 6. ElementChangedEvent և IJavaElementDelta
Java մոդելը չի պարունակում տեղեկատվություն մեթոդի մարմինների կամ անվան լուծման մասին, ուստի Java-ում գրված կոդի մանրամասն վերլուծության համար JDT Core-ը տրամադրում է լրացուցիչ (ոչ բռնակի վրա հիմնված) մոդել.
Քանի որ շարահյուսական ծառերը կարող են սպառել զգալի քանակությամբ հիշողություն, JDT-ն ակտիվ խմբագրի համար պահում է միայն մեկ AST: Ի տարբերություն Java մոդելի, AST-ը սովորաբար դիտվում է որպես «միջանկյալ», «ժամանակավոր» մոդել, որի անդամները չպետք է մատնանշվեն հաճախորդների կողմից AST-ի ստեղծմանը հանգեցրած գործողության համատեքստից դուրս:
Թվարկված երեք մոդելները (Java մոդել, AST, կապեր) միասին հիմք են հանդիսանում JDT-ում «խելացի զարգացման գործիքներ» ստեղծելու համար, ներառյալ հզոր Java խմբագիր տարբեր «օգնականներով», տարբեր գործողություններ՝ ելակետային կոդի մշակման համար (ներառյալ ներմուծման ցուցակի կազմակերպումը: անուններ և ձևաչափում ըստ հարմարեցված ոճի), որոնման և վերամշակման գործիքներ: Այս դեպքում Java մոդելը հատուկ դեր է խաղում, քանի որ հենց դա է օգտագործվում որպես մշակվող հավելվածի կառուցվածքի տեսողական ներկայացման հիմք (օրինակ՝ Package Explorer, Outline, Search, Call Hierarchy և Տիպի հիերարխիա):
Eclipse բաղադրիչները, որոնք օգտագործվում են 1C:Enterprise Developments Tools-ում
Նկ. Նկար 7-ը ցույց է տալիս Eclipse բաղադրիչները, որոնք կազմում են 1C:Enterprise Development Tools-ի տեխնոլոգիական հարթակի հիմքը:
Բրինձ. 7. Eclipse-ը որպես հարթակ 1C:Enterprise Development Tools-ի համար
Eclipse հարթակ ապահովում է հիմնական ենթակառուցվածքը. Մենք նայեցինք այս ենթակառուցվածքի որոշ ասպեկտներին նախորդ բաժնում:
Ինչպես ցանկացած իսկապես ընդհանուր նշանակության գործիք, EMF-ը հարմար է մոդելավորման խնդիրների լայն շրջանակի լուծման համար, սակայն մոդելների որոշ դասեր (օրինակ՝ վերը քննարկված բռնակով մոդելները) կարող են պահանջել ավելի մասնագիտացված մոդելավորման գործիքներ: EMF-ի մասին խոսելն անշնորհակալ գործ է, հատկապես մեկ հոդվածի սահմանափակ սահմաններում, քանի որ սա առանձին գրքի թեմա է, այն էլ՝ բավականին հաստ: Նշենք միայն, որ EMF-ի հիմքում ընկած ընդհանրացումների բարձրորակ համակարգը թույլ է տվել մոդելավորմանը նվիրված մի շարք նախագծերի ծնունդ, որոնք ներառված են վերին մակարդակի նախագծում:
1C:Enterprise Development Tools-ը ակտիվորեն օգտագործում է ինչպես EMF-ն, այնպես էլ Eclipse Modeling-ի մի շարք այլ նախագծեր: Մասնավորապես, Xtext-ը զարգացման գործիքներից մեկն է այնպիսի 1C:Enterprise լեզուների համար, ինչպիսիք են ներկառուցված ծրագրավորման լեզուն և հարցումների լեզուն: Մշակման այս գործիքների մեկ այլ հիմք է Eclipse Handly նախագիծը, որը մենք կքննարկենք ավելի մանրամասն (թվարկված Eclipse բաղադրիչներից այն դեռ ամենաքիչ հայտնին է):
Բռնակի վրա հիմնված մոդելների հիմնական ճարտարապետական սկզբունքները, ինչպիսիք են բռնակ/մարմնի բառապաշարը, քննարկվել են վերևում՝ օգտագործելով ռեսուրսի մոդելը և Java մոդելը որպես օրինակ: Այն նաև նշել է, որ և՛ ռեսուրսների մոդելը, և՛ Java մոդելը կարևոր հիմքեր են Eclipse Java զարգացման գործիքների (JDT) համար: Եվ քանի որ *DT Eclipse-ի գրեթե բոլոր նախագծերն ունեն JDT-ին նման ճարտարապետություն, մեծ չափազանցություն չի լինի ասել, որ բռնակներով մոդելների հիմքում ընկած են շատ, եթե ոչ բոլոր IDE-ները, որոնք կառուցված են Eclipse հարթակի վերևում: Օրինակ, Eclipse C/C++ Development Tooling-ը (CDT) ունի բռնակի վրա հիմնված C/C++ մոդել, որը նույն դերն է խաղում CDT ճարտարապետության մեջ, ինչ Java մոդելը JDT-ում:
Մինչ Handly-ը, Eclipse-ը չէր առաջարկում մասնագիտացված գրադարաններ բռնակի վրա հիմնված լեզվական մոդելներ ստեղծելու համար: Ներկայումս գոյություն ունեցող մոդելները ստեղծվել են հիմնականում Java մոդելի կոդը ուղղակիորեն հարմարեցնելու միջոցով (aka copy/paste), այն դեպքերում, երբ դա թույլ է տալիս Eclipse Public License (EPL): (Ակնհայտ է, որ սա սովորաբար իրավական խնդիր չէ, ասենք, Eclipse-ի նախագծերի համար, բայց ոչ փակ կոդով արտադրանքի համար:) Ի լրումն իր բնորոշ պատահականության, այս տեխնիկան ներկայացնում է հայտնի խնդիրներ. և այլն: Ամենավատն այն է, որ ստացված մոդելները մնում են «իրենց իրերը» և չեն օգտվում միավորման ներուժից: Բայց բռնակի վրա հիմնված լեզվական մոդելների համար ընդհանուր հասկացությունների և արձանագրությունների մեկուսացումը կարող է հանգեցնել դրանց հետ աշխատելու համար բազմակի օգտագործման բաղադրիչների ստեղծմանը, ինչպես EMF-ի դեպքում:
Այնպես չէ, որ Eclipse-ը չի հասկացել այս հարցերը: Դեռ 2005թ
Որոշակի իմաստով Handly նախագիծը նախատեսված է մոտավորապես նույն խնդիրները լուծելու համար, ինչ EMF-ը, բայց բռնակի վրա հիմնված մոդելների և հիմնականում լեզվական մոդելների համար (այսինքն՝ որոշ ծրագրավորման լեզվի կառուցվածքի տարրեր ներկայացնելու համար): Handly-ի նախագծման ժամանակ դրված հիմնական նպատակները թվարկված են ստորև.
- Առարկայական ոլորտի հիմնական աբստրակցիաների բացահայտում:
- Նվազեցնել ջանքերը և բարելավել բռնակի վրա հիմնված լեզվական մոդելների իրականացման որակը կոդի վերաօգտագործման միջոցով:
- Ստացված մոդելներին տրամադրելով միասնական մետա-մակարդակի API՝ հնարավոր դարձնելով ստեղծել ընդհանուր IDE բաղադրիչներ, որոնք աշխատում են լեզվական բռնակի վրա հիմնված մոդելների հետ:
- Ճկունություն և մասշտաբայնություն:
- Ինտեգրում Xtext-ի հետ (առանձին շերտով):
Ընդհանուր հասկացություններն ու արձանագրությունները ընդգծելու համար վերլուծվել են լեզվական բռնակի վրա հիմնված մոդելների առկա իրականացումները: Handly-ի կողմից տրամադրված հիմնական ինտերֆեյսները և հիմնական իրականացումները ներկայացված են Նկ. 8.
Բրինձ. 8. Handly տարրերի ընդհանուր ինտերֆեյսները և հիմնական իրականացումները
IElement ինտերֆեյսը ներկայացնում է տարրի բռնակը և ընդհանուր է Handly-ի վրա հիմնված բոլոր մոդելների տարրերի համար: Abstract դասի Element-ն իրականացնում է ընդհանրացված բռնակ/մարմնի մեխանիզմը (նկ. 9):
Բրինձ. 9. IElement և ընդհանուր բռնակ/մարմնի իրականացում
Բացի այդ, Handly-ն ապահովում է մոդելի տարրերի փոփոխությունների մասին ծանուցման ընդհանրացված մեխանիզմ (նկ. 10): Ինչպես տեսնում եք, այն ընդհանուր առմամբ նման է ռեսուրսի մոդելում և Java մոդելում ներդրված ծանուցման մեխանիզմներին և օգտագործում է IElementDelta՝ տարրի փոփոխության տեղեկատվության միասնական ներկայացում ապահովելու համար:
Բրինձ. 10. Handly-ի ծանուցման մեխանիզմի ընդհանուր ինտերֆեյսներ և հիմնական իրականացումներ
Վերևում քննարկված Handly-ի մասը (Նկար 9 և 10) կարող է օգտագործվել բռնակի վրա հիմնված գրեթե ցանկացած մոդել ներկայացնելու համար: Ստեղծելու համար լեզվաբանական մոդելներ, նախագիծն առաջարկում է լրացուցիչ ֆունկցիոնալություն, մասնավորապես, ընդհանուր ինտերֆեյսներ և հիմնական իրագործումներ սկզբնական տեքստի կառուցվածքի տարրերի համար, այսպես կոչված. աղբյուրի տարրեր (նկ. 8): ISourceFile ինտերֆեյսը ներկայացնում է աղբյուրի ֆայլը, իսկ ISourceConstruct-ը ներկայացնում է աղբյուրի ֆայլի տարրը: SourceFile և SourceConstruct աբստրակտ դասերն իրականացնում են ընդհանրացված մեխանիզմներ՝ աջակցելու սկզբնական ֆայլերի և դրանց տարրերի հետ աշխատելուն, օրինակ՝ աշխատել տեքստային բուֆերների հետ, կապել սկզբնաղբյուր տեքստի տարրի կոորդինատներին, մոդելները համապատասխանեցնել աշխատանքային պատճենների բուֆերի ընթացիկ բովանդակությանը: և այլն։ Այս մեխանիզմների ներդրումը սովորաբար բավականին դժվար է, և Handly-ն կարող է զգալիորեն նվազեցնել բռնակի վրա հիմնված լեզվական մոդելների մշակման ջանքերը՝ ապահովելով բարձրորակ հիմնական իրականացումներ:
Ի լրումն վերը թվարկված հիմնական մեխանիզմների, Handly-ն ապահովում է ենթակառուցվածք տեքստային բուֆերների և լուսանկարների համար, աջակցություն կոդերի խմբագրիչների հետ ինտեգրման համար (ներառյալ Xtext խմբագրիչի հետ ինտեգրումը), ինչպես նաև UI որոշ ընդհանուր բաղադրիչներ, որոնք աշխատել սկզբնաղբյուրի խմբագիրների հետ: Հեշտ մոդելներ, ինչպիսիք են ուրվագծային շրջանակը: Իր հնարավորությունները ցույց տալու համար նախագիծը տալիս է մի քանի օրինակներ, ներառյալ Java մոդելի ներդրումը Handly-ում: (JDT-ում Java մոդելի ամբողջական ներդրման համեմատությամբ, այս մոդելը միտումնավոր որոշ չափով պարզեցված է ավելի մեծ պարզության համար):
Ինչպես նշվեց ավելի վաղ, Handly-ի նախնական նախագծման և հետագա զարգացման ընթացքում հիմնական ուշադրությունը եղել և շարունակում է մնալ մասշտաբայնության և ճկունության վրա:
Սկզբունքորեն, բռնակի վրա հիմնված մոդելները բավականին լավ են չափվում «ըստ դիզայնի»: Օրինակ, բռնակ/մարմնի արտահայտությունը թույլ է տալիս սահմանափակել մոդելի կողմից սպառվող հիշողության քանակը: Բայց կան նաև նրբերանգներ. Այսպիսով, Handly-ի մասշտաբայնության համար փորձարկելիս խնդիր է հայտնաբերվել ծանուցման մեխանիզմի ներդրման մեջ. երբ մեծ թվով տարրեր փոխվեցին, դելտաների կառուցումը չափազանց շատ ժամանակ պահանջեց: Պարզվեց, որ նույն խնդիրն առկա է JDT Java մոդելում, որից ժամանակին հարմարեցվել է համապատասխան կոդը։ Մենք ուղղեցինք Handly-ի սխալը և պատրաստեցինք նմանատիպ կարկատել JDT-ի համար, որը երախտագիտությամբ ստացվեց: Սա ընդամենը մեկ օրինակ է, որտեղ Handly-ի ներդրումը գոյություն ունեցող մոդելների ներդրման մեջ կարող է պոտենցիալ օգտակար լինել, քանի որ այս դեպքում նման սխալը կարող է շտկվել ընդամենը մեկ տեղում:
Handly-ի ներդրումը գոյություն ունեցող մոդելների ներդրման մեջ տեխնիկապես իրագործելի դարձնելու համար գրադարանը պետք է ունենա զգալի ճկունություն: Հիմնական խնդիրն այն է, որ պահպանվի հետընթաց համատեղելիությունը API մոդելում: Այս խնդիրը լուծվեց մ
Ճկունությունն ունի նաև այլ կողմեր: Օրինակ, Handly-ն գրեթե ոչ մի սահմանափակում չի դնում մոդելի կառուցվածքի վրա և կարող է օգտագործվել ինչպես ընդհանուր, այնպես էլ տիրույթին հատուկ լեզուների մոդելավորման համար: Աղբյուրի ֆայլի կառուցվածքը կառուցելիս Handly-ն չի նախատեսում AST ներկայացման որևէ հատուկ ձև և, սկզբունքորեն, նույնիսկ չի պահանջում ինքնին AST-ի առկայությունը, այդպիսով ապահովելով համատեղելիությունը վերլուծման գրեթե ցանկացած մեխանիզմի հետ: Վերջապես, Handly-ն աջակցում է Eclipse աշխատանքային տարածքի հետ լիարժեք ինտեգրմանը, բայց կարող է նաև ուղղակիորեն աշխատել ֆայլային համակարգերի հետ՝ շնորհիվ իր ինտեգրման:
Ընթացիկ տարբերակը
Ինչպես նշվեց վերևում, այդ արտադրանքներից մեկը 1C:Enterprise Development Tools-ն է, որտեղ Handly-ն ի սկզբանե օգտագործվում է նման 1C:Enterprise լեզուների բարձր մակարդակի կառուցվածքի տարրերը մոդելավորելու համար՝ որպես ներկառուցված ծրագրավորման լեզու և հարցումների լեզու: . Մեկ այլ ապրանք ավելի քիչ հայտնի է լայն հասարակությանը. Սա
Հուսով ենք, որ API-ի կայունության երաշխիքով 1.0 տարբերակի թողարկումից և ինկուբացիոն վիճակից դուրս գալուց հետո Handly-ն կունենա նոր ընդունողներ։ Միևնույն ժամանակ, նախագիծը շարունակում է փորձարկել և կատարելագործել API-ն՝ թողարկելով տարեկան երկու «հիմնական» թողարկում՝ հունիսին (նույն ամսաթվին, ինչ միաժամանակյա թողարկումը Eclipse) և դեկտեմբերին՝ ապահովելով կանխատեսելի ժամանակացույց, որի վրա կարող են ապավինել ընդունողները: Կարող ենք նաև ավելացնել, որ նախագծի «սխալների մակարդակը» մնում է հետևողականորեն ցածր մակարդակի վրա, և Handly-ն հուսալիորեն աշխատում է վաղ ընդունողների արտադրանքներում առաջին իսկ տարբերակներից ի վեր: Eclipse Handly-ի հետագա ուսումնասիրության համար կարող եք օգտագործել
Source: www.habr.com