Witaj po latach, świecie! Dokładniej, po prawie sześciu latach – bo tyle czasu minęło od zakończenia pierwszej edycji konkursu “Daj Się Poznać” i przejścia tego bloga w stan hibernacji. Wiele się przez ten czas zmieniło, zarówno w świecie .NET-owym, jak i moim prywatnym. Ale o tym innym razem – dziś będzie mowa o “Daj Się Poznać” właśnie.
Daj Się Poznać 2016
Blog powraca do życia na potrzeby kolejnej edycji konkursu: Daj Się Poznać 2016. Tak jak poprzednio, organizatorem jest Maciej Aniserowicz. Tak jak poprzednio, fakt, że to mój brat, nie ma żadnego znaczenia w kontekście konkursu.
Projekt konkursowy
Oprócz prowadzenia bloga, konkurs wymaga rozwijania projektu programistycznego. Zgłoszony przeze mnie projekt to DSLExecutor – narzędzie, które będzie potrafiło wykonać instrukcje zapisane w językach DSL.
Założenia
- DSLExecutor przeznaczony będzie bardziej do języków imperatywnych (jak JavaScript, C#), niż deklaratywnych (jak HTML).
- DSLExecutor nie będzie samodzielnym programem, a dllką (dostępną przez NuGet).
- Składnia wykonywanego języka nie będzie z góry znana. Oznacza to, że użytkownik będzie musiał dostarczyć jej parser. Zatem:
- Stworzenie takiego parsera i przekazanie go narzędziu powinno być jak najłatwiejsze.
- W ramach projektu przewiduję stworzenie przynajmniej dwóch takich parserów: jak najprostszego, i trochę bardziej zaawansowanego.
- Parser będzie musiał parsować język do z góry narzuconej struktury, zrozumiałej dla narzędzia. Struktura taka będzie zawierać opis operacji (i ich argumentów), które będą wykonane przez DSLExecutor.
- Zestaw dostępnych operacji – nazwijmy go “biblioteką standardową” – również będzie dostarczony z zewnątrz.
- Dzięki temu DSLExecutor będzie mógł być użyty do przeróżnych celów.
- Jako że to użytkownik będzie decydował co ostatecznie będzie mógł “zrobić” jego DSL, narzędzie samo z siebie nie będzie miało wpływu na bezpieczeństwo jego produktu.
- W ramach projektu przewiduję stworzenie przynajmniej jednej przykładowej biblioteki standardowej.
- DSLExecutor, na podstawie sparsowanego kodu DSL i biblioteki standardowej, wykona zadane operacje i zwróci ich wynik.
W skrócie, w ciągu najbliższych trzech miesięcy zamierzam stworzyć własny język (lub kilka) programowania wraz z parserem, środowiskiem uruchomieniowym i biblioteką standardową. Brzmi groźnie. Aby jednak złagodzić tę grozę, oto założenia ułatwiające zadanie:
- Całe rozwiązanie będzie możlwie proste (ale w pełni funkcjonalne).
- Prawdopodobnie nie stworzę wszystkiego od zera, a będę się posiłkował istniejącymi narzędziami (np. parserami).
- Wydajność parsowania i wykonania kodu nie będzie priorytetem.
Przykład działania
Poniższy przykład powinien dobrze zobrazować, co chcę osiągnąć:
- Chcesz stworzyć aplikację konsolową, która będzie pobierać od użytkownika zapis operacji matematycznej, wykonywać tę operację i wyświetlać jej wynik.
- Chcesz wykorzystać DSLExecutor.
- Użytkownik będzie podawał operacje w odwrotnej notacji polskiej.
- Implementujesz:
- Szkielet aplikacji (pobieranie danych od użytkownika itp.).
- Parser odwrotnej notacji polskiej (możliwe, że DSLExecutor będzie ją wspierał out of the box).
- Funkcje biblioteki standardowej, np. operacje dodawania i odejmowania.
- Działanie aplikacji jest następujące:
- Użytkownik podaje zapis operacji matematycznej, np:
1 2 + 3 -
- Zapis przekazywany jest do parsera i DSLExecutora.
- DSLExecutor wykonuje odpowiednie funkcje biblioteki standardowej, tj. dodawanie i odejmowanie (wynik dodawania staje się pierwszym argumentem odejmowania), i zwraca ich ostateczny wynik.
- Użytkownik podaje zapis operacji matematycznej, np:
Jak widać, DSLExecutor będzie miał zastosowanie wszędzie tam, gdzie do systemu będą trafiać operacje zapisane w formie tekstowej.
Narzędzia / technologie / frameworki
Niezobowiązujący spis rzeczy, których zamierzam używać podczas prac nad projektem:
- .NET 4.6, C# 6, Visual Studio 2015,
- Git, GitHub,
- NuGet,
- XUnit.
I tyle. Nie o mnogość używanych narzędzi tu chodzi.
Dlaczego DSLExecutor?
Dlaczego wybrałem akurat taki projekt, a nie aplikację webową napakowaną frameworkami JavaScriptowymi? Z kilku powodów:
- W poprzedniej edycji konkursu skupiłem się właśnie na poznaniu narzędzi używanych w aplikacjach webowych. Wtedy był to strzał w dziesiątkę (pozyskana wiedza bardzo przydała mi się w pierwszej pracy), ale tym razem chciałbym postawić sobie wyzwanie innego rodzaju – zamiast poznawać istniejące narzędzia, stworzyć własne (koniec końców, znajomość narzędzi nie jest głównym czynnikiem świadczącym o jakości programisty).
- Poprzednio wystartowałem z dość dużym (jak na moje ówczesne możliwości) projektem, który potencjalnie mógłby być rozwijany latami. Tym razem wolę skupić się na mniejszym, ale ciekawszym zadaniu.
- W jednym z projektów tworzonych w pracy miałem już okazję implementować przetwarzanie i wykonywanie operacji zapisanych tekstem. Wygląda na to, że w obecnym projekcie też wystąpi taka potrzeba – to dobra okazja do podjęcia próby stworzenia generycznego narzędzia, którego będzie się dało użyć w niejednej aplikacji.
- Od dłuższego czasu mam chęć po prostu usiąść i pokodować w C#, bez polegania na API zewnętrznych narzędzi.
Dlaczego “Daj Się Poznać”?
Dlaczego nie zacznę tworzyć DSLExecutora tak jak innych projektów, po cichu, bez podzielenia się ze światem rozwiązaniami napotkanych problemów? Odpowiedź jest prosta: gdybym zaczął go tworzyć w ten sposób, to nigdy bym go nie skończył (wiesz o czym mówię, Czytelniku, przecież też masz niejeden niedokończony projekt ). A przydałoby się w końcu mieć w portfolio kompletne, funkcjonalne narzędzie, i – co tu kryć – móc się nim pochwalić.
Oprócz tego, do wzięcia udziału w konkursie skłonił mnie cel niezwiązany bezpośrednio z samym projektem: chcę wreszcie wyjść z cienia, dołączyć do społeczności i tak dalej – a to przecież główne hasło “Daj Się Poznać”. Przez ostatnie lata nazbierało się trochę wiedzy, doświadczenia i opinii, czas się nimi podzielić. I nauczyć się robić to w interesujący sposób (obawiam się, że długa droga przede mną…).
Stay tuned!
Tyle tytułem wstępu. Nadchodzące posty będą bardziej techniczne – dotyczyć będą kolejnych etapów powstawania DSLExecutora.
Zapraszam do śledzenia bloga i życzę powodzenia innym chcącym Dać Się Poznać!
Na koniec zbiór linków:
Do boju, Panie Michale x)
O szok.