Infatti! Perché non usare un linguaggio potente ed espressivo per un problema più complesso di quanto la gente (inizialmente) pensi? Soprattutto quando le persone che affrontano il problema sono già competenti con un linguaggio del genere. (La costruzione è il problema dei programmatori e risolto al meglio dai programmatori.)
Mi sono anche posto questa domanda anni fa e ho deciso che Java è un buon linguaggio per definire build, specialmente per progetti Java. E, di conseguenza, ho iniziato a fare qualcosa al riguardo.
DISCLAIMER : In questa risposta sto promuovendo iwant , un sistema di build che sto sviluppando. Ma dal momento che questa è una discussione supponente, sono sicuro che va bene.
Non approfondirò i vantaggi di Java (potenza ed espressività) o iwant in particolare. Se sei interessato, puoi leggere di più sulla pagina iwant .
Invece prenderò in considerazione il motivo per cui 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 è un imperativo, ma le build sono meglio definite in modo dichiarativo" , potrebbero dire.
Vero. Ma quando si utilizza 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 dichiarativo, è (ai fini pratici) dichiarativo. Per esempio:
JacocoTargetsOfJavaModules.with()
.jacocoWithDeps(jacoco(), modules.asmAll.mainArtifact())
.antJars(TestedIwantDependencies.antJar(),
TestedIwantDependencies.antLauncherJar())
.modules(interestingModules).end().jacocoReport(name)
Questo è un vero esempio del progetto demo di iwant .
In effetti, confrontalo con alcuni sistemi di compilazione apparentemente dichiarativi che espongono i loro utenti a verbi imperativi come "test" o "compilazione". La dichiarazione sopra contiene solo sostantivi, nessun verbo. Compilazione e 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 è dettagliato. Ma ancora una volta, non è la lingua, è come la usi. Se un'implementazione è dettagliata, basta incapsularla dietro una bella astrazione. Molti GPL forniscono meccanismi adeguati per questo.
Immagina solo il frammento Java sopra scritto in XML. Sostituire le parentesi con parentesi angolari e spostarle. E quindi duplica ogni parola chiave come tag di chiusura! Java come sintassi non è dettagliata.
(Lo so, il confronto con XML è come prendere caramelle da un bambino, ma così tante build sono definite in XML.)
"Dovresti compilare il tuo script di compilazione"
Questo è un punto valido Tuttavia, è solo un piccolo problema tecnico da risolvere. Avrei potuto risolverlo usando beanshell o qualche altro interprete. Invece, l'ho risolto trattandolo come un altro problema di build e eseguendo il bootstrap di Iwant con una semplice shell o script di formica che compila ed esegue un semplice bootstrapper Java.
"Java ha boilerplate"
Vero. Devi importare le classi, devi menzionare "pubblico", "classe" e così via. E qui i semplici DSL esterni segnano una vittoria facile iniziale.
E se il tuo progetto è così banale che questa piastra di cottura è significativa, congratulazioni. Il tuo problema non è difficile e in realtà non importa come lo risolvi.
Ma molti progetti hanno bisogno di molto più di compilazione, report di copertura e packaging. Se il boilerplate di Java è accettabile per i problemi dei clienti, perché non creare problemi? Perché realizzare scarpe solo per i bambini degli altri?