Scala как расширенная Java или Java++
Java существует достаточно долго, на ней написано огромное количество софта и она является лидером в своей области. Однако Java не лишена недостатков. При проектировании языка важным критерием была простота и легкость изучения языка, и эта простота заставляет писать огромное количество лишнего кода, что бы компенсировать недостаточную гибкость языка: паттерны проектирования, XML конфиги, AOP, гетеры-сеттеры, try catch finaly синтаксис и т.д. Так же очевидно что не для всех задач чистый ООП подход является оптимальным, некоторые задачи намного эффективнее выполнять в функциональном стиле.
- Scala очень похожа синтаксисом на Java. Практически все возможности Java в Scala реализуются точно таким же или похожим образом, благодаря этому уменьшается порог вхождения в язык.
- Scala тоже является языком со строгой статической типизацией. Статическая типизация помогает когда над проектом начинают работать большие команды на протяжении большого промежутка времени.
- Производительность. Согласно исследованиям Scala имеет практически такую же производительность как и java. Где-то чуть быстрее, где-то медленнее, но общая картина такова что скорость выполнения кода на этих языках примерно одинакова.
- Полная совместимость с java — библиотеками. Т.е. вы можете использовать любую библиотеку, написанную на Java в Scala, что избавляет вас от изобретения велосипедов. И так же делает переход на Scala более приятным — вы ведь все еще можете использовать старые, привычные библиотеки, API которых вам знаком.
- Scala — более высокоуровневый язык. Вы описываете что нужно делать, а не как это нужно делать. Высокоуровневый код проще читать, писать, поддерживать и он занимает меньше места.
- Паттерн-матчинг и экстракторы
- Функции высшего порядка
- Трейты
- Кейс классы
- Поддержка XML
- Значение параметров по умолчанию и именные параметры
- Неявные преобразования
- Автоматический вывод типов
- Монады
В разы более мощный инструментарий для разработчиков библиотек. Эффективность разработки на каком-либо языке определяется в большей степени наличием готовых библиотек. Какой толк от языка, если придется на нем придется разрабатывать все с нуля? Возможность разрабатывать свои DSL, implicit параметры и преобразования, функции высшего порядка, мощная система типов позволяют писать более гибкие и мощные библиотеки, которыми удобнее пользоваться. Но даже если на Scala еще не написана нужная вам библиотека, вы можете просто использовать библиотеку из Java.
Высокоуровневая работа с коллекциями. Благодаря наличию замыканий для большинства манипуляций с коллекциями (отфильтровать, сделать выборку, проверить все элементы на условие, разбить на группы и т.д) существуют отдельные методы. Это позволяет в 95% использовать уже готовые библиотечные методы, в то время когда на Java вам необходимо писать те же самые операции каждый раз самому.
Лаконичность динамического программирования. Благодаря implicit’ам, неявному выводу типов и богатому синтаксическому сахару ваш код начинает выглядеть почти так-же лаконично как если бы вы писали на динамическом языке типа Groovy или Ruby. При этом каждая переменная имеет свой тип и компилятор вам подскажет если вы будете делать что-то не так.
Меньшее количество неинформационного шума. Это как раз тот момент где общая картина складывается из мелочей. В Scala очень много моментов где она позволяет писать на несколько символов меньше. На выходе получается примерно в 2-3 раза меньше кода, чем на Java без потери читабельности!
Поддержка многих паттернов проектирования на уровне синтаксиса. Хотите синглетон — меняет слово «class» на «object», хотите фабрику — используйте конструктор со значениями по умолчанию и именными параметрами, хотите команду — просто передаете замыкание и т.д.
Более понятный и структурированный код бизнес-логики. Не все можно описать на высоком уровне, бывает логика с большим количеством if /else, проверок, условий, выделением дополнительных вспомогательных методов. Благодаря паттерн-матчингу, монадам, функциям высшего порядка, вложенным методам такая логика получается в разы читабельнее. Когда в Java необходимо сделать много if / else / switch проверок в Scala можно использовать паттерн матчинг, когда в Java необходимо заимплементить интерфейс и добавить класс в конфигурацию, в Scala нужно просто передать замыкание, когда в Java идут проверки на null и обработка ошибок в Scala используются монады, когда в Java создаются классы Utils, фабрики, интерфейсы с глобальными переменными, сигнглетоны в Scala создается объект-компаньен.
Заключение
Я не утверждаю что Java является абсолютным злом. Напротив, это прекрасный язык, он был огромным шагом вперед для своего времени, однако время идет и все меняется, появляются новые технологии, старые устаревают. И нам, программистам, нужно двигаться вперед и изучать новые, более совершенные инструменты. И Scala отлично подходит на эту роль, она лишена большинства недостатков Java и имеет очень много новых возможностей с помощью которых программист может качественнее выражать свои мысли и значительно увеличить свою продуктивность.
Чем отличаются Scala и Java?
Scala – это новое поколение виртуальной машины Java (JVM). Этот язык становится все более популярным в качестве современной альтернативы Java, — пишет KV.BY в своем переводе статьи «What Are The Differences Between Scala and Java?».
Будучи представленным еще в 1995 году, Java считался одним из бесспорных лидеров среди языков программирования, особенно в сфере программирования на стороне сервера. На сегодняшний день Scala уж точно не может похвастаться столь же высоким уровнем популярности, как у Java. Однако последние несколько лет популярность Scala неуклонно растет.
Решение Twitter в 2019 году перевести свою платформу с Ruby на Scala привлекло внимание многих компаний в мире веб-разработки. Подобная реклама сыграла свою ключевую роль, поэтому многие другие компании после этого стали переходить на Scala. Сегодня Scala используется для back-end-разработки многих веб-сайтов: eBay, Netflix, LinkedIn и The Guardian.
Все большее количество программистов переходит на Scala. Поэтому, если вы связаны с разработкой, то вам важно понимать разницу между Java и Scala, чтобы при работе над следующим проектом иметь достаточно информации и выбрать наиболее подходящий язык.
Размер и качество кода
При использовании Java разработчикам необходимо писать длинные строки кода, чтобы выполнить простые задачи. Scala позволяет выполнить те же задачи, используя более лаконичный код. Задача, которая требует 20 строк Java-кода, на Scala займет всего 6. Такое сжатие кода позволяет сделать его более организованным, а также легким для чтения и дальнейшего использования. Меньшее количество строк также облегчает нахождение и исправление багов.
Функциональная природа Scala позволяет более естественно использовать лямбда-функции и цепочки, требуя задействования меньшего количества кода.
Сложность кода
Scala использует более сложные структуры, нежели Java. Многие разработчики отмечают, что на первоначальном этапе Scala сложнее поддается изучению.
Когда дело касается использования расширенных функций в языке Scala, уровень сложности значительно повышается. Именно поэтому Scala приобрел репутацию сложного языка. Однако для тех, кто начинает изучать язык с нуля, более лаконичный Scala-код может значительно облегчить жизнь.
Функциональное программирование
Java создавался в 1990-ых годах, поэтому его формировали как объектно-ориентированный язык программирования. Однако в дальнейшем он был улучшен и получил некоторые возможности функционального программирования.
Scala был создан в начале 2000-ых изначально в качестве функционального языка программирования. В отличие от Java, у Scala более продвинутые возможности в функциональном программировании, такие как неизменность («немутабельность»), функции высокого порядка и отложенные вычисления.
Структуры
Значительную часть синтаксиса и функций Scala позаимствовал у Java. Но у Scala все же есть ряд структур, которые недоступны в Java. К примеру, Scala поддерживает case-классы и автоматический вывод типа. Высокая структурированность языка Scala позволяет программистам в дальнейшем использовать его в качестве предметно-ориентированного языка (DSL). Благодаря этому можно использовать Scala в соответствии с потребностями определенных проектов.
Совместимость
В теории, Java и Scala совместимы друг с другом. Разработчики могут вызывать Java-функции прямо внутри Scala-кода. Однако процесс внедрения Java-функций в Scala-код и наоборот не так прост, как выглядит на первый взгляд. Каждый язык по-своему реализует интерфейсы, коллекции, аннотации и иные функции. Поэтому хоть оба языка и взаимосовместимы, но эти различия все же имеют значение.
Модель параллелизма
При использовании Java 8 программисты вынуждены придерживаться классической, основанной на потоках модели параллелизма. Такой подход разбивает программу на несколько параллельно запущенных задач на стадии выполнения. Scala же использует модель акторов, которая является более современной и эффективной. Это позволяет разработчикам определять каждый объект в качестве актора с определенным поведением и почтовым адресом. Таким образом, Scala упрощает взаимодействие потоков и контроль, тем самым повышая эффективность всего процесса.
Производительность
В соответствии с тестом, проведенным новостным IT-ресурсом DZone, Scala на 20% быстрее Java. Однако стоит отметить, что оценка производительности всегда субъективна, поэтому не стоит доверять ей на 100%.
Так как оба языка работают на JVM, перед запуском их код должен одинаковым образом компилироваться в байт-код. Scala выигрывает в производительности благодаря такой технике оптимизации, как «хвостовая рекурсия» («tail call recursion»), которая выполняется на этапе компиляции, где если последним выражением в методе является рекурсивный вызов, то он может быть опущен и заменен на итерационное решение. Кроме этой оптимизации, фактически, Java и Scala обладают близкими по своим показателям характеристиками производительности, так как оба языка работают на JVM.
Кроме случаев, когда необходимо внедрять приложение реального времени, разница в производительности этих двух языков не будет играть ключевой роли. Если приложение обрабатывает сетевой трафик, http-запросы или подключается к базе данных, тогда влияние производительности языка будет незначительным.
Доступность инструментов и фреймворков
Как уже отмечалось ранее, Java – это более «взрослый» язык. Поэтому у Java-разработчиков есть более широкий выбор редакторов, фреймвороков и инструментов. И это, возможно, одно из главных преимуществ данного языка. Scala понадобятся годы, чтобы построить столь же сильное сообщество и собрать такой же архив инструментов.
Так как популярность Scala продолжает расти, регулярно выходят новые инструменты и фреймворки. Кроме того, Scala – это JVM-язык, поэтому у разработчиков на этом языке есть возможность использовать некоторые Java-библиотеки и фреймворки.
Java или Scala: какой язык выбрать?
Как итог, более сложные структуры Scala-кода и некоторые сложности в изучении этого языка уравновешиваются его лаконичностью и широкими возможностями в функциональном программировании. С другой стороны, Java является крайне распространенным решением для многих крупных компаний по всему миру и продолжает предоставлять программистам широкий выбор инструментов и фреймворков.
В целом, Java и Scala имеют много схожестей и оба могут быть использованы для создания самых различных приложений. Однако каждый из этих языков программирования имеет свои сильные и слабые стороны. Поэтому при работе над каждым проектом необходимо оценивать текущие потребности и уже, исходя из них, решать, какой язык выбрать для разработки. Scala – это отличный вариант для приложений, которые имеют дело с большими данными. Но для других проектов сложность кода и небольшое количество специалистов могут нейтрализовать все бонусы, которые может предоставить Scala.