O envio de um aplicativo de desktop Clojure é realista?

25

Atualmente, estou enviando um aplicativo Java para desktop. É um aplicativo Java 5 Java / Swing simples e antigo e até agora tudo funcionou bem. O Java 5 foi direcionado porque alguns usuários estavam na versão / computadores do OS X que nunca devem ter o Java 6 (podemos levantar essa limitação em breve e mudar para um Java mais recente e simplesmente abandonar meus usuários presos ao Java 5).

Estou rapidamente me familiarizando com o Clojure, mas ainda não fiz muito Clojure para Java e Java para Clojure e fiquei imaginando se seria realista enviar um aplicativo de desktop Clojure em vez de um aplicativo Java ?

Atualmente, o aplicativo que estou enviando tem cerca de 12 MB com todo o .jar, portanto, adicionar o Clojure não parece ser um problema.

Meu plano seria fazer com que o Clojure chamasse APIs Java: meu aplicativo já está dividido em vários frascos independentes.

Se eu entendi que chamar corretamente o Clojure a partir de Java é mais difícil do que chamar o código Java a partir do Clojure, é por isso que basicamente reescrevi toda a interface do usuário (parte da interface do usuário), misturar componentes Swing e BufferedImages automáticos precisam ser reescritos de qualquer maneira devido ao aumento retina) e faça toda a fiação da Clojure.

Esse é o problema que estou enfrentando: é realista enviar um aplicativo de desktop Clojure? (certamente não parece muito difundido, mas o envio de aplicativos simples para desktops em Java também não é tão comum, e estou fazendo assim mesmo)

Tecnicamente, o que precisaria ser feito? (comparado ao envio de um aplicativo Java)

Cedric Martin
fonte
1
Dê uma olhada no Seesaw , é um DSL Clojure para a criação de aplicativos GUI baseados em JVM (baseados em Swing).
Michael Klishin
A gangorra parece ser útil para criar a GUI e fazer a fiação, mas e a integração das minhas APIs / bibliotecas Java existentes? Tudo deveria ser indolor? (Eu vou relatar aqui de qualquer maneira, mas eu gostaria de ter um pouco mais de feedback antes de tentar mudar para Clojure)
Cedric Martin
O ClojureScript + (NW.js ou Atom Electron) faria o trabalho.
Mario T. Lanza

Respostas:

28

Sim, é totalmente realista - poucas pessoas parecem estar fazendo isso ainda, mas acho que é apenas uma questão de tempo (Clojure é bem novo, afinal!)

Eu escrevi pessoalmente um jogo de código-fonte aberto no Clojure, que é executado como um aplicativo Swing (https://github.com/mikera/ironclad), então tenho algumas experiências para compartilhar que podem ser úteis.

  • Em média, você provavelmente deseja que o Clojure chame as APIs Java. Isso é principalmente senso comum - Java tem todas as ótimas bibliotecas, Clojure é a linguagem mais produtiva para colar as coisas.
  • Você pode escrever um "carregador" baseado em Java com um main(...)método que inicie a parte do código Clojure. Entre outras coisas, isso significa que você não precisará compilar seu código Clojure. Exemplo de código aqui: https://github.com/mikera/ironclad/blob/master/src/main/java/ic/IronClad.java
  • Você provavelmente desejará fazer coisas como exibir uma tela inicial enquanto o aplicativo inicializa para permitir um tempo extra de inicialização para carregar / compilar o código Clojure. Provavelmente, ele adiciona de 1 a 2 segundos a um tempo típico de inicialização do aplicativo, o que é suficiente para que o usuário provavelmente aprecie alguns comentários. Se você é esperto, pode realmente ativar toda a interface do usuário enquanto outras coisas são carregadas em segundo plano, mas isso requer alguns cuidados e pode testar sua concorrência simultânea :-)
  • Você pode misturar Java e Clojure de maneira relativamente livre, pois eles podem chamar de trás para frente e para frente de maneira bastante transparente. A única complicação se você deseja que o Java chame o Clojure é que o Java gosta de conhecer a classe / interface que está chamando no momento da compilação. Uma boa opção é fazer com que o código Clojure implemente dinamicamente uma interface Java já compilada via reify .
  • Achei muito fácil desenvolver e empacotar um aplicativo em um único frasco contendo os códigos Clojure e Java usando o Eclipse / Maven. O código Clojure pode ser simplesmente inserido src/main/resourcese carregado / compilado em tempo de execução.
  • Você pode usar os wrappers da GUI do Clojure como gangorra, se quiser. Parece ser muito bom. Decidi não usá-lo, principalmente porque queria fazer algumas coisas complicadas diretamente com o Swing e não sentia que precisava de uma camada extra de abstração.
Mikera
fonte
ótima resposta ... +1. Muito interessante e obrigado pelo link para o seu código-fonte: ele definitivamente ajudará. Agora eu preciso para obter o meu ambiente de desenvolvimento "estável" (mais recente + clojure-mode Leiningen apenas tentei + nrepl.el e ele não está funcionando ... ainda;)
Cedric Martin