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

Об эффективности и совместимости Java: Clojure vs. Scala

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

Статистика, полученная с помощью "Компьютерная игра Benchmark Game" , говорит о лучшем, что вы, вероятно, найдете.

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

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

В статистике говорят, что Scala довольно чертовски быстро.

Ответ 5

  • Идиоматический Scala быстрее, чем идиоматический Clojure, и останется таким.
  • Оба 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. Вы могли бы сказать, что это Lisp сделано правильно - жирным шрифтом, некоторые скажут, что это нелепо, заявка, которая может оказаться правдой.

Ответ 6

Взаимодействие, я не могу говорить за 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, сделанный правильно.

Ответ 7

В ноябрьском выпуске 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 должно быть сложным, а вызов методов со специальными символами требует знания того, как они закодированы в байт-коде.

Ответ 8

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

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