¡En efecto! ¿Por qué no usar un lenguaje poderoso y expresivo para un problema que es más complejo de lo que la gente piensa (inicialmente)? Especialmente cuando las personas que enfrentan el problema ya son competentes con dicho lenguaje. (La construcción es un problema de los programadores y la mejor manera de resolverla los programadores).
También me hice esta pregunta hace años y decidí que Java es un buen lenguaje para definir compilaciones, especialmente para proyectos Java. Y, como resultado, comencé a hacer algo al respecto.
DESCARGO DE RESPONSABILIDAD : En esta respuesta, estoy promoviendo iwant , un sistema de compilación que estoy desarrollando. Pero dado que esta es una discusión obstinada de todos modos, estoy seguro de que está bien.
No voy a dar más detalles sobre los beneficios de Java (potencia y expresividad) ni quiero específicamente. Si está interesado, puede leer más en la página de iwant .
En cambio, consideraré por qué Java (y otras GPL) se descartan tan fácilmente como inadecuados para la construcción. Muchas respuestas y comentarios aquí son buenos ejemplos de tal pensamiento. Consideremos algunos de los argumentos típicos:
"Java es imprescindible, pero las compilaciones se definen mejor de manera declarativa" , podrían decir.
Cierto. Pero cuando se usa un lenguaje como metalenguaje para un DSL interno , lo que realmente cuenta es su sintaxis . Incluso un lenguaje imperativo como Java puede ser engañado para ser declarativo. Si se ve y se siente declarativo, es (para fines prácticos) declarativo. Por ejemplo:
JacocoTargetsOfJavaModules.with()
.jacocoWithDeps(jacoco(), modules.asmAll.mainArtifact())
.antJars(TestedIwantDependencies.antJar(),
TestedIwantDependencies.antLauncherJar())
.modules(interestingModules).end().jacocoReport(name)
Este es un ejemplo real del proyecto de demostración de iwant .
De hecho, compare esto con algunos sistemas de compilación supuestamente declarativos que exponen a sus usuarios a verbos imperativos como "prueba" o "compilación". La declaración anterior contiene solo sustantivos, no verbos. Compilar y probar son tareas que iwant maneja implícitamente para otorgar al usuario los sustantivos que desea. No es el idioma Así es como lo usas.
"Java es detallado"
Sí, una gran cantidad de código Java es detallado. Pero de nuevo, no es el lenguaje, es cómo lo usas. Si una implementación es detallada, simplemente encapsúlela detrás de una buena abstracción. Muchas GPL proporcionan mecanismos adecuados para esto.
Solo imagine el fragmento de Java anterior escrito en XML. Reemplace los paréntesis con corchetes angulares y muévalos. ¡Y luego duplique cada palabra clave como etiqueta de cierre! Java como sintaxis no es detallada.
(Lo sé, comparar con XML es como quitarle un caramelo a un bebé, pero muchas construcciones están definidas en XML).
"Tendrías que compilar tu script de compilación"
Este es un punto válido. Sin embargo, es solo un problema técnico menor a resolver. Podría haberlo resuelto usando beanshell o algún otro intérprete. En cambio, lo resolví tratándolo como un problema más de compilación y bootstrapping con un simple shell o script de hormiga que compila y ejecuta un simple bootstrapper de Java.
"Java tiene repetitivo"
Cierto. Debe importar clases, debe mencionar "public", "class", etc. Y aquí, las DSL externas simples obtienen una victoria inicial fácil.
Y si su proyecto es tan trivial que este estándar es significativo, felicidades. Su problema no es difícil y realmente no importa cómo lo resuelva.
Pero muchos proyectos necesitan mucho más que compilación, informe de cobertura y empaque. Si el estándar de Java es aceptable para los problemas de los clientes, ¿por qué no crear problemas? ¿Por qué hacer zapatos solo para los hijos de otros?