На производительность и совместимость Java: Clojure против Scala - PullRequest
80 голосов
/ 02 октября 2009

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

1.) Какой из двух языков обычно быстрее ? Я понимаю, что это будет варьироваться от одной языковой функции к другой, но общая оценка эффективности будет полезна. Например: я знаю, что словари Python действительно быстрые. Но в целом это язык на намного медленнее, чем язык Java. Я не хочу идти с Clojure и столкнуться с этой проблемой в будущем.

2.) Как совместимость с Java? Все, что я до сих пор читал, - это то, что в Scala есть нативные типы коллекций, которые делают его немного неуклюжим для интеграции с большой базой кода Java, тогда как Clojure следует простому итерируемо-ориентированному способу взаимодействия с классами Java. Есть еще мысли / подробности по этому поводу?

В конечном счете, если это достаточно близкое ничье между clojure и scala, я мог бы попробовать их обоих. Одна вещь о Clojure - язык кажется очень простым. Но опять же, у Scala очень гибкая система типов. Но я знаю, что Scala работает быстро (на основе нескольких личных учетных записей). Итак, если Clojure значительно медленнее: я хотел бы знать раньше, чем позже.

Ответы [ 8 ]

71 голосов
/ 02 октября 2009

Я думаю, что любой язык будет достаточно быстрым для вас. При сравнении Python и Java кажется немного необоснованным обвинять язык в разнице в скорости. Java компилируется JIT (кроме мобильных устройств *), тогда как Python интерпретируется. Тот факт, что оба используют байт-код, не означает, что реализации будут иметь даже отдаленно сопоставимую производительность. Но и Scala, и Clojure являются языками JVM, поэтому они должны иметь одинаковую производительность.

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

Что касается взаимодействия с Java, Scala ближе к Java, но я уверен, что оба языка хорошо взаимодействуют. В Programming Clojure Стюарт Халлоуэй пишет: «[вы можете получить доступ] ко всему, что вы можете получить из кода Java. ».

И поскольку автор Scala Мартин Одерский написал Java-компилятор Sun, я думаю, что на стороне Scala также не выпало ни одного шарика. : -)

Вам было бы трудно выбрать два лучших языка, хотя мне также нравится Ruby. Почему вы беспокоитесь о том, какой попробовать? Почему бы не попробовать их обоих? Scala, скорее всего, станет «следующей Java», хотя трудно представить, что Lisp наконец-то взлетит, если не будет более 50 лет. Но ясно, что Lisp находится на своем уникальном уровне абстракции, а Clojure довольно прост, поэтому Scala + Clojure будет не намного сложнее, чем просто (довольно сложный) Scala, и я уверен, что вы будете рады, что сделали это. Это.

И в этом отношении они взаимодействуют ...

* dalvik (JVM для Android) получил JIT-компилятор в версии 2.2 в 2010 году

32 голосов
/ 02 октября 2009

В настоящее время у JVM Scala есть преимущество за счет статической типизации, поскольку поддержка JVM для динамической типизации - отражения - медленная. Фактически, по этой причине часто предупреждается об одной функции Scala, которая должна быть реализована с помощью тех же методов, структурных типов.

Кроме того, Scala отлично принимает изменяемые объекты, а некоторые алгоритмы быстрее реализуются с помощью изменчивости.

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

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

21 голосов
/ 02 октября 2009

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

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

Я бы пошел на Scala, потому что он объектно-ориентированный, но также позволяет изучать функциональное программирование (если вам это интересно). С другой стороны, если вас не интересует ОО и вы хотите изучать «чистое» функциональное программирование, попробуйте Clojure.

15 голосов
/ 07 июня 2014
  1. Идиоматический Scala быстрее, чем Идиоматический Clojure, и останется таковым.
  2. И Scala, и Clojure легко размещаются на Java. Ни один не сидит хорошо под этим.

Если ваш код критичен ко времени или пространству, придерживайтесь Java. Но это не так, даже если вы думаете, что это так.

Benchmark Game по компьютерному языку проливает немного света на истинные затраты ресурсов Clojure. Структуры данных Clojure не используются. Функциональные и последовательные абстракции не отображаются.

Clojure может показаться простым. Это не так, но это выразительно. Он может работать в пять раз медленнее, чем Java, но источник в пять раз меньше (YMMV). Для большинства приложений это большая победа. Но для некоторых, и для некоторых частей многих других, это разрушительная потеря.

Имея опыт работы с языком Clojure, я считаю, что можно заранее сказать, будет ли ваша проблема чисто разделена на часть, которая может быть кратко и адекватно (с точки зрения производительности) выражена в Clojure, и на часть, которую необходимо выполнить на Java ,

  • Вы можете перейти на Scala lite: написание идиом Java в Scala. Вы получите некоторая краткость, синтаксис, который легче для глаз, и последовательный хотя система сложного типа.
  • Clojure lite не существует: написание идиом Java в Clojure совершенно бессмысленно. Все, что вы получите, это медленная Java, это сложно чтобы понять, потому что он пересекает зерно идиом, используемых для выразить это.

Говорят, что Scala Java сделано правильно . Clojure не похож на Java. Вы могли бы сказать, что это Лисп сделан правильно - смелое, некоторые скажут нелепое утверждение - что может оказаться правдой.

15 голосов
/ 02 октября 2009

Статистика "1001 * Computer Language Benchmark Game " - это лучшее из того, что вы, вероятно, найдете.

Они всесторонние, и вы можете сравнить многие языки. Проблема в том, что они не охватывают Clojure: (

Тем не менее, довольно легко отправить что-либо - все это с открытым исходным кодом.

Статистика говорит, что Scala чертовски быстр.

9 голосов
/ 02 октября 2009

По поводу взаимодействия я не могу говорить за Clojure, но я ожидаю, что он будет в той же ситуации, что и Scala.

Java легко вызывается из Scala.

Легко вызывать Scala из Java, если вы настраиваете свой внешний API на общие точки между Scala и Java. Например, объект Scala используется в некотором смысле как статические методы в Java, но это не одно и то же. Классы Scala могут компилироваться в несколько классов с именами, которые выглядят забавно в Java.

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

SVN утверждает, что "CVS сделано правильно". На мой взгляд, Scala - это правильная работа Java.

3 голосов
/ 11 февраля 2011

В выпуске PragPub за ноябрь 2010 года обсуждается совместимость Clojure-Java. Вызов методов Java прост, но расширение классов / интерфейсов Java совершенно иное.

С другой стороны, Scala намного ближе к Java. Совместимость Scala-Java разработана на http://www.codecommit.com/blog/java/interop-between-java-and-scala

Вызов Java-кода и расширение классов / интерфейсов Java работает так же, как и вызов Scala-кода. Некоторые болевые точки могут быть некоторыми крайними случаями работы с дженериками Java, потому что система типов Scala намного сильнее , чем Java. Создание методов получения и установки в соответствии с соглашением Java Bean требует аннотации .

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

1 голос
/ 18 мая 2010

Теперь (по состоянию на май 2010 г.) стоит взглянуть на последнюю ветку Clojure версии 1.2 - она ​​включает в себя множество дополнительной поддержки примитивных типов и статической типизации (с помощью различных подсказок типов и протоколов).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...