In effetti! Perché non utilizzare un linguaggio potente e espressivo per un problema più complesso di quanto le persone spesso (inizialmente) pensino? Soprattutto quando le persone che affrontano il problema sono già competenti con tale linguaggio. (Costruire è il problema dei programmatori e meglio risolto dai programmatori.)
Mi sono anche posto questa domanda anni fa e ho deciso che Java è un buon linguaggio per la definizione di build, specialmente per i progetti Java. E, di conseguenza, ho iniziato a fare qualcosa al riguardo.
DISCLAIMER : in questa risposta promuovo iwant , un sistema di sviluppo che sto sviluppando. Ma dal momento che questa è una discussione opinata comunque, sono sicuro che sia ok.
Non approfondirò i vantaggi di Java (potenza ed espressività) o iwant in particolare. Se sei interessato, puoi leggere di più sulla pagina di iwant .
Invece considererò perché Java (e altri GPL) sono così prontamente liquidati come inadatti alla costruzione. Molte risposte e commenti qui sono buoni esempi di tale pensiero. Consideriamo alcuni degli argomenti tipici:
"Java è imperativo, ma le build sono definite al meglio in modo dichiarativo" , potrebbero dire.
È vero. Ma quando usi una lingua come metalinguaggio per un DSL interno , ciò che conta davvero è la sua sintassi . Anche un linguaggio imperativo come Java può essere ingannato per essere dichiarativo. Se sembra e si sente dichiarativo, è (per scopi pratici) dichiarativo. Ad esempio:
JacocoTargetsOfJavaModules.with()
.jacocoWithDeps(jacoco(), modules.asmAll.mainArtifact())
.antJars(TestedIwantDependencies.antJar(),
TestedIwantDependencies.antLauncherJar())
.modules(interestingModules).end().jacocoReport(name)
Questo è un esempio reale del progetto dimostrativo di iwant .
In realtà, confrontalo con alcuni sistemi di build dichiaratamente dichiarativi che espongono i loro utenti a verbi così imperativi come "test" o "compilazione". La dichiarazione di cui sopra contiene solo nomi, nessun verbo. La compilazione e il test sono compiti implicitamente gestiti da iwant al fine di garantire all'utente i nomi che desidera. Non è la lingua. È come lo usi.
"Java è prolisso"
Sì, un sacco di codice Java là fuori è prolisso. Ma di nuovo, non è la lingua, è come la usi. Se un'implementazione è prolissa, incapsulala dietro una bella astrazione. Molti GPL forniscono meccanismi adeguati per questo.
Immagina solo il frammento di Java sopra scritto in XML. Sostituisci le parentesi con parentesi angolari e spostale. E poi duplica la parola chiave ogni come tag di chiusura! Java come sintassi è not verbose.
(Lo so, il confronto con XML è come prendere caramelle da un bambino, ma così tante build sono state definite in XML.)
"Dovresti compilare lo script di build"
Questo è un punto valido. Tuttavia, è solo un piccolo problema tecnico da risolvere. Potrei averlo risolto usando beanshell o qualche altro interprete. Invece, l'ho risolto trattandolo come un altro problema di build e eseguendo il boot con un semplice script shell o ant che compila ed esegue un semplice bootstrapper Java.
"Java ha boilerplate"
È vero. Devi importare classi, devi menzionare "pubblico", "classe" e così via. E qui semplici DSL esterni segnano una vittoria facile iniziale.
E se il tuo progetto è così banale che questa norma è significativa, congratulazioni. Il tuo problema non è difficile e non importa come lo risolvi.
Ma molti progetti richiedono molto più della compilazione, del report di copertura e dell'imballaggio. Se lo standard di Java è accettabile per i problemi dei clienti, perché non creare problemi? Perché creare scarpe solo per i bambini degli altri?