W rzeczy samej! Dlaczego nie użyć mocnego i wyrazistego języka dla problemu, który jest bardziej złożony niż ludzie (na początku) często myślą? Zwłaszcza gdy osoby, które borykają się z tym problemem, są już kompetentne w takim języku. (Budowanie jest własnym problemem programistów i najlepiej rozwiązane przez programistów.)
Zadałem sobie to pytanie wiele lat temu i zdecydowałem, że Java jest dobrym językiem do definiowania kompilacji, szczególnie dla projektów Java. W rezultacie zacząłem coś z tym robić.
ZASTRZEŻENIE : W tej odpowiedzi promuję iwant , system kompilacji, który rozwijam. Ale skoro i tak jest to dyskusyjna dyskusja, jestem pewien, że jest w porządku.
Nie będę omawiać korzyści płynących z Javy (moc i ekspresja), ani konkretnie. Jeśli jesteś zainteresowany, możesz przeczytać więcej na stronie iwant .
Zamiast tego zastanowię się, dlaczego Java (i inne GPL) jest tak łatwo odrzucana, że nie nadaje się do budowania. Wiele odpowiedzi i komentarzy tutaj jest dobrym przykładem takiego myślenia. Rozważmy niektóre z typowych argumentów:
„Java jest niezbędna, ale kompilacje najlepiej definiować w sposób deklaratywny” , mogliby powiedzieć.
Prawdziwe. Ale kiedy używasz języka jako metalajzyka dla wewnętrznej DSL , tak naprawdę liczy się jego składnia . Nawet imperatywny język, taki jak Java, można oszukać, by zadeklarować. Jeśli wygląda i wydaje się deklaratywny, jest (dla celów praktycznych) deklaratywny. Na przykład:
JacocoTargetsOfJavaModules.with()
.jacocoWithDeps(jacoco(), modules.asmAll.mainArtifact())
.antJars(TestedIwantDependencies.antJar(),
TestedIwantDependencies.antLauncherJar())
.modules(interestingModules).end().jacocoReport(name)
To jest prawdziwy przykład z projektu demo iwant .
W rzeczywistości porównaj to z niektórymi rzekomo deklaratywnymi systemami kompilacji, które narażają swoich użytkowników na tak ważne czasowniki, jak „test” lub „kompilacja”. Powyższa deklaracja zawiera tylko rzeczowniki, bez czasowników. Kompilowanie i testowanie to zadania domyślnie obsługiwane przez iwant w celu zapewnienia użytkownikowi rzeczowników, których on chce. To nie jest język. Tak to wykorzystujesz.
„Java jest pełna”
Tak, dużo kodu Java jest tam gadatliwy. Ale znowu, to nie jest język, tylko sposób, w jaki go używasz. Jeśli implementacja jest pełna, po prostu obuduj ją za ładną abstrakcją. Wiele GPL zapewnia do tego odpowiednie mechanizmy.
Wyobraź sobie powyższy fragment kodu Java napisany w języku XML. Zastąp nawiasy nawiasami kątowymi i przesuwaj je. A następnie zduplikuj każde słowo kluczowe jako tag zamykający! Java jako składnia nie jest pełna.
(Wiem, porównywanie z XML-em jest jak zabieranie cukierków dziecku, ale tak się składa, że tak wiele kompilacji zostało zdefiniowanych w XML).
„Musisz skompilować skrypt kompilacji”
To jest ważny punkt. Niemniej jednak jest to tylko niewielki problem techniczny do rozwiązania. Mógłbym to rozwiązać za pomocą fasolki szparagowej lub innego tłumacza. Zamiast tego rozwiązałem go, traktując go jako kolejny problem z kompilacją i ładując iwant za pomocą prostego skryptu powłoki lub ant, który kompiluje i uruchamia prosty bootstrapper Java.
„Java ma płytę grzewczą”
Prawdziwe. Musisz zaimportować klasy, musisz wspomnieć o „public”, „class” i tak dalej. I tutaj proste zewnętrzne DSL zapewniają początkową łatwą wygraną.
A jeśli twój projekt jest tak trywialny, że ta płyta jest znacząca, gratulacje. Twój problem nie jest trudny i naprawdę nie ma znaczenia, jak go rozwiązać.
Ale wiele projektów wymaga znacznie więcej niż tylko kompilacji, raportu pokrycia i pakowania. Jeśli płyta główna Java jest dopuszczalna w przypadku problemów klientów, dlaczego nie budować problemów? Po co robić buty tylko dla dzieci innych osób?