{"id":32464,"date":"2019-10-31T21:47:12","date_gmt":"2019-10-31T18:47:12","guid":{"rendered":"https:\/\/prohoster.info\/blog\/eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools\/"},"modified":"2019-10-31T21:47:12","modified_gmt":"2019-10-31T18:47:12","slug":"eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools","title":{"rendered":"Eclipse jako platforma technologiczna dla 1C: Enterprise Development Tools","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>By\u0107 mo\u017ce, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/\">Eclipse<\/a><\/noindex> od dawna nie wymaga szczeg\u00f3lnej prezentacji. Wiele os\u00f3b zna Eclipse dzi\u0119ki narz\u0119dziom do tworzenia aplikacji w Javie Eclipse (<noindex><a rel=\"nofollow\" href=\"http:\/\/www.eclipse.org\/jdt\/\">JDT<\/a><\/noindex>). To w\u0142a\u015bnie ta popularna otwarta IDE Java jest kojarzona przez wi\u0119kszo\u015b\u0107 programist\u00f3w ze s\u0142owem \u201eEclipse\u201d. Jednak Eclipse to r\u00f3wnie\u017c rozszerzalna platforma do integracji narz\u0119dzi programistycznych (Eclipse Platform) oraz szereg IDE zbudowanych na jej bazie, w tym JDT. Eclipse to tak\u017ce projekt Eclipse (Eclipse Project), projekt najwy\u017cszego poziomu, kt\u00f3ry koordynuje rozw\u00f3j Eclipse Platform i JDT, oraz Eclipse SDK \u2013 wynik tych prac. Na koniec, Eclipse to Fundacja open-source z ogromn\u0105 spo\u0142eczno\u015bci\u0105 projekt\u00f3w, z kt\u00f3rych nie wszystkie s\u0105 napisane w Javie lub maj\u0105 zwi\u0105zek z narz\u0119dziami programistycznymi (np. projekty <noindex><a rel=\"nofollow\" href=\"https:\/\/iot.eclipse.org\/\">Eclipse IoT<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/science.eclipse.org\/\">Eclipse Science<\/a><\/noindex>). \u015awiat Eclipse jest bardzo r\u00f3\u017cnorodny.<\/p>\n<p>W tym artykule, maj\u0105cym charakter przegl\u0105dowy, spr\u00f3bujemy przyjrze\u0107 si\u0119 niekt\u00f3rym podstawom architektury Eclipse jako platformy do tworzenia zintegrowanych narz\u0119dzi programistycznych oraz przedstawi\u0107 wst\u0119pne informacje na temat komponent\u00f3w Eclipse, kt\u00f3re stanowi\u0105 fundament technologicznej platformy dla \u201enowego Konfiguratora\u201d 1C: Enterprise, <noindex><a rel=\"nofollow\" href=\"http:\/\/v8.1c.ru\/overview\/release_IDE\/\">1C:Enterprise Development Tools<\/a><\/noindex>. Oczywi\u015bcie, takie rozwa\u017cania b\u0119d\u0105 w du\u017cej mierze powierzchowne i do\u015b\u0107 ograniczone, r\u00f3wnie\u017c dlatego, \u017ce nie koncentrujemy si\u0119 tylko na programistach Eclipse jako publiczno\u015bci docelowej. Mamy nadziej\u0119, \u017ce nawet do\u015bwiadczeni programi\u015bci Eclipse znajd\u0105 w artykule interesuj\u0105ce dla siebie informacje. Na przyk\u0142ad, opowiemy o jednym z \u201esekret\u00f3w Eclipse\u201d, stosunkowo nowym i jeszcze ma\u0142o znanym projekcie <noindex><a rel=\"nofollow\" href=\"http:\/\/eclipse.org\/handly\/\">Eclipse Handly<\/a><\/noindex>, kt\u00f3ry zosta\u0142 za\u0142o\u017cony i wspierany przez firm\u0119 1C.<br \/>\n<img decoding=\"async\" alt=\"Eclipse jako platforma technologiczna dla 1C: Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/eb399a50bf86b6acce1df9e3d40848d4.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Wprowadzenie do architektury Eclipse<\/h2>\n<p>\nRozpocznijmy od om\u00f3wienia niekt\u00f3rych og\u00f3lnych aspekt\u00f3w architektury Eclipse na przyk\u0142adzie <noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/jdt\/overview.php\">Eclipse Java development tools<\/a><\/noindex> (JDT). Wyb\u00f3r akurat JDT jako przyk\u0142adu nie jest przypadkowy. To pierwsze zintegrowane \u015brodowisko programistyczne, kt\u00f3re pojawi\u0142o si\u0119 w Eclipse. Pozosta\u0142e projekty *DT Eclipse, takie jak Eclipse C\/C++ Development Tooling (CDT), zosta\u0142y stworzone p\u00f3\u017aniej i zaczerpn\u0119\u0142y zar\u00f3wno podstawowe zasady architektoniczne, jak i niekt\u00f3re fragmenty kodu \u017ar\u00f3d\u0142owego z JDT. Podstawy architektury, kt\u00f3re zosta\u0142y wprowadzone w JDT, s\u0105 aktualne do dzi\u015b dla praktycznie ka\u017cdej IDE zbudowanej na platformie Eclipse, w tym dla 1C:Enterprise Development Tools.<\/p>\n<p>Przede wszystkim nale\u017cy zauwa\u017cy\u0107, \u017ce Eclipse charakteryzuje si\u0119 do\u015b\u0107 wyra\u017anym podzia\u0142em architektonicznym, oddzielaj\u0105c funkcjonalno\u015b\u0107 niezale\u017cn\u0105 od j\u0119zyka od funkcjonalno\u015bci przeznaczonej do wsparcia konkretnych j\u0119zyk\u00f3w programowania oraz separuj\u0105c niezale\u017cne od UI komponenty \u201erdzeniowe\u201d (core) od komponent\u00f3w zwi\u0105zanych z wsparciem interfejsu u\u017cytkownika.<\/p>\n<p>Eclipse Platform definiuje og\u00f3ln\u0105, niezale\u017cn\u0105 od j\u0119zyka infrastruktur\u0119, a narz\u0119dzia do programowania w Javie dodaj\u0105 do Eclipse w pe\u0142ni funkcjonalne \u015brodowisko IDE dla Javy. Zar\u00f3wno Eclipse Platform, jak i JDT sk\u0142adaj\u0105 si\u0119 z kilku komponent\u00f3w, z kt\u00f3rych ka\u017cda nale\u017cy albo do niezale\u017cnego od UI \u201erdzenia\u201d, albo do warstwy UI (rys. 1).<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse jako platforma technologiczna dla 1C: Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/230825124962e721ecca7dfb7dee9a0c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Rys. 1. Eclipse Platform i JDT<\/b><\/p>\n<p>Wymie\u0144my g\u0142\u00f3wne komponenty Eclipse Platform:<\/p>\n<ul>\n<li><b>Runtime<\/b> \u2014 Okre\u015bla infrastruktur\u0119 wtyczek. Dla Eclipse charakterystyczna jest architektura modu\u0142owa. W istocie Eclipse jest kolekcj\u0105 \u201epunkt\u00f3w rozszerzenia\u201d i \u201erozszerze\u0144\u201d.<\/li>\n<li><b>Workspace<\/b> \u2014 Zarz\u0105dza jednym lub wi\u0119cej projektami. Projekt sk\u0142ada si\u0119 z folder\u00f3w i plik\u00f3w, kt\u00f3re s\u0105 wy\u015bwietlane bezpo\u015brednio w systemie plik\u00f3w.<\/li>\n<li><b>Standard Widget Toolkit (SWT)<\/b> \u2014 Zapewnia podstawowe elementy interfejsu u\u017cytkownika, zintegrowane z systemem operacyjnym.<\/li>\n<li><b>JFace<\/b> \u2014 Oferuje zestaw framework\u00f3w UI, zbudowanych na podstawie SWT.<\/li>\n<li><b>Workbench<\/b> \u2014 Okre\u015bla paradygmat UI Eclipse: edytory, widoki, perspektywy.<\/li>\n<\/ul>\n<p>\nNale\u017cy zauwa\u017cy\u0107, \u017ce Eclipse Platform oferuje r\u00f3wnie\u017c wiele innych u\u017cytecznych komponent\u00f3w do budowy zintegrowanych narz\u0119dzi programistycznych, w\u015br\u00f3d kt\u00f3rych mo\u017cna wymieni\u0107 Debug, Compare, Search oraz Team. Oddzielnie nale\u017cy wspomnie\u0107 o JFace Text \u2013 podstawie do budowy \u201einteligentnych edytor\u00f3w\u201d kodu \u017ar\u00f3d\u0142owego. Niestety, nawet pobie\u017cne om\u00f3wienie tych komponent\u00f3w, jak r\u00f3wnie\u017c komponent\u00f3w warstwy UI, nie jest mo\u017cliwe w ramach tego artyku\u0142u, dlatego w pozosta\u0142ej cz\u0119\u015bci tego rozdzia\u0142u ograniczymy si\u0119 do przegl\u0105du g\u0142\u00f3wnych komponent\u00f3w \u201erdzeniowych\u201d Eclipse Platform i JDT.<\/p>\n<h4>Core Runtime<\/h4>\n<p>\nInfrastruktura wtyczek Eclipse opiera si\u0119 na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.osgi.org\/developer\/specifications\/\">OSGi<\/a><\/noindex> i jest udost\u0119pniana przez projekt <noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/equinox\/\">Eclipse Equinox.<\/a><\/noindex>Ka\u017cda wtyczka Eclipse jest bundlem OSGi. Specyfikacja OSGi definiuje, w szczeg\u00f3lno\u015bci, mechanizmy wersjonowania i rozwi\u0105zywania zale\u017cno\u015bci. Opr\u00f3cz tych standardowych mechanizm\u00f3w, Equinox wprowadza poj\u0119cie <i>punktu rozszerzenia.<\/i>. Ka\u017cdy plugin mo\u017ce definiowa\u0107 swoje punkty rozszerze\u0144 oraz wprowadza\u0107 do systemu dodatkow\u0105 funkcjonalno\u015b\u0107 (\u201erozszerzenia\u201d), korzystaj\u0105c z punkt\u00f3w rozszerze\u0144 zdefiniowanych przez ten sam lub inne pluginy. Szczeg\u00f3\u0142owe om\u00f3wienie mechanizm\u00f3w OSGi i Equinox wykracza poza temat tego artyku\u0142u. Warto tylko zaznaczy\u0107, \u017ce modularno\u015b\u0107 w Eclipse ma totalny charakter (ka\u017cda podsystema, \u0142\u0105cznie z Runtime, sk\u0142ada si\u0119 z jednego lub kilku plugin\u00f3w), a praktycznie wszystko w Eclipse jest rozszerzeniem. Przy czym zasady te zosta\u0142y wbudowane w architektur\u0119 Eclipse na d\u0142ugo przed wprowadzeniem OSGi (w\u00f3wczas stosowano w\u0142asn\u0105 technologi\u0119, kt\u00f3ra w wielu aspektach przypomina\u0142a OSGi).<\/p>\n<h4>G\u0142\u00f3wna przestrze\u0144 robocza<\/h4>\n<p>\nPraktycznie ka\u017cda zintegrowana \u015brodowisko programistyczne zbudowane na podstawie Eclipse Platform dzia\u0142a z Eclipse workspace. To w\u0142a\u015bnie workspace zazwyczaj zawiera kod \u017ar\u00f3d\u0142owy rozwijanego w IDE aplikacji. Workspace jest bezpo\u015brednio odwzorowany na system plik\u00f3w i sk\u0142ada si\u0119 z projekt\u00f3w, kt\u00f3re zawieraj\u0105 foldery i pliki. Te projekty, foldery i pliki nazywane s\u0105 <i>zasobami<\/i> workspace. Implementacja workspace w Eclipse dzia\u0142a jak gdyby jako pami\u0119\u0107 podr\u0119czna wzgl\u0119dem systemu plik\u00f3w, co pozwala na znaczne przyspieszenie przeszukiwania drzewa zasob\u00f3w. Co wi\u0119cej, workspace oferuje szereg dodatkowych us\u0142ug, w tym <noindex><a rel=\"nofollow\" href=\"https:\/\/eclipse.org\/articles\/Article-Resource-deltas\/resource-deltas.html\">mechanizm powiadamiania o zmianach zasob\u00f3w<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/eclipse.org\/articles\/Article-Builders\/builders.html\">infrastruktur\u0119 inkrementacyjnych budowniczych<\/a><\/noindex>.<\/p>\n<p>Za wsparcie workspace i jego zasob\u00f3w odpowiada komponent Core Resources (plugin org.eclipse.core.resources). W szczeg\u00f3lno\u015bci ten komponent zapewnia programowy dost\u0119p do workspace w postaci <i>modelu zasob\u00f3w<\/i>. Aby skutecznie pracowa\u0107 z tym modelem, klientom potrzebny jest prosty spos\u00f3b na reprezentowanie odniesienia do zasobu. Przy tym obiekt, kt\u00f3ry bezpo\u015brednio przechowuje stan zasobu w modelu, powinien by\u0107 ukryty przed dost\u0119pem klienta. W przeciwnym razie, w przypadku na przyk\u0142ad usuni\u0119cia pliku, klient m\u00f3g\u0142by nadal przechowywa\u0107 obiekt, kt\u00f3ry ju\u017c nie istnieje w modelu, co rodzi\u0142oby zwi\u0105zane z tym problemy. Eclipse rozwi\u0105zuje ten problem, u\u017cywaj\u0105c tzw. <i>uchwytu<\/i> zasobu. Uchwyt dzia\u0142a jako klucz (zna jedynie \u015bcie\u017ck\u0119 do zasobu w workspace) i ca\u0142kowicie kontroluje dost\u0119p do wewn\u0119trznego obiektu modelu, kt\u00f3ry bezpo\u015brednio przechowuje informacje o stanie zasobu. Ten projekt jest wariacj\u0105 wzorca <noindex><a rel=\"nofollow\" href=\"http:\/\/wiki.c2.com\/?HandleBodyPattern\">Handle\/Body<\/a><\/noindex>.<\/p>\n<p>Rys. 2 ilustruje idiom\u0119 Handle\/Body w kontek\u015bcie modelu zasob\u00f3w. Interfejs IResource reprezentuje uchwyt zasobu i jest API, w przeciwie\u0144stwie do klasy Resource, kt\u00f3ra implementuje ten interfejs, oraz klasy ResourceInfo, reprezentuj\u0105cej body, kt\u00f3re API nie s\u0105. Nale\u017cy podkre\u015bli\u0107, \u017ce uchwyt zna tylko \u015bcie\u017ck\u0119 do zasobu wzgl\u0119dem korzenia workspace i nie zawiera odniesienia do resource info. Obiekty resource info tworz\u0105 tzw. \u201edrzewo element\u00f3w\u201d (element tree). Ta struktura danych jest w pe\u0142ni zmaterializowana w pami\u0119ci. Aby znale\u017a\u0107 instancj\u0119 resource info odpowiadaj\u0105c\u0105 pewnemu uchwytowi, drzewo element\u00f3w jest przeszukiwane zgodnie ze \u015bcie\u017ck\u0105 przechowywan\u0105 w tym uchwycie.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse jako platforma technologiczna dla 1C: Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/9d17cd95be3730ab6b5b9e6e3ed71ace.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Rys. 2. IResource i ResourceInfo<\/b><\/p>\n<p>Jak zobaczymy w dalszej cz\u0119\u015bci, podstawowy projekt modelu zasob\u00f3w (mo\u017cna go nazwa\u0107 opartym na uchwycie) jest u\u017cywany w Eclipse oraz w innych modelach. A na razie wymie\u0144my niekt\u00f3re wyr\u00f3\u017cniaj\u0105ce cechy tego projektu:<\/p>\n<ul>\n<li>Uchwyt jest obiektem-warto\u015bci\u0105 (value object). Obiekty-warto\u015bci to obiekty niemutowalne (immutable), kt\u00f3rych r\u00f3wno\u015b\u0107 nie opiera si\u0119 na to\u017csamo\u015bci. Takie obiekty mog\u0105 by\u0107 bezpiecznie u\u017cywane jako klucz w pojemnikach haszowanych. Kilka instancji uchwytu mo\u017ce odnosi\u0107 si\u0119 do tego samego zasobu. Do ich por\u00f3wnania nale\u017cy u\u017cy\u0107 metody equals(Object).<\/li>\n<li>Uchwyt definiuje zachowanie zasobu, ale nie zawiera informacji o stanie zasobu (jedynymi danymi, kt\u00f3re przechowuje, s\u0105 \u201eklucz\u201d, \u015bcie\u017cka do zasobu).<\/li>\n<li>Uchwyt mo\u017ce odnosi\u0107 si\u0119 do nieistniej\u0105cego zasobu (lub zasobu, kt\u00f3ry jeszcze nie zosta\u0142 utworzony, lub zasobu, kt\u00f3ry zosta\u0142 ju\u017c usuni\u0119ty). Istnienie zasobu mo\u017cna sprawdzi\u0107 za pomoc\u0105 metody IResource.exists().<\/li>\n<li>Niekt\u00f3re operacje mog\u0105 by\u0107 realizowane wy\u0142\u0105cznie na podstawie informacji przechowywanych w samym uchwycie (tzw. operacje handle-only). Przyk\u0142adami s\u0105 IResource.getParent(), getFullPath() itd. Zas\u00f3b nie musi istnie\u0107, aby taka operacja zako\u0144czy\u0142a si\u0119 pomy\u015blnie. Operacje, do pomy\u015blnego wykonania kt\u00f3rych wymagane jest istnienie zasobu, zg\u0142aszaj\u0105 wyj\u0105tek (CoreException), je\u015bli zas\u00f3b nie istnieje.<\/li>\n<\/ul>\n<p>\nEclipse zapewnia skuteczny mechanizm powiadamiania o zmianach zasob\u00f3w w workspace (rys. 3). Zasoby mog\u0105 by\u0107 modyfikowane zar\u00f3wno w wyniku dzia\u0142a\u0144 wykonywanych w samej Eclipse IDE, jak i w wyniku synchronizacji z systemem plik\u00f3w. W obu przypadkach subskrybenci powiadomie\u0144 otrzymuj\u0105 szczeg\u00f3\u0142owe informacje o zmianach w postaci \u201edelt zasob\u00f3w\u201d (resource delta). Delta opisuje zmiany mi\u0119dzy dwoma stanami (pod-)drzewa zasob\u00f3w workspace i sama jest drzewem, w kt\u00f3rym ka\u017cdy w\u0119ze\u0142 opisuje zmian\u0119 okre\u015blonego zasobu oraz zawiera list\u0119 delt nast\u0119pnego poziomu, opisuj\u0105cych zmiany zasob\u00f3w podrz\u0119dnych.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse jako platforma technologiczna dla 1C: Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/8af412412ee97d205137ab70c8444a50.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Rys. 3. IResourceChangeEvent i IResourceDelta<\/b><\/p>\n<p>Mechanizm powiadamiania oparty na deltach zasob\u00f3w ma nast\u0119puj\u0105ce cechy:<\/p>\n<ul>\n<li>Pojedyncza zmiana i wiele zmian s\u0105 opisywane za pomoc\u0105 tej samej struktury, poniewa\u017c delta jest budowana na zasadzie rekursywnej kompozycji. Klienci subskrybuj\u0105cy mog\u0105 przetwarza\u0107 powiadomienia o zmianach zasob\u00f3w poprzez rekursywne przechodzenie po drzewie delt.<\/li>\n<li>Delta zawiera pe\u0142ne informacje o zmianie zasobu, w tym jego przenoszenie i\/lub zmian\u0119 zwi\u0105zanych z nim \u201eznacznik\u00f3w\u201d (np. b\u0142\u0119d\u00f3w kompilacji przedstawianych w formie znacznik\u00f3w).<\/li>\n<li>Poniewa\u017c odwo\u0142ania do zasobu odbywaj\u0105 si\u0119 przez handle, delta mo\u017ce naturalnie odwo\u0142ywa\u0107 si\u0119 do usuni\u0119tego zasobu.<\/li>\n<\/ul>\n<p>\nJak wkr\u00f3tce zobaczymy, podstawowe elementy projektowania mechanizmu powiadamiania o zmianach modeli zasob\u00f3w s\u0105 aktualne r\u00f3wnie\u017c dla innych modeli opartych na handle.<\/p>\n<h4>JDT Core<\/h4>\n<p>\nModel zasob\u00f3w Eclipse workspace jest fundamentalnym modelem niezale\u017cnym od j\u0119zyka. Komponent JDT Core (wtyczka org.eclipse.jdt.core) udost\u0119pnia API do nawigacji i analizy struktury workspace z perspektywy Javy, tzw. \u201emodel Java\u201d (<i>Java model<\/i>). To API jest definiowane w terminach element\u00f3w Javy, w przeciwie\u0144stwie do le\u017c\u0105cego u podstaw API modelu zasob\u00f3w, kt\u00f3re jest definiowane w terminach folder\u00f3w i plik\u00f3w. Podstawowe interfejsy drzewa element\u00f3w Javy s\u0105 przedstawione na rys. 4.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse jako platforma technologiczna dla 1C: Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/67bfd31e93eaa66aa94b30281693a318.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Rys. 4. Elementy modelu Java<\/b><\/p>\n<p>Model Java wykorzystuje t\u0119 sam\u0105 idiom handle\/body, co model zasob\u00f3w (rys. 5). IJavaElement jest uchwytem, a JavaElementInfo odgrywa rol\u0119 body. Interfejs IJavaElement definiuje protok\u00f3\u0142 wsp\u00f3lny dla wszystkich element\u00f3w Java. Niekt\u00f3re z jego metod s\u0105 tylko handle'em: getElementName(), getParent() itp. Obiekt JavaElementInfo przechowuje stan odpowiadaj\u0105cego mu elementu: jego struktur\u0119 i atrybuty.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse jako platforma technologiczna dla 1C: Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/5b473cccfc8f258d563033ce334cb94f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Rys. 5. IJavaElement i JavaElementInfo<\/b><\/p>\n<p>Model Java ma pewne r\u00f3\u017cnice w implementacji podstawowego wzoru handle\/body w por\u00f3wnaniu z modelem zasob\u00f3w. Jak wspomniano wcze\u015bniej, w modelu zasob\u00f3w drzewo element\u00f3w, kt\u00f3rego w\u0119z\u0142ami s\u0105 obiekty informacji o zasobach, jest ca\u0142kowicie przechowywane w pami\u0119ci. Jednak w modelu Java mo\u017ce by\u0107 znacznie wi\u0119cej element\u00f3w ni\u017c w drzewie zasob\u00f3w, poniewa\u017c przedstawia on r\u00f3wnie\u017c wewn\u0119trzn\u0105 struktur\u0119 plik\u00f3w .java i .class: typy, pola i metody.<\/p>\n<p>Aby unikn\u0105\u0107 ca\u0142kowitego zmaterializowania ca\u0142ego drzewa element\u00f3w w pami\u0119ci, implementacja modelu Java u\u017cywa ograniczonego rozmiaru LRU-cache dla informacji o elementach, gdzie kluczem jest uchwyt IJavaElement. Obiekty informacji o elementach s\u0105 tworzone na \u017c\u0105danie w miar\u0119 nawigacji w drzewie element\u00f3w. Przy tym najmniej cz\u0119sto u\u017cywane elementy s\u0105 usuwane z cache, a zu\u017cycie pami\u0119ci przez model pozostaje ograniczone do zadanego rozmiaru cache. To kolejna zaleta wzoru opartego na uchwytach, kt\u00f3ry ca\u0142kowicie ukrywa takie szczeg\u00f3\u0142y implementacyjne przed kodem klienckim.<\/p>\n<p>Mechanizm powiadamiania o zmianach element\u00f3w Java jest og\u00f3lnie podobny do omawianego wcze\u015bniej mechanizmu \u015bledzenia zmian zasob\u00f3w workspace. Klient, kt\u00f3ry chce \u015bledzi\u0107 zmiany w modelu Java, subskrybuje powiadomienia, kt\u00f3re przedstawiane s\u0105 jako obiekt ElementChangedEvent, kt\u00f3ry zawiera IJavaElementDelta (rys. 6).<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse jako platforma technologiczna dla 1C: Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/0402ec362078eaf50f47756e7f24de01.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Rys. 6. ElementChangedEvent i IJavaElementDelta<\/b><\/p>\n<p>Model Java nie zawiera informacji o ciele metod ani o rozwi\u0105zywaniu nazw, dlatego do szczeg\u00f3\u0142owej analizy kodu napisanego w Java, JDT Core dostarcza dodatkowy (nie oparty na uchwycie) model: <noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/articles\/Article-JavaCodeManipulation_AST\/index.html\">abstrakcyjne drzewo sk\u0142adniowe<\/a><\/noindex> (abstrakcyjna struktura sk\u0142adniowa, AST). AST przedstawia wynik analizy sk\u0142adniowej tekstu \u017ar\u00f3d\u0142owego. W\u0119z\u0142y AST odpowiadaj\u0105 elementom struktury modu\u0142u \u017ar\u00f3d\u0142owego (deklaracjom, operatorom, wyra\u017ceniom itp.) i zawieraj\u0105 informacje o wsp\u00f3\u0142rz\u0119dnych odpowiadaj\u0105cego elementu w tek\u015bcie \u017ar\u00f3d\u0142owym, a tak\u017ce (opcjonalnie) informacje o rozwi\u0105zywaniu nazw w postaci odwo\u0142a\u0144 do tzw. <i>bindings<\/i>Bindings to obiekty, kt\u00f3re reprezentuj\u0105 nazwane byty, takie jak typy, metody i zmienne znane kompilatorowi. W przeciwie\u0144stwie do w\u0119z\u0142\u00f3w AST, tworz\u0105cych drzewo, bindings wspieraj\u0105 odniesienia krzy\u017cowe i generalnie tworz\u0105 graf. Abstrakcyjna klasa ASTNode jest og\u00f3ln\u0105 klas\u0105 bazow\u0105 dla wszystkich w\u0119z\u0142\u00f3w AST. Podklasy ASTNode odpowiadaj\u0105 pewnym konstrukcjom sk\u0142adniowym j\u0119zyka Java.<\/p>\n<p>Poniewa\u017c drzewa sk\u0142adniowe mog\u0105 zu\u017cywa\u0107 znaczn\u0105 ilo\u015b\u0107 pami\u0119ci, JDT buforuje tylko jedno AST dla aktywnego edytora. W przeciwie\u0144stwie do modelu Java, AST jest zazwyczaj traktowane jako \"po\u015bredni\", \"tymczasowy\" model, o elementach kt\u00f3rego klienci nie powinni trzyma\u0107 odniesie\u0144 poza kontekstem operacji, kt\u00f3ra doprowadzi\u0142a do stworzenia AST.<\/p>\n<p>Wymienione trzy modele (model Java, AST, bindings) wsp\u00f3lnie stanowi\u0105 podstaw\u0119 dla budowy \u201einteligentnych narz\u0119dzi programistycznych\u201d w JDT, w tym pot\u0119\u017cnego edytora Java z r\u00f3\u017cnorodnymi \u201easystentami\u201d, r\u00f3\u017cnymi czynno\u015bciami przetwarzania kodu \u017ar\u00f3d\u0142owego (w tym organizacj\u0105 listy importu nazw oraz formatowaniem zgodnie z wyznaczonym stylem), narz\u0119dziami do przeszukiwania i refaktoryzacji. Model Java odgrywa szczeg\u00f3ln\u0105 rol\u0119, poniewa\u017c jest u\u017cywany jako podstawa do wizualizacji struktury rozwijanego aplikacji (np. w Package Explorer, Outline, Search, Call Hierarchy i Type Hierarchy).<\/p>\n<h2>Komponenty Eclipse u\u017cywane w 1\u0421:Enterprise Developments Tools<\/h2>\n<p>\nNa rys. 7 przedstawiono komponenty Eclipse, kt\u00f3re stanowi\u0105 fundament technologicznej platformy dla 1C:Enterprise Development Tools.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse jako platforma technologiczna dla 1C: Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/248cceea47ee507b9ad22d6964738ee7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Rys. 7. Eclipse jako platforma dla 1\u0421:Enterprise Development Tools<\/b><\/p>\n<p><b>Platforma Eclipse<\/b> zapewnia podstawow\u0105 infrastruktur\u0119. Om\u00f3wili\u015bmy niekt\u00f3re aspekty tej infrastruktury w poprzedniej sekcji.<\/p>\n<p><b><noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/modeling\/emf\/\">Eclipse Modeling Framework<\/a><\/noindex><\/b> (<b>EMF<\/b>) zapewnia og\u00f3lne narz\u0119dzia do modelowania danych strukturalnych. EMF jest zintegrowany z platform\u0105 Eclipse, ale mo\u017cna go r\u00f3wnie\u017c u\u017cywa\u0107 oddzielnie, w standardowych aplikacjach Java. Bardzo cz\u0119sto pocz\u0105tkuj\u0105cy programi\u015bci Eclipse s\u0105 ju\u017c dobrze zaznajomieni z EMF, cho\u0107 jeszcze nie do ko\u0144ca rozumiej\u0105 subtelno\u015bci platformy Eclipse. Jednym z powod\u00f3w tak zas\u0142u\u017conej popularno\u015bci jest uniwersalny projekt, kt\u00f3ry obejmuje r\u00f3wnie\u017c zunifikowane API na poziomie meta, umo\u017cliwiaj\u0105ce og\u00f3lne operacje na dowolnym modelu EMF. Dostarczane przez EMF podstawowe implementacje dla obiekt\u00f3w modelu oraz podsystem generowania kodu modelu na podstawie meta-modelu znacznie zwi\u0119kszaj\u0105 szybko\u015b\u0107 rozwoju i zmniejszaj\u0105 liczb\u0119 b\u0142\u0119d\u00f3w. EMF zawiera r\u00f3wnie\u017c mechanizmy serializacji modeli, \u015bledzenia zmian w modelu i wiele innych. <\/p>\n<p>Jak ka\u017cdy prawdziwie uniwersalny instrument, EMF nadaje si\u0119 do rozwi\u0105zywania szerokiego zakresu zada\u0144 zwi\u0105zanych z modelowaniem, ale niekt\u00f3re klasy modeli (na przyk\u0142ad om\u00f3wione powy\u017cej modele oparte na uchwytach) mog\u0105 potrzebowa\u0107 bardziej wyspecjalizowanych narz\u0119dzi modelowania. Opowiadanie o EMF jest zaj\u0119ciem niewdzi\u0119cznym, szczeg\u00f3lnie w ograniczonych ramach jednego artyku\u0142u, poniewa\u017c jest to temat osobnej ksi\u0105\u017cki, do\u015b\u0107 obszernej. Zauwa\u017cmy tylko, \u017ce jako\u015b\u0107 systemu uog\u00f3lnie\u0144, na kt\u00f3rym opiera si\u0119 EMF, pozwoli\u0142a na powstanie ca\u0142ego zestawu projekt\u00f3w po\u015bwi\u0119conych modelowaniu, kt\u00f3re s\u0105 cz\u0119\u015bci\u0105 projektu wy\u017cszego poziomu. <noindex><a rel=\"nofollow\" href=\"https:\/\/eclipse.org\/modeling\/\">Modelowanie Eclipse<\/a><\/noindex> obok samego EMF. Jednym z takich projekt\u00f3w jest Eclipse Xtext.<\/p>\n<p><b><noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/Xtext\/\">Eclipse Xtext<\/a><\/noindex><\/b> zapewnia infrastruktur\u0119 do \u201emodelowania tekstowego\u201d. Xtext wykorzystuje <noindex><a rel=\"nofollow\" href=\"http:\/\/www.antlr.org\/\">ANTLR<\/a><\/noindex> do analizy sk\u0142adniowej oryginalnego tekstu oraz EMF do prezentacji wynikowego ASG (abstract semantic graph, kt\u00f3ry w zasadzie jest kombinacj\u0105 AST i wi\u0105za\u0144), zwanym r\u00f3wnie\u017c \u201emodelem semantycznym\u201d. Gramatyka modelowanego j\u0119zyka w Xtext jest opisana w jego w\u0142asnym j\u0119zyku. Umo\u017cliwia to nie tylko generowanie opisu gramatyki dla ANTLR, ale tak\u017ce uzyskanie mechanizmu serializacji AST (tj. Xtext zapewnia zar\u00f3wno parser, jak i unparser), kontekstowych podpowiedzi oraz szereg innych komponent\u00f3w j\u0119zykowych. Z drugiej strony, j\u0119zyk opisu gramatyki u\u017cywany w Xtext jest mniej elastyczny w por\u00f3wnaniu, powiedzmy, do j\u0119zyka opisu gramatyki w ANTLR. Dlatego czasami trzeba \u201edostosowa\u0107\u201d realizowany j\u0119zyk do Xtext, co zazwyczaj nie jest problemem, je\u015bli chodzi o j\u0119zyk rozwijany od zera, ale mo\u017ce by\u0107 nieakceptowalne dla j\u0119zyk\u00f3w o ju\u017c ustalonym sk\u0142adzie. Mimo to, Xtext jest obecnie najbardziej dojrza\u0142ym, funkcjonalnie kompletnym i uniwersalnym narz\u0119dziem w Eclipse do budowy j\u0119zyk\u00f3w programowania i ich narz\u0119dzi deweloperskich. W szczeg\u00f3lno\u015bci jest to idealne narz\u0119dzie do szybkiego prototypowania. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B5%D0%B4%D0%BC%D0%B5%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%8F%D0%B7%D1%8B%D0%BA\">j\u0119zyk\u00f3w specyficznych dla danej dziedziny<\/a><\/noindex> (domain-specific language, DSL). Opr\u00f3cz wspomnianego wy\u017cej \u201ej\u0105dra j\u0119zykowego\u201d opartego na ANTLR i EMF, Xtext zapewnia wiele u\u017cytecznych komponent\u00f3w wy\u017cszego poziomu, w tym mechanizmy indeksowania, inkrementalnego budowania, \u201einteligentny edytor\u201d i wiele, wiele wi\u0119cej, ale pomija modeli j\u0119zykowych opartych na uchwytach. Podobnie jak EMF, Xtext jest tematem zas\u0142uguj\u0105cym na osobn\u0105 ksi\u0105\u017ck\u0119, i trudno nam b\u0119dzie nawet pobie\u017cnie opowiedzie\u0107 teraz o wszystkich jego mo\u017cliwo\u015bciach.<\/p>\n<p>1\u0421:Enterprise Development Tools aktywnie wykorzystuje zar\u00f3wno EMF jako taki, jak i szereg innych projekt\u00f3w Eclipse Modeling. W szczeg\u00f3lno\u015bci, Xtext jest jedn\u0105 z podstaw narz\u0119dzi deweloperskich dla takich j\u0119zyk\u00f3w jak 1\u0421:\u041f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u0435, w tym wbudowany j\u0119zyk programowania i j\u0119zyk zapyta\u0144. Inn\u0105 podstaw\u0105 tych narz\u0119dzi deweloperskich jest projekt Eclipse Handly, o kt\u00f3rym szczeg\u00f3\u0142owo opowiemy p\u00f3\u017aniej (spo\u015br\u00f3d wymienionych komponent\u00f3w Eclipse jest on na razie najmniej znany).<\/p>\n<p><b><noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/handly\/\">Eclipse Handly<\/a><\/noindex><\/b>, projekt podrz\u0119dny projektu g\u0142\u00f3wnego Eclipse Technology powsta\u0142 w wyniku inicjalnej kontrybucji kodu do Eclipse Foundation, przeprowadzonej przez firm\u0119 1C w 2014 roku. Od tego czasu firma 1C nadal wspiera rozw\u00f3j projektu: committerzy Handly s\u0105 pracownikami firmy. Projekt jest niewielki, ale zajmuje do\u015b\u0107 unikaln\u0105 nisz\u0119 w Eclipse: jego g\u0142\u00f3wnym celem jest wsparcie rozwoju modeli opartych na uchwytach.<\/p>\n<p>Podstawowe zasady architektoniczne modeli opartych na uchwytach, takie jak idiom uchwyt\/cia\u0142o, by\u0142y omawiane powy\u017cej na przyk\u0142adzie modelu zasob\u00f3w i modelu Java. Zauwa\u017cono tam r\u00f3wnie\u017c, \u017ce zar\u00f3wno model zasob\u00f3w, jak i model Java stanowi\u0105 wa\u017cn\u0105 podstaw\u0119 dla narz\u0119dzi do rozwoju oprogramowania Java (JDT) w Eclipse. A poniewa\u017c praktycznie wszystkie projekty *DT Eclipse maj\u0105 architektur\u0119 podobn\u0105 do JDT, nie b\u0119dzie du\u017cym przesadzeniem powiedzie\u0107, \u017ce modele oparte na uchwytach le\u017c\u0105 u podstaw wielu, je\u015bli nie wszystkich IDE zbudowanych na platformie Eclipse. Na przyk\u0142ad w Eclipse C\/C++ Development Tooling (CDT) istnieje model oparty na uchwytach C\/C++, kt\u00f3ry odgrywa w architekturze CDT t\u0119 sam\u0105 rol\u0119, co model Java w JDT.<\/p>\n<p>Przed pojawieniem si\u0119 Handly, Eclipse nie oferowa\u0142 specjalistycznych bibliotek do budowy j\u0119zykowych modeli opartych na uchwytach. Istniej\u0105ce obecnie modele by\u0142y tworzone g\u0142\u00f3wnie poprzez bezpo\u015bredni\u0105 adaptacj\u0119 kodu modelu Java (zwane r\u00f3wnie\u017c kopiowaniem\/wklejaniem), <i>w przypadkach, gdy by\u0142o to mo\u017cliwe<\/i> Eclipse Public License (EPL). (Jasne jest, \u017ce na przyk\u0142ad w przypadku projekt\u00f3w samego Eclipse zwykle nie stanowi to problemu z punktu widzenia prawnego, co nie mo\u017cna powiedzie\u0107 o produktach z zamkni\u0119tym kodem \u017ar\u00f3d\u0142owym.) Opr\u00f3cz charakterystycznej dla niej bezsystemowo\u015bci, taka metodologia prowadzi do dobrze znanych problem\u00f3w: duplikacji kodu, wprowadzonych podczas adaptacji b\u0142\u0119d\u00f3w itp. Co gorsza, powsta\u0142e modele pozostaj\u0105 \"rzecz\u0105 sam\u0105 w sobie\" i nie wykorzystuj\u0105 istniej\u0105cego potencja\u0142u do unifikacji. A przecie\u017c wydzielenie wsp\u00f3lnych poj\u0119\u0107 i protoko\u0142\u00f3w dla j\u0119zykowych modeli opartych na uchwytach mog\u0142oby doprowadzi\u0107 do stworzenia komponent\u00f3w wielokrotnego u\u017cytku do pracy z nimi, podobnie jak mia\u0142o to miejsce w przypadku EMF.<\/p>\n<p>Nie mo\u017cna powiedzie\u0107, \u017ce w Eclipse nie rozumiano tych problem\u00f3w. Ju\u017c w 2005 roku <noindex><a rel=\"nofollow\" href=\"https:\/\/www.xing.com\/profile\/Martin_Aeschlimann\">Martin Aeschlimann<\/a><\/noindex>, podsumowuj\u0105c do\u015bwiadczenie z tworzenia prototypu CDT, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.eclipse.org\/org\/langsymp\/position_paper_martin_aeschlimann.html\">argumentowa\u0142<\/a><\/noindex> konieczno\u015b\u0107 stworzenia wsp\u00f3lnej infrastruktury dla modeli j\u0119zykowych, w tym modeli opartych na handle. Jednak, jak to cz\u0119sto bywa, z powodu bardziej priorytetowych zada\u0144 realizacja tych pomys\u0142\u00f3w nie dosz\u0142a do skutku. Tymczasem, faktoryzacja kodu *DT-projekt\u00f3w wci\u0105\u017c pozostaje jednym z niewystarczaj\u0105co opracowanych temat\u00f3w w Eclipse.<\/p>\n<p>W pewnym sensie, projekt Handly ma na celu rozwi\u0105zanie podobnych problem\u00f3w do EMF, ale dla modeli opartych na handle, a przede wszystkim j\u0119zykowych (tj. przedstawiaj\u0105cych elementy struktury jakiego\u015b j\u0119zyka programowania). Poni\u017cej przedstawiono g\u0142\u00f3wne cele, kt\u00f3re przy\u015bwieca\u0142y projektowi Handly:<\/p>\n<ul>\n<li>Wydzielenie g\u0142\u00f3wnych abstrakcji obszaru merytorycznego.<\/li>\n<li>Zredukowanie wysi\u0142ku i podniesienie jako\u015bci realizacji j\u0119zykowych modeli opartych na handle dzi\u0119ki wielokrotnemu wykorzystaniu kodu.<\/li>\n<li>Dostarczenie ujednoliconego API na poziomie meta do powsta\u0142ych modeli, co umo\u017cliwia tworzenie wsp\u00f3lnych komponent\u00f3w IDE dzia\u0142aj\u0105cych z j\u0119zykowymi modelami opartymi na handle.<\/li>\n<li>Elastyczno\u015b\u0107 i skalowalno\u015b\u0107.<\/li>\n<li>Integracja z Xtext (w oddzielnej warstwie).<\/li>\n<\/ul>\n<p>\nAby wydzieli\u0107 wsp\u00f3lne poj\u0119cia i protoko\u0142y, przeanalizowano istniej\u0105ce realizacje j\u0119zykowych modeli opartych na handle. G\u0142\u00f3wne interfejsy i podstawowe realizacje dostarczane przez Handly s\u0105 pokazane na rys. 8.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse jako platforma technologiczna dla 1C: Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/47f4bf74093245334b8d67b149734dfc.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Rys. 8. Wsp\u00f3lne interfejsy i podstawowe realizacje element\u00f3w Handly<\/b><\/p>\n<p>Interfejs IElement reprezentuje handle elementu i jest wsp\u00f3lny dla element\u00f3w wszystkich modeli opartych na Handly. Abstrakcyjna klasa Element implementuje zgeneralizowany mechanizm handle\/body (rys. 9).<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse jako platforma technologiczna dla 1C: Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/0651c1f284b7edfa36313d4b51d72f08.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Rys. 9. IElement i zgeneralizowana realizacja handle\/body<\/b><\/p>\n<p>Ponadto, Handly dostarcza zgeneralizowany mechanizm powiadamiania o zmianach element\u00f3w modelu (rys. 10). Jak wida\u0107, og\u00f3lnie rzecz bior\u0105c, jest on analogiczny do mechanizm\u00f3w powiadamiania realizowanych w modelu zasob\u00f3w i modelu Java, i wykorzystuje IElementDelta do ujednoliconego przedstawienia informacji o zmianie elementu.<\/p>\n<p><img decoding=\"async\" alt=\"Eclipse jako platforma technologiczna dla 1C: Enterprise Development Tools\" src=\"\/wp-content\/uploads\/2019\/04\/cbdec8cf874308e0fa9dd96d04f62703.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<b>Rys. 10. Wsp\u00f3lne interfejsy i podstawowe realizacje mechanizmu powiadamiania Handly<\/b><\/p>\n<p>Rozwa\u017cana powy\u017cej cz\u0119\u015b\u0107 Handly (rys. 9 i 10) mo\u017ce by\u0107 u\u017cywana do reprezentacji praktycznie dowolnych modeli opartych na handle. Aby stworzy\u0107 <i>modele j\u0119zykowe<\/i> projekt oferuje dodatkow\u0105 funkcjonalno\u015b\u0107 \u2013 w szczeg\u00f3lno\u015bci wsp\u00f3lne interfejsy i podstawowe realizacje dla element\u00f3w struktury \u017ar\u00f3d\u0142owego tekstu, tzw. <i>source elements<\/i> (rys. 8). Interfejs ISourceFile reprezentuje plik \u017ar\u00f3d\u0142owy, a ISourceConstruct \u2013 element w obr\u0119bie pliku \u017ar\u00f3d\u0142owego. Abstrakcyjne klasy SourceFile i SourceConstruct realizuj\u0105 og\u00f3lne mechanizmy wspieraj\u0105ce prac\u0119 z plikami \u017ar\u00f3d\u0142owymi i ich elementami, takie jak obs\u0142uga bufor\u00f3w tekstowych, powi\u0105zanie z koordynatami elementu w \u017ar\u00f3d\u0142owym tek\u015bcie, uzgadnianie modelu z bie\u017c\u0105c\u0105 zawarto\u015bci\u0105 kopii roboczej, itp. Realizacja tych mechanizm\u00f3w zazwyczaj stanowi do\u015b\u0107 z\u0142o\u017cone zadanie, a Handly mo\u017ce znacznie skr\u00f3ci\u0107 wysi\u0142ki zwi\u0105zane z tworzeniem modeli opartych na uchwytach dzi\u0119ki dostarczeniu solidnych podstawowych implementacji.<\/p>\n<p>Opr\u00f3cz wymienionych powy\u017cej podstawowych mechanizm\u00f3w, Handly zapewnia infrastruktur\u0119 bufor\u00f3w tekstowych oraz \u201ezrzut\u00f3w\u201d (snapshots), wsparcie dla integracji z edytorami kodu \u017ar\u00f3d\u0142owego (w tym zrealizowan\u0105 \u201eod r\u0119ki\u201d integracj\u0119 z edytorem Xtext), a tak\u017ce kilka og\u00f3lnych komponent\u00f3w UI, kt\u00f3re wsp\u00f3\u0142pracuj\u0105 z modelami opartymi na Handly, takich jak framework outline. Aby zilustrowa\u0107 swoje mo\u017cliwo\u015bci, projekt dostarcza kilka przyk\u0142ad\u00f3w, w tym implementacj\u0119 modelu Java na Handly. (W por\u00f3wnaniu do pe\u0142nej realizacji modelu Java w JDT, ten model jest celowo uproszczony dla wi\u0119kszej przejrzysto\u015bci.)<\/p>\n<p>Jak wspomniano wcze\u015bniej, przy pocz\u0105tkowym projektowaniu Handly oraz jego dalszym rozwoju zwr\u00f3cono powa\u017cn\u0105 uwag\u0119 na skalowalno\u015b\u0107 i elastyczno\u015b\u0107. <\/p>\n<p>Zasadniczo modele oparte na uchwytach s\u0105 do\u015b\u0107 dobrze skalowalne \u201ez definicji\u201d. Na przyk\u0142ad idiom handle\/body pozwala ograniczy\u0107 ilo\u015b\u0107 pami\u0119ci u\u017cywanej przez model. Ale s\u0105 te\u017c niuanse. Podczas test\u00f3w Handly pod k\u0105tem skalowalno\u015bci odkryto problem w realizacji mechanizmu powiadamiania \u2013 przy zmianie du\u017cej liczby element\u00f3w budowanie delta zajmowa\u0142o zbyt du\u017co czasu. Okaza\u0142o si\u0119, \u017ce ten sam problem wyst\u0119puje tak\u017ce w modelu Java w JDT, z kt\u00f3rego w\u00f3wczas zaadaptowano odpowiedni kod. Poprawili\u015bmy b\u0142\u0105d w Handly i przygotowali\u015bmy podobn\u0105 \u0142atk\u0119 dla JDT, kt\u00f3ra zosta\u0142a z wdzi\u0119czno\u015bci\u0105 przyj\u0119ta. To tylko jeden z przyk\u0142ad\u00f3w, kiedy wdro\u017cenie Handly w istniej\u0105ce modele mog\u0142oby by\u0107 potencjalnie u\u017cyteczne, poniewa\u017c w takim przypadku taki b\u0142\u0105d mo\u017cna by\u0142oby naprawi\u0107 tylko w jednym miejscu.<\/p>\n<p>Aby wdro\u017cenie Handly w istniej\u0105cych implementacjach modeli by\u0142o technicznie mo\u017cliwe, biblioteka musi charakteryzowa\u0107 si\u0119 znaczn\u0105 elastyczno\u015bci\u0105. G\u0142\u00f3wnym wyzwaniem jest zachowanie zgodno\u015bci z API modelu. To zadanie zosta\u0142o rozwi\u0105zane w <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.eclipse.org\/Handly\/NewIn05\">Handly 0.5<\/a><\/noindex> poprzez wyra\u017ane oddzielenie specyficznego dla modelu API, definiowanego i w pe\u0142ni kontrolowanego przez dewelopera, od zunifikowanego API meta-poziomu, dostarczanego przez bibliotek\u0119. To nie tylko czyni technicznie mo\u017cliwym wdro\u017cenie Handly w istniej\u0105ce implementacje, ale tak\u017ce daje deweloperowi nowego modelu znaczn\u0105 swobod\u0119 w projektowaniu API.<\/p>\n<p>Elastyczno\u015b\u0107 ma r\u00f3wnie\u017c inne aspekty. Na przyk\u0142ad, Handly niemal w og\u00f3le nie narzuca ogranicze\u0144 na struktur\u0119 modelu i mo\u017ce by\u0107 u\u017cywana zar\u00f3wno do modelowania j\u0119zyk\u00f3w og\u00f3lnego przeznaczenia, jak i j\u0119zyk\u00f3w zorientowanych na konkretne przedmioty. Przechodz\u0105c do struktury pliku \u017ar\u00f3d\u0142owego, Handly nie narzuca \u017cadnej konkretnej formy reprezentacji AST i w zasadzie nie wymaga nawet obecno\u015bci AST, zapewniaj\u0105c tym samym kompatybilno\u015b\u0107 z praktycznie wszelkimi mechanizmami analizy sk\u0142adniowej. Wreszcie, Handly wspiera pe\u0142n\u0105 integracj\u0119 z \u015brodowiskiem Eclipse, ale mo\u017ce tak\u017ce dzia\u0142a\u0107 bezpo\u015brednio z systemami plik\u00f3w, dzi\u0119ki integracji z <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.eclipse.org\/EFS\">Eclipse File System<\/a><\/noindex> (EFS).<\/p>\n<p>Obecna wersja <noindex><a rel=\"nofollow\" href=\"https:\/\/projects.eclipse.org\/projects\/technology.handly\/releases\/0.6\">Handly 0.6<\/a><\/noindex> zosta\u0142a wydana w grudniu 2016 roku. Mimo \u017ce projekt jest obecnie w fazie inkubacji i API nie zosta\u0142o jeszcze ostatecznie ustalone, Handly jest ju\u017c u\u017cywane w dw\u00f3ch du\u017cych komercyjnych produktach, kt\u00f3re odwa\u017cy\u0142y si\u0119 wyst\u0105pi\u0107 w roli \u201ewczesnych adopters\u00f3w\u201d, i, trzeba przyzna\u0107, jak dot\u0105d nie \u017ca\u0142uj\u0105 tej decyzji.<\/p>\n<p>Jak wspomniano wcze\u015bniej, jednym z tych produkt\u00f3w s\u0105 1C:Enterprise Development Tools, gdzie Handly od samego pocz\u0105tku jest u\u017cywane do modelowania element\u00f3w wysokopoziomowej struktury j\u0119zyk\u00f3w 1C:Przedsi\u0119biorstwo, takich jak wbudowany j\u0119zyk programowania oraz j\u0119zyk zapyta\u0144. Drugi produkt jest mniej znany szerszej publiczno\u015bci. To <noindex><a rel=\"nofollow\" href=\"https:\/\/www.codasip.com\/custom-processor\/\">Codasip Studio<\/a><\/noindex>, zintegrowane \u015brodowisko projektowania procesor\u00f3w specyficznych dla aplikacji (application-specific instruction-set processor, ASIP), u\u017cywane zar\u00f3wno przez czesk\u0105 firm\u0119 Codasip, jak i jej klient\u00f3w, w\u015br\u00f3d kt\u00f3rych znajduj\u0105 si\u0119 <noindex>AMD<\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.avg.com\/\">\u015aREDNIA<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.mobileye.com\/\">Mobileye<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.sigmadesigns.com\/\">Sigma Designs<\/a><\/noindex>. Codasip u\u017cywa Handly w produkcji od 2015 roku, zaczynaj\u0105c od wersji Handly 0.2. Najnowsze wydanie Codasip Studio obecnie wykorzystuje wersj\u0119 0.5, wydan\u0105 w czerwcu 2016 roku. Ond\u0159ej Il\u010d\u00edk, odpowiadaj\u0105cy za rozw\u00f3j IDE w Codasip, jest w kontakcie z projektem, zapewniaj\u0105c niezwykle cenne informacje zwrotne ze strony \u201ezewn\u0119trznego adobtera\u201d. Uda\u0142o mu si\u0119 nawet znale\u017a\u0107 troch\u0119 wolnego czasu, aby bezpo\u015brednio uczestniczy\u0107 w rozwoju projektu, implementuj\u0105c warstw\u0119 UI (~ 4000 linii kodu) dla jednego z przyk\u0142ad\u00f3w Handly, modelu Java. Bardziej szczeg\u00f3\u0142owe informacje \u201ez pierwszej r\u0119ki\u201d o u\u017cywaniu Handly przez adobter\u00f3w mo\u017cna znale\u017a\u0107 na stronie <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.eclipse.org\/Handly\/Adopters\">Historie Sukcesu<\/a><\/noindex> projektu.<\/p>\n<p>Mamy nadziej\u0119, \u017ce po wydaniu wersji 1.0 z gwarancj\u0105 stabilno\u015bci API i zako\u0144czeniu inkubacji projektu, Handly zyska nowych adobter\u00f3w. Na razie projekt kontynuuje testy i dalsze doskonalenie API, wydaj\u0105c po dwa \u201edu\u017ce\u201d wydania ka\u017cdego roku \u2013 w czerwcu (w tym samym terminie, co jednoczesne wydanie Eclipse) i w grudniu, zapewniaj\u0105c przewidywalny harmonogram, na kt\u00f3ry mog\u0105 liczy\u0107 adobterzy. Warto doda\u0107, \u017ce wska\u017anik \u201ebug rate\u201d projektu pozostaje na stabilnie niskim poziomie, a Handly od pierwszych wersji niezawodnie dzia\u0142a w produktach wczesnych adobter\u00f3w. Do dalszego zapoznania si\u0119 z Eclipse Handly mo\u017cna wykorzysta\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pisv\/gethandly\/wiki\">Poradnik Wprowadzaj\u0105cy<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"http:\/\/www.eclipse.org\/downloads\/download.php?file=\/handly\/docs\/handly-overview.pdf&amp;r=1\">Przegl\u0105d Architektury<\/a><\/noindex>.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/1c\/blog\/323508\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, Eclipse \u0434\u0430\u0432\u043d\u043e \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043e\u0431\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438. \u041c\u043d\u043e\u0433\u0438\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 Eclipse \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f Eclipse Java development tools (JDT). \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f open-source Java IDE \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e \u0441\u043b\u043e\u0432\u043e\u043c \u201cEclipse\u201d. \u041e\u0434\u043d\u0430\u043a\u043e Eclipse \u2013 \u044d\u0442\u043e \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (Eclipse Platform), \u0438 \u0446\u0435\u043b\u044b\u0439 \u0440\u044f\u0434 IDE, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u043d\u0430 \u0435\u0435 \u043e\u0441\u043d\u043e\u0432\u0435, \u0432 \u0442\u043e\u043c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":24268,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-32464","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, Eclipse \u0434\u0430\u0432\u043d\u043e \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043e\u0431\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Eclipse \u043a\u0430\u043a \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f 1C:Enterprise Development Tools | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, Eclipse \u0434\u0430\u0432\u043d\u043e \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043e\u0431\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:47:12+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:47:12+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Eclipse jako platforma technologiczna dla 1C:Enterprise Development Tools | ProHoster","description":"Pewnie, Eclipse od dawna nie wymaga szczeg\u00f3lnego wprowadzenia.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Eclipse \u043a\u0430\u043a \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f 1C:Enterprise Development Tools | ProHoster","og:description":"\u041d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, Eclipse \u0434\u0430\u0432\u043d\u043e \u0443\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0441\u043e\u0431\u043e\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438.","og:url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/eclipse-kak-tehnologicheskaya-platforma-dlya-1c-enterprise-development-tools","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:47:12+00:00","article:modified_time":"2019-10-31T18:47:12+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"32464","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 11:00:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:58:24","updated":"2026-01-21 11:00:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/32464","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=32464"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/32464\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/24268"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=32464"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=32464"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=32464"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}