Подтвердить что ты не робот

Clojure или Scala для биоинформатики/биостатистики/медицинских исследований

Я не профессиональный программист (моя область - медицинское исследование), но я вполне способен на C/С++ и на разных языках сценариев. Некоторое время назад я был заинтригован Lisp, но у меня не было времени серьезно изучить его. После короткой экспозиции R я решил больше времени вкладывать в функциональный язык программирования.

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

Как эти языки сравниваются в пространстве приложений, в котором они мне нужны? Существуют ли какие-либо реальные проекты в области биоинформатики, используя либо?

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

Какие-либо существенные преимущества/недостатки у кого-либо есть?

4b9b3361

Ответ 1

Я могу лично поручиться за Clojure как отличный инструмент для такого рода работ. (Я считаю, что Scala тоже будет здорово, у меня просто меньше опыта с ним).

Мои личные исследования проводятся в области интеллектуального моделирования/машинного обучения и очень интенсивно вычислительны, поэтому я думаю, что он имеет много параллелей с биоинформатикой или биостатистикой.

Мой личный подход/настройка включает в себя:

  • Incanter используется главным образом как инструмент визуализации данных. Отлично подходит для быстрой визуализации, которая обычно представляет собой только 1-лайнер в REPL. Есть также множество статистических и числовых инструментов обработки, которые, я считаю, используют библиотеку Colt под капотом. Я не эксперт в R, но я понимаю, что Incanter примерно "R переведен в Clojure/Lisp".

  • Использование нескольких библиотек Java по мере необходимости. Некоторые из них являются моими собственными, например, алгоритмами, которые я написал на Java, чтобы получить максимально возможную точную настройку из JVM. Но вы также можете легко использовать любую из других великолепных библиотек Java, поскольку вызов Java из Clojure очень прост (объект .methodName param1 param2)

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

  • Никогда не нужно беспокоиться о производительности. Вы можете сделать Clojure довольно быстро, если хотите (например, с помощью типов подсказок, примитивной арифметической поддержки и т.д.), Но обычно это не имеет значения, поскольку вы все равно будете тратить 99% + ваших циклов в хорошо оптимизированном библиотечном коде. Следовательно, немного накладных расходов в коде "клей" незначительно - я чувствую, что получаю гораздо больше с точки зрения личной производительности благодаря динамическому, высокоуровневому функциональному языку для работы.

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

  • Медленно растущий набор макросов для "расширения языка" при необходимости. Я на самом деле использую макросы меньше, чем я думал, что (функции более высокого порядка часто являются лучшим выбором). Но когда они вам понадобятся, они бесценны - здесь вы действительно цените ценность гомоиконного языка. Поскольку они эффективно позволяют добавлять новый синтаксис к самому языку, они очень эффективны при правильном использовании для создания DSL, который вам нужен.

Короче говоря, я не думаю, что вы можете ошибиться с Clojure в качестве исследователя.

Одна вещь, которую я, вероятно, не использовал бы для нее (пока), на самом деле пишет новую численную библиотеку - это, вероятно, было бы лучше сделано в Scala или чистой Java, поскольку вы, вероятно, захотите принять более императивный/ООП стиль.

Ответ 2

Я не уверен в биоинформатике и биостатистике как таковой, но я часто анализирую научные данные, и я понимаю, что Scala позволяет мне писать как-быструю, как Java-код с относительной легкостью. Я считаю, что это часто возможно в Clojure сейчас, но я не видел тестов, чтобы поддержать это. На данный момент я считаю, что разумно предположить, что они не работают одинаково хорошо. См., Например, Компьютерная игра Benchmark Game, где Scala быстрее, чем Clojure в каждом отдельном тесте. (Игнорировать ужасный результат "pidigits" для Clojure - Scala (и Java) вызывают библиотеку GMP, написанную на C, которую может выполнять Clojure, но из-за технической детали, требующей другой упаковки для библиотеки, в игре в настоящее время не допускается). Глядя на многоядерные сравнения не улучшает отображение Clojure и не замечает, что код Clojure не короче для этих видов низкого уровня алгоритмические задачи.

Clojure в настоящее время впереди с параллельными коллекциями, хотя предстоящий выпуск 2.9 Scala должен сильно повлиять. Ни одна из них не имеет мягкой кривой обучения при выходе из С++; Scala может быть немного легче, учитывая, что синтаксис внешне выглядит немного более знакомым. Я считаю, что есть хорошие материалы для изучения каждого из них.


Изменить: P.S. Вы можете вызвать R из Java (и, следовательно, из Clojure или Scala), используя rJava (в частности, интерфейс JRI). Изменить для редактирования: и, в эти дни, rScala.

Изменить №2: Scala был быстрее, чем Clojure во всем на момент написания; начиная с этого изменения, Clojure немного впереди в одном (ценой огромного количества кода) - но в любом случае общая точка стоит. (И реализация Scala для этого одного теста может быть ускорена.)

Ответ 3

Если вам нравится R, дайте Incanter попробовать! Это R для Clojure.

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

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

Действительно, эти вещи в основном личного вкуса, поэтому попробуйте оба и увидите, что делает вас счастливыми:)

Если вы хотите почувствовать себя Clojure без большого количества интеллектуальных накладных расходов, могу ли я предложить использовать leiningen для быстрого запуска тестового проекта?

Ответ 4

Чтобы построить ответ на Rex, я хотел бы добавить некоторые Scala библиотеки/продукты, которые могут вас заинтересовать:

Ответ 5

Я не знаю Scala, поэтому я не могу предложить сравнение, но я активно использую Clojure в проектах биоинформатики.

Интеграция Java отличная, и у меня не было проблем с использованием библиотек BioJava.

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

В моей биоинформационной работе я очень часто нахожусь с множеством входных данных (например, последовательностей генов), которые должны быть подвергнуты одному и тому же анализу. После того, как у меня есть функция анализа, я могу map передать его по последовательности входов (с ленивым результатом). Я полностью использовал большой 48-ядерный сервер, просто изменив этот map на pmap.

Маломасштабная параллелизация с одним изменением символа трудно превзойти!

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

Ответ 6

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

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

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

Lisp не является идеальным языком для любой программы. Но это идеальный язык для создания идеального языка для каждой программы.

Это ужасно перефразировано, но по моему опыту это было правдой. Похоже, вам понадобится довольно специализированный набор инструментов, и ни один язык не сделает их такими же естественными, как Lisp.

Ответ 7

Вы должны спросить себя, какое важное функциональное программирование для вас. Вы знаете С++, поэтому вы, вероятно, знаете OO. Я бы сказал, что проще сделать FP в Clojure (потому что вы не можете вернуться к OO-стилю) в Scala, вы можете взорвать FP и сделать больше стилей OO.

Я ничего не могу сказать о вашем пространстве приложения.

Поскольку вы упоминали R, существует R-подобная библиотека Clojure для статистики, называемая Incanter. Я не знаю о других существующих проектах в вашем прикладном пространстве.

Существует много информации об обоих языках, поэтому это не должно быть проблемой. Кривая обучения довольно крутая с обоими языками. Clojure - намного меньший язык, и, поскольку вы уже знаете некоторые lisp, не должно быть трудно усвоить важные вещи. Scala имеет систему типов, которую трудно подобрать, особенно потому, что ваш основной опыт связан с C/С++.

Оба языка имеют большие модели concurrency, и вы, вероятно, будете довольны обоими.

Ответ 8

У меня есть опыт работы в Scala и только небольшое знание в Clojure, но я запрограммировал Lisp много лет назад.

Lisp - красивый язык, но он никогда не попадал в мир, потому что он был слишком ограниченным. Я считаю, что вам нужен статически типизированный язык для разработки надежных систем. Систему типа в Scala нетрудно овладеть ею. Если вы хотите сделать очень продвинутые вещи, чтобы сделать ваши библиотеки идиотами, вы можете, но тогда вам нужно будет изучить систему типов немного больше.

Scala поддерживает неизменяемые типы, но вы можете использовать mutables без каких-либо проблем, которые вам иногда нужны. Concurrency в Scala очень хорошо реализован, а рамки, такие как akka, расширяют и улучшают эти возможности.

Scala имеет более высокий шанс стать основным языком, поскольку он более полный язык. Я боюсь, что Clojure слишком похож на Lisp (но переопределяется на JVM). Мне понравилось Lisp много, но у него было слишком много недостатков для реальных программ. С Scala я думаю, что у нас есть лучшее из обоих миров (OO и функциональное) в чистом браке. Кроме того, Scala, похоже, действительно ложится на рынке.

Ответ 9

Мы работаем над некоторым экспериментальным кодом в проекте Rudolf/BioClojure на GitHub. Кроме того, посмотрите проект Jan Aert BioClojure, который более структурирован.

Кроме того, существует проект BioCaml в работе...