Где провести черту между Clojure и Java? - PullRequest
14 голосов
/ 21 января 2011

У меня есть интересный архитектурный вопрос, касающийся приложения, которое я разрабатываю с использованием Clojure и Java. Приложение включает в себя множество интенсивных, параллельных задач обработки данных, которые необходимо организовать.

Вот логическое обоснование смешивания Clojure и Java:

  • Java необходима для какого-то симпатичного числового кода с интенсивным использованием процессора , где мне нужно оптимизировать алгоритмы для максимально быстрой работы на JVM. Clojure пока не может этого достичь, и такой код не будет очень идиоматичным в Clojure, потому что алгоритмы требуют много изменяемых данных из соображений производительности.
  • Clojure (ИМХО) гораздо лучше для управления общим потоком приложения с его превосходной поддержкой функционального программирования, интерактивной динамической разработки в REPL и функциями параллелизма.

Учитывая, что я использую оба языка - какую логику или принципы я должен применить, чтобы определить разделительную линию между ними? В частности, меня интересует, как спроектировать API / интерфейс, который был бы на правильном уровне, чтобы использовать преимущества относительных преимуществ обоих языков.

Ответы [ 2 ]

10 голосов
/ 21 января 2011

Не комментируя ваше восприятие относительных преимуществ Java и Clojure, и предполагая, что вы сделали хотя бы какой-то микропроцессор для проверки того, что это предположение имеет некоторый шанс быть верным, то правильный подход, по-видимому, состоит в том, чтобы оставить Java только для частей, которые требуют оптимизации.

Классы, отвечающие за числовой код и вычисления, должны быть написаны на Java, а все остальное на Clojure. Я бы даже выбрал более агрессивный подход и просто спроектировал бы классы так, чтобы они могли быть написаны на Java, но на самом деле записал бы их в Clojure и переписал бы их на Java, если производительность окажется проблемой.

2 голосов
/ 21 января 2011

Clojure делает хорошую работу, помогая разработчикам получить большую часть своей роли в простом функциональном стиле и изолируя мутационную работу в замкнутых областях.

Я бы применил те же самые правила здесь: изолируйте Java-код настолько, насколько вы можете, так же, как вы сделали бы большую часть вашего кода clojure в «чисто функциональном стиле». Таким образом, Java-остров будет настолько мал, насколько это возможно, учитывая ваши ограничения, и доступ к Java-острову будет проходить через небольшой набор функций clojure.

Не уверен, что это сильно помогает, но в любом случае!

...