Реально ли доставить настольное приложение Clojure?

25

В настоящее время я поставляю настольное Java-приложение. Это простое старое приложение Java 5 Java / Swing, и до сих пор все работало хорошо. Java 5 была нацелена, потому что некоторые пользователи были на версии / компьютерах OS X, которые никогда не будут иметь Java 6 (мы можем скоро снять это ограничение и переключиться на более новую Java и просто отказаться от моих пользователей, застрявших в Java 5).

Я быстро набираю скорость с Clojure, но я еще не сделал много Clojure-to-Java и Java-to-Clojure, и мне было интересно, реалистично ли поставить настольное приложение Clojure вместо приложения Java ?

Приложение, которое я отправляю, в настоящее время занимает около 12 МБ со всеми файлами .jar, поэтому добавление Clojure не является большой проблемой.

Мой план состоял бы в том, чтобы Clojure вызывал Java API: мое приложение уже разделено на несколько независимых jar-файлов.

Если я правильно понимаю, вызывать Clojure из Java сложнее, чем вызывать Java-код из Clojure, поэтому я бы в основном переписал весь пользовательский интерфейс (часть пользовательского интерфейса, в любом случае необходимо переписать компоненты Swing и самодельные BufferedImages из-за повышения сетчатки дисплея), и сделайте всю «проводку» от Clojure.

Вот проблема, с которой я сталкиваюсь: реалистично ли поставить настольное приложение Clojure? (это, конечно, не очень широко распространено, но тогда поставки простых настольных Java-приложений тоже не распространены, и я все равно делаю это)

Технически, что нужно сделать? (по сравнению с доставкой приложения Java)

Седрик Мартин
источник
1
Взгляните на Seesaw , это Clojure DSL для создания приложений GUI на основе JVM (на основе Swing).
Михаил Клишин
Похоже, Seesaw может оказаться полезным для создания графического интерфейса и выполнения разводки, но как насчет интеграции моих существующих API / библиотек Java? Все ли должно быть безболезненно? (Я все равно сообщу здесь, но мне хотелось бы получить немного больше отзывов, прежде чем пытаться переключиться на Clojure)
Седрик Мартин
ClojureScript + (NW.js или Atom Electron) сделает эту работу.
Марио Т. Ланца

Ответы:

28

Да, это абсолютно реалистично - кажется, что пока еще немногие этим занимаются, но я думаю, что это только вопрос времени (в конце концов, Clojure довольно новый!)

Я лично написал игру с открытым исходным кодом на Clojure, которая запускается как приложение Swing (https://github.com/mikera/ironclad), поэтому у меня есть кое-какой опыт, которым можно поделиться.

  • В среднем вы, вероятно, хотите, чтобы Clojure вызывал API Java. В основном это здравый смысл - у Java есть все замечательные библиотеки, Clojure - более производительный язык для склеивания вещей.
  • Возможно, вы захотите написать «загрузчик» на основе Java с main(...)методом, который запускает часть кода Clojure. Среди прочего, это означает, что вам не нужно будет AOT компилировать код Clojure. Пример кода здесь: https://github.com/mikera/ironclad/blob/master/src/main/java/ic/IronClad.java
  • Вы, вероятно, захотите сделать такие вещи, как всплывающее окно, пока ваше приложение инициализируется, чтобы обеспечить дополнительное время загрузки / компиляции кода Clojure. Это, вероятно, добавляет 1-2 секунды к обычному времени запуска приложения, и этого достаточно, чтобы ваш пользователь, вероятно, оценил некоторые отзывы. Если вы сообразительны, вы можете фактически выкинуть весь пользовательский интерфейс, в то время как другие вещи загружаются в фоновом режиме, но это требует некоторой осторожности и может проверить ваш параллелизм kung-fu :-)
  • Вы можете смешивать Java и Clojure относительно свободно, так как они могут вызывать назад и вперед довольно прозрачно. Единственное осложнение, если вы хотите, чтобы Java вызывала Clojure, состоит в том, что Java любит знать класс / интерфейс, который она вызывает во время компиляции. Хорошим вариантом является использование кода Clojure для динамической реализации Java-скомпилированного интерфейса посредством reify .
  • Я обнаружил, что довольно легко разработать и упаковать приложение в один jar-файл, содержащий как код Clojure, так и код Java, используя Eclipse / Maven. Код Clojure можно просто вставить src/main/resourcesи загрузить / скомпилировать во время выполнения.
  • Вы можете использовать оболочку Clojure GUI, как качели, если хотите. Вроде бы неплохо. Я решил не использовать его, в основном потому, что хотел сделать что-то непростое с Swing напрямую и не чувствовал, что мне нужен дополнительный уровень абстракции.
mikera
источник
отличный ответ ... +1. Очень интересно и спасибо за ссылку на ваш исходный код: он обязательно поможет. Теперь мне нужно, чтобы моя среда разработки была "стабильной" (только что попробовал последний leiningen + clojure-mode + nrepl.el, и он не работает ... пока;)
Седрик Мартин