Я уже читал различные отчеты о Clojure vs. Scala и пока понимаю, что оба имеют свое место. Есть несколько моментов, по которым я не получил полного объяснения, когда дело доходит до сравнения Clojure и Scala:
1.) Какой из двух языков вообще быстрее ? Я понимаю, что это будет отличаться от одной языковой функции к другой, но общая оценка производительности будет полезна. Например: я знаю, что словари Python действительно быстрые. Но в целом это намного более медленный язык, чем Java. Я не хочу идти с Clojure и сталкиваться с этой проблемой в будущем.
2.) Какова совместимость с Java? Все, что я прочитал до сих пор, - это то, что Scala имеет собственные типы коллекций, которые делают его немного неуклюжим для интеграции с большой базой кода Java, тогда как Clojure следует простому Iterable / Iterator-центричному способу взаимодействия с классами Java. Есть еще мысли / подробности по этому поводу?
В конце концов, если между clojure и scala есть достаточно близкое сходство, я могу попробовать их оба. Что касается Clojure, язык кажется очень простым. Но опять же, в Scala очень гибкая система типов. Но я знаю, что Scala работает быстро (на основе нескольких личных учетных записей). Итак, если Clojure значительно медленнее: я хотел бы знать раньше, чем позже.
Ответы:
Думаю, вам подойдет любой язык. При сравнении 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 (Android JVM) получил JIT-компилятор в версии 2.2 в 2010 году
источник
В нынешней JVM Scala имеет преимущество за счет статической типизации, поскольку JVM поддерживает динамическую типизацию - отражение - медленную. Фактически, одна функция Scala, которая должна быть реализована с помощью тех же методов, структурных типов, часто предостерегается именно по этой причине.
Кроме того, Scala отлично принимает изменяемые объекты, а некоторые алгоритмы просто быстрее реализовать с помощью изменяемости.
Поскольку и Scala, и Java по сути являются языками на основе классов, они легче взаимодействуют. Или, может быть, более плавно. Класс Java - это класс для Scala, а класс Scala - это класс для Java. Проблемы могут возникнуть, когда дело доходит до синглтонов Scala или статических членов Java, особенно когда есть структура, предполагающая, что все будет работать определенным образом.
Поэтому я бы использовал Scala для обеих этих учетных записей. Clojure во многих отношениях лучший язык , и у него, безусловно, есть очень интересные функции, которых нет (пока) в Scala, но вы получаете такие преимущества, работая полностью функционально. Если вы намереваетесь это сделать, то Clojure, скорее всего, лучше. Если вы этого не сделаете, вам, вероятно, следует остаться с Scala.
источник
Обратите внимание, что Clojure и Scala - это два совершенно разных типа языков программирования. Clojure - это функциональный язык, подобный Lisp, он не является объектно-ориентированным. Scala - это объектно-ориентированный язык с функциями функционального программирования.
На мой взгляд, особенности и концепции языка (функциональный, объектно-ориентированный, ...) являются гораздо более важными критериями для выбора языка, чем производительность (конкретной реализации этого языка) - хотя я понимаю, что вы не хотите попасть в ловушку языка, для которого нет хорошо работающей реализации.
Я бы выбрал Scala, потому что он объектно-ориентированный, но также позволяет изучать функциональное программирование (если вам это интересно). С другой стороны, если вас не волнует объектно-ориентированный подход и вы хотите изучить «чистое» функциональное программирование, попробуйте Clojure.
источник
Если ваш код критичен ко времени или пространству, придерживайтесь Java. Но это не так, даже если вы так думаете.
Игра Computer Language Benchmark Game не проливает света на истинную стоимость ресурсов Clojure. Никакие структуры данных Clojure не используются. Функциональные абстракции и абстракции последовательностей не появляются.
Clojure может показаться простым. Нет, но выразительно. Он может работать в пять раз медленнее, чем Java, но исходный код в пять раз меньше (YMMV). Для большинства приложений это большая победа. Но для некоторых и для некоторых частей многих других это сокрушительная потеря.
Имея опыт работы с языком Clojure, я считаю, что можно заранее сказать, будет ли ваша проблема четко разделена на часть, которая может быть кратко и адекватно (с точки зрения производительности) выражена в Clojure, и часть, которая требует решения на Java.
Говорят, что Scala - это правильно сделанная Java . Clojure не похож на Java. Вы можете сказать, что это Лисп, сделанный правильно - смелое, некоторые скажут абсурдное утверждение, - которое может оказаться правдой.
источник
Статистические данные, полученные с помощью " Компьютерной языковой тестовой игры ", - это лучшее, что вы, вероятно, найдете.
Они всесторонние, и вы можете сравнивать многие языки. Проблема в том, что они не охватывают Clojure :(
Тем не менее, отправить что угодно довольно просто - все это с открытым исходным кодом.
Статистика действительно говорит, что Scala чертовски быстр.
источник
Что касается взаимодействия, я не могу говорить о Clojure, но я ожидал бы, что он будет в той же ситуации, что и Scala.
Вызвать Java из Scala тривиально просто.
Вызвать Scala из Java легко, если вы согласовываете внешний API с общими точками между Scala и Java. Например, объект Scala в некотором роде используется как статические методы в Java, но это не одно и то же. Классы Scala могут компилироваться в несколько классов с именами, которые выглядят забавно в Java.
Вам не захочется много смешивать и сочетать. Создание компонента на Scala или Clojure, использующего множество библиотек Java, вполне возможно. Вы, конечно, можете вызывать этот компонент из Java, но вам не нужно пытаться использовать Scala API, предназначенный для использования программами Scala из Java.
SVN утверждает, что «CVS сделан правильно». На мой взгляд, Scala - это правильно сделанная Java.
источник
В ноябрьском выпуске 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 должно быть сложным, а для вызова методов со специальными символами потребуется знать, как они закодированы в байт-коде.
источник
Сейчас (по состоянию на май 2010 г.) стоит заглянуть в последнюю ветку Clojure 1.2 - она включает в себя много дополнительной поддержки примитивных типов и статической типизации (с помощью различных подсказок типов и протоколов).
Насколько я понимаю, вы можете использовать эти функции, когда вам это нужно, чтобы получить скорость, эквивалентную написанию точно такого же кода на чистой Java.
источник
@specialized
техника в готовящейся к выпуску Scala 2.8 вносит аналогичное улучшение в библиотеки Scala. И как языковая возможность, она доступна для всего кода, а не только для стандартной библиотеки.