DSL IDE czyli MDD w środowisku Eclipse

Postanowiłem napisać kilka słów o czymś czemu poświęciłem ostatnich kilka lat mojego życia czyli o językach DSL (Domain Specific Language - języki ukierunkowane na biznes). Ponieważ temat jest dosyć rozległy ograniczę się tylko do wprowadzenia mam jednak nadzieję że to wystarczy by kogoś nim zainteresować.

Głównym celem inżynierii oprogramowania jest przeniesienie pewnych wymagań stawianych przez biznes do postaci zrozumiałej przez maszyny. Nie jest to zadanie proste ponieważ język opisu problemów biznesowych jest zupełnie odmienny od języka używanego przez procesory, infrastrukturę sieciową etc. Zlecenia typu 'w tym momencie powinien pojawić się formularz A' lub 'podłącz Jana Kowalskiego do sieci' są zupełnie niezrozumiałe. Od wielu lat wprowadzone są więc kolejne etapy podniesienia poziomu abstrakcji języka rozumianego przez system uruchomieniowy. Powszechnym dzisiaj rozwiązaniem jest wielostopniowa kompilacja języków ogólnego zastosowania (Java, C# czy C++) a każdego dnia pojawiają się kolejne języki, warstwy kompilacji, interpretatory etc. Praktycznie każdą interakcję z systemem operacyjnym, infrastrukturą sieciową, serwerem aplikacyjnym, frameworkiem czy biblioteką użytkową możemy opisać serią reguł na bazie których możemy utworzyć kolejny język. Patrząc w ten sposób zauważamy że pisząc najprostsze pliki konfiguracyjne w rzeczywistości posługujemy się językiem zdefiniowanym przez daną bibliotekę.

Bardzo szybko zauważono możliwość dalszej abstrakcji algorytmów, potrzebny był jednak język wysokiego poziomu. W 2001 roku organizacja OMG zaproponowała podejście projektowe nazwane MDA. Zakładało ono użycie UML jako języka definicji problemu biznesowego a następnie przekształcenie tak powstałego modelu do postaci definiowanej przez platformę docelową. Użycie UML'a okazało się jednak wyjątkowo trudne w praktyce ponieważ notacja ta projektowana była w latach 90-tych z myślą o statycznej dokumentacji nie jako fragment kodu źródłowego. Narzędzia dostępne w tamtym okresie nie wyglądały wcale lepiej (profile zaimplementowano znacznie później).

Sam najlepiej przekonałem się o tym budując swój pierwszy system modelowania procesów biznesowych w którym zdecydowałem się użyć koncepcję wykonywalnego UML'a (xUML). Pomimo niewątpliwego uproszenia tworzenia/modyfikacji procesów podejście to praktycznie od razu ujawniło wszystkie swoje wady. Brak wsparcia w trakcie modelowania logiki wyższego poziomu niż dostarczana przez język UML, brak możliwości odwzorowania dodatkowych walidacji bezpośrednio w edytorze etc. Może nie wygląda to na poważne problemy jednak daje porządnie w kość już przy kilkudziesięciu złożonych procesach a przy kilkuset staje się prawdziwym piekłem.

Na szczęście w tym samym czasie (początek 2004r) IBM opublikował rewelacyjna książka 'Eclipse Development using the Graphical Editing Framework and the Eclipse Modeling Framework' prezentująca technikę budowania specjalizowanych edytorów graficznych w środowisku Eclipse. Przyznam że koncepcja ta całkowicie mnie pochłonęła i w kolejnej wersji systemu mogłem zrezygnować całkowicie z UML'a pozbywając się związanych z tym podejściem problemów. Dzięki budowie własnych narzędzi (DSL IDE) mogłem zapewnić nie tylko walidację w tle ale także wsparcie w tworzeniu wyrażeń a nawet dosyć zaawansowane opcje analityczne. Umożliwiło to wystarczające uproszczenie obsługi by pomoc programisty nie była już konieczna w trakcie składania nowych procesów.

Wspomniana książka okazała się jednak znacznie większym sukcesem niż mogłem to sobie wtedy wyobrazić. Nie tylko wyjaśniła każdemu jak poprawnie i szybko budować edytory graficzne ale także stała się podstawą do dalszej standaryzacji i rozwoju MDD w środowisku Eclipse. Na bazie jej wytycznych powstał wkrótce projekt Merlin Generator który stał się podstawą biblioteki GMF debiutującej w release Callisto (2006r). Tworzenie prostych diagramów zamiast tygodni skróciło się do kilku godzin/dni co oczywiście spowodowało dalszą popularyzację tematu MDD. W ubiegłym roku wydzielona została specjalna kategoria poświęcona zagadnieniu modelowania 'Eclipse modeling'. W jej ramach znajdują sie projekty odpowiedzialne za budowę struktury (EMF, EMFT), tworzenie notacji graficznych (GEF, GMF), notacji tekstowych TMF (xText, IMP), transformacji modeli M2M (ATL, QTV) oraz generatorów M2T (Xpand/Xtend, stary JET).

Jest tego naprawdę dużo i pomimo że poświeciłem tematowi DSL blisko pięć lat a powyższych bibliotek używam na co dzień od czterech przyznam że wciąż trudno mi to wszystko opanować. Praktycznie co kilka dni pojawiają się ciekawe prace lub projekty. O części z nich postaram się tutaj czasami wspomnieć...