Zastanawiam się nad stworzeniem języka specyficznego dla domeny, aby uprościć dany, niejasny model programowania. Część debaty dotyczy tego, czy zbudować go (jako skrypt) na istniejącym języku / środowisku wykonawczym (np. Java), czy też uczynić go samodzielnym (własny kompilator, & c).
Ci z was, którzy mają doświadczenie w projektowaniu DSL, czy mają zalety / wady i pewną odpowiedź na odpowiednie podejście?
language-design
scripting
dsl
runtime
Jé Queue
źródło
źródło
Odpowiedzi:
Polecam utworzenie DSL na istniejącym języku (wewnętrzny DSL). Zrobiłem to kilka razy z Pythonem, tworząc systemy, w których konsument DSL zapisuje plik Pythona, który jest używany jako plik konfiguracyjny dla systemu. Plik konfiguracyjny wykorzystuje konstrukcje (klasy, funkcje), które zdefiniowałem. Te konstrukcje tworzą DSL.
IMO, język taki jak Python (IronPython lub Jython, jeśli system hosta to .NET lub Java) lub Ruby (IronRuby, JRuby) jest lepszy do bazowania na DSL niż Java lub C #.
W moim przypadku hostami był również (C) Python, więc wybór Pythona do DSL był czymś naturalnym.
Niektóre zalety:
źródło
Spójrz na Xtext (http://www.eclipse.org/Xtext/) i Xbase (http://blog.efftinge.de/2010/09/xbase-new-programming-language.html). Jeśli użytkownicy nie są programistami, nie sądzę, że powinieneś opierać swoją DSL na istniejącym języku programowania. Będzie to dla nich zbyt skomplikowane. „Czysta” DSL może być bardzo wydajna, jeśli zostanie wykonana poprawnie.
źródło
Zamiast zalecać konkretne podejście, pozwól mi polecić Języki specyficzne dla domeny Martina Fowlera jako doskonały zasób do podjęcia decyzji. Zawiera obszerne, skłaniające do refleksji badanie względnych zalet wewnętrznych i zewnętrznych DSL.
źródło
Istnieje trzecia opcja - zbuduj DSL jako kompilator na języku ogólnego przeznaczenia. Dowolny język z jakimś rozsądnym poziomem możliwości metaprogramowania wykona zadanie, w tym nawet na tak niskim poziomie, jak C ++. Wolę Lisp i podobne języki do tego rodzaju rzeczy, ale Template Haskell lub Nemerle mogą również zapewnić ten sam poziom elastyczności.
źródło
W swojej książce „Języki specyficzne dla domeny” Martin Folwer opisuje wewnętrzne i zewnętrzne DSL.
Internal DSL
= jest podzbiorem istniejącego języka programowania, np. Ruby / Java itp.External DSL
= definiujesz składnię i słownictwo.Zewnętrzny DSL może być znacznie bardziej wyrazisty, ale może wymagać zewnętrznego parsowania i generowania kodu.
Podczas gdy wewnętrzna DSL nie wymaga dodatkowego przetwarzania, ale czasami jest trudna do zrozumienia dla nieprogramowych ekspertów w dziedzinie (np. Analityków biznesowych, testerów).
Wybierając typ DSL, należy przeanalizować, kim są jego użytkownicy. Jeśli w większości są to osoby nietechniczne, lepszym wyborem może być zewnętrzna DSL. Dla małego zespołu doświadczonych programistów można wybrać wewnętrzną DSL, jeśli używany przez nich język programowania jest wystarczająco wyrazisty.
źródło