Прогресс не стоит на месте, люди ищут новые решения, и на JVM появляется всё больше интересных языков. Но «ядро» JVM сообщества — народ суровый, привыкший к серьёзным стандартам, и с высокими требованиями. Поэтому большинство новых языков так и висят «на периферии».
От других языков на JVM Scala отличается действительно основательным подходом — над языком работает лаборатория мощнейшего европейского института EPFL во главе с профессором Мартином Одерски, который также известен как дизайнер системы generic-ов из Java 1.5. Конечно, это не сравнить по объёму поддержки с серьёзными коммерческими конторами в роде Sun или Microsoft, поэтому язык развивался медленно и «пошёл в дело» совсем недавно:
Что в нём интересного?
Прежде всего, привычный синтаксис и доступность багажа наработок Java и свободное смешивание с ним — можно спокойно в существующий Java-проект добавить несколько классов Scala и всё будет работать (у Scala есть расширения, недоступные из Java, но это обычно не сложно решить, в обратную сторону всё доступно на 100%).
Начиная от простейших вариантов type inference и послаблений синтаксиса:
кортежей (они же tuples):
и заканчивая функциональными коллекциями:
смешиванием trait-ов (как интерфейсы в Java, только с возможностью имплементации):
расширением классов (в том числе примитивных типов) через неявные преобразования:
и, конечно же, case class-ами:
Scala — первый язык «широкого профиля» со статической типизацией и продуманной (а где-то и подкреплённой диссертациями) смесью функционального и объектно-ориентированного подходов:
Не очевидно, но такой подход приятно удивляет на практике своей простотой и надёжностью — функциональное программирование приучает минимально использовать mutable state (не держать в голове, что у нас сейчас чему равно и как с этим жить) и делить программу на много мелких, хорошо читаемых и автоматически легко тестируемых методов, мощная типизация и traits позволяют чётко задать требования и избежать кучи мелких ошибок (если скомпилировалось — будет работать).
Как недавно выразился один тип из Scala community, «в отличие от C++, Scala становится тем проще, чем дальше её изучаешь». Собственно это и есть основная цель языка, и даже заключено в его названии — SCAlable LАnguage. В спецификации даны только базовые вещи, но на основе них можно построить новые удобные конструкции, которые будут выглядеть как часть языка и могут использоваться для построения сложных промышленных систем. При этом за счёт послаблений синтаксиса (можно опускать много конструкций — скобки, возвращаемые типы и т.д.) язык получается удобным даже для простых скриптов (можно написать .scala файл без классов и выполнять его как скрипт).
Для иллюстрации — недавний пост про BASIC на Scala.
Кроме отмеченных выше «приятностей», есть именованные параметры и параметры по умолчанию:
by-name параметры (вычисляются только при необходимости):
«ленивая» инициализация (оптимизированная и thread safe):
поддержка XML прямо в исходном коде:
продвинутая система уровней доступа:
и, конечно, супер мощный pattern matching:
Очень сложно собрать всё интересное в одном посте. Его слишком много. Всего даже и не вспомнить за раз. Что ещё хочется добавить:
О себе: около 10 лет программирую на Java, в прошлом году удалось убедить начальство попробовать Scala в наших проектах, первым проектом был самодокументирующийся JSON/REST вебсервис, всем понравилось, сейчас делаю пробную версию нового web interface-а к большому сервису (~3500 java classes) на Scala + Vaadin.
От других языков на JVM Scala отличается действительно основательным подходом — над языком работает лаборатория мощнейшего европейского института EPFL во главе с профессором Мартином Одерски, который также известен как дизайнер системы generic-ов из Java 1.5. Конечно, это не сравнить по объёму поддержки с серьёзными коммерческими конторами в роде Sun или Microsoft, поэтому язык развивался медленно и «пошёл в дело» совсем недавно:
Что в нём интересного?
Прежде всего, привычный синтаксис и доступность багажа наработок Java и свободное смешивание с ним — можно спокойно в существующий Java-проект добавить несколько классов Scala и всё будет работать (у Scala есть расширения, недоступные из Java, но это обычно не сложно решить, в обратную сторону всё доступно на 100%).
Краткий и выразительный код
Начиная от простейших вариантов type inference и послаблений синтаксиса:
def toString = "a: " + a // method val map = Map(1 -> "one", 2 -> "two") // map: Map[Int, String]
кортежей (они же tuples):
def error = ("Not found", 404) // method val (msg, code) = error // msg == "Not found", code == 404
и заканчивая функциональными коллекциями:
List(1, 2, 3, 4, 5).filter(_ % 2 == 1).map(_ * 2).mkString(",") // "2,6,10"
смешиванием trait-ов (как интерфейсы в Java, только с возможностью имплементации):
val handler = new DefaultHandler with Logging with AdminRoleRequired with TransactionSupport
расширением классов (в том числе примитивных типов) через неявные преобразования:
val date = today + 1.month + 5.days
и, конечно же, case class-ами:
case class Person(name: String, age: Int) // getters, equals, hashCode, toString and more val p = Person("Vasia", 12)
Качественная смесь функционального и ОО подходов
Scala — первый язык «широкого профиля» со статической типизацией и продуманной (а где-то и подкреплённой диссертациями) смесью функционального и объектно-ориентированного подходов:
- мощнейшая система типов — traits, параметрический полиморфизм высших порядков, type inference, неявные преобразования (в качестве интересной иллюстрации: ханойские башни, собирающиеся на этапе компиляции)
- любое значение — объект, любая операция — метод (1+2 — то же самое, что 1.+(2))
- любая функция — значение (может быть присвоена переменной, передана параметром и т.д.)
Не очевидно, но такой подход приятно удивляет на практике своей простотой и надёжностью — функциональное программирование приучает минимально использовать mutable state (не держать в голове, что у нас сейчас чему равно и как с этим жить) и делить программу на много мелких, хорошо читаемых и автоматически легко тестируемых методов, мощная типизация и traits позволяют чётко задать требования и избежать кучи мелких ошибок (если скомпилировалось — будет работать).
Спецификация Scala по объёму — меньше спецификации Java
Как недавно выразился один тип из Scala community, «в отличие от C++, Scala становится тем проще, чем дальше её изучаешь». Собственно это и есть основная цель языка, и даже заключено в его названии — SCAlable LАnguage. В спецификации даны только базовые вещи, но на основе них можно построить новые удобные конструкции, которые будут выглядеть как часть языка и могут использоваться для построения сложных промышленных систем. При этом за счёт послаблений синтаксиса (можно опускать много конструкций — скобки, возвращаемые типы и т.д.) язык получается удобным даже для простых скриптов (можно написать .scala файл без классов и выполнять его как скрипт).
Для иллюстрации — недавний пост про BASIC на Scala.
Не только ценный мех
Кроме отмеченных выше «приятностей», есть именованные параметры и параметры по умолчанию:
def box(width: Int = 100, height: Int = 200) = ... // method box(height = 300) // same as box(100, 300)
by-name параметры (вычисляются только при необходимости):
def debug(msg: => String) = if (debugEnabled) println(msg) debug("Debug message: " + heavyMethod()) // heavyMethod вызовется только если debugEnabled
«ленивая» инициализация (оптимизированная и thread safe):
class Context { lazy val (user, password) = { /* heavy initialization */ } }
поддержка XML прямо в исходном коде:
def description = <div><h4>{label}</h4>{text}</div>
продвинутая система уровней доступа:
protected[package] val a // виден в пакете и наследникам private[this] val b // виден только этому экземпляру этого класса
и, конечно, супер мощный pattern matching:
case class Address(city: String, street: String) case class Person(name: String, age: Int, address: Address) somePerson match { case Person("Vasia", _, _) => ... // name == "Vasia", остальное - не важно case Person(_, n, _) if n < 18 => ... // age < 18 case Person(_, _, Address(_, "Абрикосовая")) => ... // только с улицы Абрикосовой case _ => ... // всё остальное }
И многое другое
Очень сложно собрать всё интересное в одном посте. Его слишком много. Всего даже и не вспомнить за раз. Что ещё хочется добавить:
- Scala используется, например, в: Twitter, LinkedIn, FourSquare (1.5 млн. пользователей, 31 млн. просмотров в месяц, 20 млн. API запросов в день), Sony, Siemens
- Первая версия Lift, популярного web framework-а для Scala вышла чуть больше года назад, а уже используется в таких серьёзных проектах как Foursquare и Novell Pulse
- Библиотека akka показывает очень неплохие результаты в деле переноса достижений Erlang в области распределённых систем на инфраструктуру JVM
- Для тех, кто понимает разговорный английский, рекомендую видео вступительного выступления Одерски на недавней конференции Scala Days. Там было и много других интересных докладов.
- В качестве IDE рекомендую IntelliJ IDEA Community Edition + Scala plugin, Eclipse plugin уже тоже выглядит неплохo, можно пробовать
- Для отслеживания интересных ссылок по теме можно, например, читать (не моё): twitter.com/implicit_ly, twitter.com/ScalaAtSO, twitter.com/bubbl_scala
О себе: около 10 лет программирую на Java, в прошлом году удалось убедить начальство попробовать Scala в наших проектах, первым проектом был самодокументирующийся JSON/REST вебсервис, всем понравилось, сейчас делаю пробную версию нового web interface-а к большому сервису (~3500 java classes) на Scala + Vaadin.