О производительности и совместимости Java: Clojure против Scala


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

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

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

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

8 80

8 ответов:

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

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

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

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

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

и если на то пошло они взаимодействовать...

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

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

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

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

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

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

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

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

статистика производства " Компьютерный Язык Бенчмарк Игры " это лучшее, что вы, вероятно, найдете.

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

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

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

  1. идиоматическое Scala быстрее, чем идиоматическое Clojure, так и останется.
  2. и Scala и Clojure легко сидят на вершине Java. Ни один не сидит хорошо под ним.

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

The Компьютерный Язык Бенчмарк Игры проливает мало света на истинные затраты ресурсов Clojure. Нет В Clojure используются структуры данных. Функциональные и последовательные абстракции не появляются.

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

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

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

Скала была сказал, чтобы быть Java сделано правильно. Clojure-это не что иное, как Java. Можно сказать, что это Lisp сделано правильно - смелое, некоторые сказали бы нелепое, утверждение-которое может оказаться правдой.

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

это тривиально легко вызвать Java из Scala.

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

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

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

The выпуск 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. Создание геттеров и сеттеров следующий объект JavaBean требуется аннотация.

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

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

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