¿Es realista el envío de una aplicación de escritorio Clojure?

25

Actualmente estoy enviando una aplicación Java de escritorio. Es una aplicación simple Java 5 Java / Swing y hasta ahora todo funcionó bien. Java 5 fue apuntado porque algunos usuarios estaban en la versión OS X / computadoras que nunca tendrán Java 6 (podemos levantar esta limitación pronto y cambiar a una Java más nueva y simplemente abandonar a mis usuarios atrapados con Java 5).

Me estoy poniendo rápidamente al día con Clojure, pero todavía no he hecho mucho Clojure-to-Java y Java-to-Clojure y me preguntaba si era realista enviar una aplicación de escritorio Clojure en lugar de una aplicación Java ?

La aplicación que envío actualmente tiene aproximadamente 12 MB con todos los archivos .jar, por lo que agregar Clojure no parece ser un problema.

Mi plan sería que Clojure llamara a las API de Java: mi aplicación ya está dividida en varios frascos independientes.

Si entiendo correctamente, llamar a Clojure desde Java es más difícil que llamar a código Java desde Clojure, por lo que básicamente reescribiría toda la interfaz de usuario (parte de la interfaz de usuario, la mezcla de componentes Swing y BufferedImages de fabricación propia debe reescribirse de todos modos debido al aumento de pantalla retina), y haga todo el 'cableado' desde Clojure.

Entonces, ese es el problema al que me enfrento: ¿es realista enviar una aplicación de escritorio Clojure? (Ciertamente no parece estar muy extendido, pero enviar aplicaciones de escritorio Java simples tampoco es tan común y lo estoy haciendo de todos modos)

Técnicamente, ¿qué debería hacerse? (en comparación con el envío de una aplicación Java)

Cedric Martin
fuente
1
Eche un vistazo a Seesaw , es un DSL Clojure para crear aplicaciones GUI basadas en JVM (basadas en Swing).
Michael Klishin
Parece que Seesaw puede resultar útil para construir la GUI y hacer el cableado, pero ¿qué pasa con la integración de mis API / bibliotecas Java existentes? ¿Debería ser todo indoloro? (Informaré aquí de todos modos, pero me gustaría tener un poco más de comentarios antes de intentar cambiar a Clojure)
Cedric Martin
ClojureScript + (NW.js o Atom Electron) haría el trabajo.
Mario T. Lanza

Respuestas:

28

Sí, es completamente realista: no parece que muchas personas lo estén haciendo todavía, pero creo que es solo cuestión de tiempo (¡Clojure es bastante nuevo después de todo!)

Personalmente, escribí un juego de código abierto en Clojure que se ejecuta como una aplicación Swing (https://github.com/mikera/ironclad), así que tengo algunas experiencias para compartir que pueden ser útiles.

  • En promedio, probablemente desee que Clojure llame a las API de Java. Esto es sobre todo sentido común: Java tiene todas las bibliotecas geniales, Clojure es el lenguaje más productivo para pegar cosas.
  • Es posible que desee escribir un "cargador" basado en Java con un main(...)método que inicie la parte Clojure del código. Entre otras cosas, esto significa que no tendrá que compilar AOT su código Clojure. Código de ejemplo aquí: https://github.com/mikera/ironclad/blob/master/src/main/java/ic/IronClad.java
  • Probablemente querrá hacer cosas como abrir una pantalla de inicio mientras su aplicación se inicializa para permitir el tiempo de inicio adicional al cargar / compilar el código Clojure. Probablemente agrega 1-2 segundos al tiempo de inicio de una aplicación típica, lo cual es suficiente para que su usuario probablemente aprecie algunos comentarios. Si eres inteligente, puedes arrojar toda la interfaz de usuario mientras otras cosas se cargan en segundo plano, pero esto requiere un poco de cuidado y puede probar tu simultaneidad kung-fu :-)
  • Puede mezclar Java y Clojure con relativa libertad, ya que pueden llamar hacia atrás y hacia adelante de manera bastante transparente. La única complicación si desea que Java llame a Clojure es que a Java le gusta saber la clase / interfaz a la que llama en tiempo de compilación. Una buena opción es hacer que el código Clojure implemente dinámicamente una interfaz Java compilada a través de reify .
  • Me ha resultado bastante fácil desarrollar y empaquetar una aplicación en un solo contenedor que contiene código Clojure y Java utilizando Eclipse / Maven. El código Clojure simplemente se puede introducir src/main/resourcesy cargar / compilar en tiempo de ejecución.
  • Si lo desea, puede usar envoltorios Clojure GUI como balancín . Parece estar bastante bien. Decidí no usarlo, principalmente porque quería hacer algunas cosas complicadas con Swing directamente y no sentía que necesitaba una capa adicional de abstracción.
mikera
fuente
gran respuesta ... +1. Muy interesante y gracias por el enlace a su código fuente: definitivamente ayudará. Ahora necesito que mi entorno de desarrollo sea "estable" (acabo de probar el último leiningen + clojure-mode + nrepl.el y no funciona ... todavía;)
Cedric Martin