О Scala для тех, кому мало Java, и не только

    Прогресс не стоит на месте, люди ищут новые решения, и на JVM появляется всё больше интересных языков. Но «ядро» JVM сообщества — народ суровый, привыкший к серьёзным стандартам, и с высокими требованиями. Поэтому большинство новых языков так и висят «на периферии».

    От других языков на JVM Scala отличается действительно основательным подходом — над языком работает лаборатория мощнейшего европейского института EPFL во главе с профессором Мартином Одерски, который также известен как дизайнер системы generic-ов из Java 1.5. Конечно, это не сравнить по объёму поддержки с серьёзными коммерческими конторами в роде Sun или Microsoft, поэтому язык развивался медленно и «пошёл в дело» совсем недавно:
    scala Job Trends graph

    Что в нём интересного?

    Прежде всего, привычный синтаксис и доступность багажа наработок 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 — первый язык «широкого профиля» со статической типизацией и продуманной (а где-то и подкреплённой диссертациями) смесью функционального и объектно-ориентированного подходов:

    Не очевидно, но такой подход приятно удивляет на практике своей простотой и надёжностью — функциональное программирование приучает минимально использовать 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.
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 29

      +3
      Круто. Тоже пробовал начинать разбираться в Scala, но у меня это дело упирается в отстутствие вменяемой IDE. Такое ощущение, что плагин для Eclipse просто ни разу не тестировался разработчиками — падает каждые несколько минут.

      Вы чем пользуетесь, можете рассказать?
        0
        IDEA CE держит смешанный проект из ~3500 java файлов + Scala без проблем. Правда, ошибки в Scala показывает не все — приходит компилировать, чтобы их посмотреть. Зато работают какое-какие рефакторинги, implement/override и т.д.
        Eclipse пробовал вчера новый под 2.8 — пустой смешанный проект держит очень хорошо, все ошибки видно и т.д., но мой большой — вообще никак не тянет.
          0
          Я сравнивал. IDEA куда лучше. Только любит отожрать всю память и подтупливать. Приходится закрывать и открывать опять со всеми проектами.
          • UFO just landed and posted this here
              0
              я ей гиг отдал
              сейчас выжрано 600 метров из него на 4х открытых проектах
          0
          Ещё в Netbeans, говорят, неплохо.
          У меня Idea
            0
            А мне очень нравится,, как с ней нетбинс работает.
            +1
            Столько много новых, хороших, интересных языков… не знаешь за что взяться. Пока чуть-чуть занимаюсь Clojure. Самое печальное с этими новыми языками — непонятно выстрелят они или нет. А если выстрелят то какие? Не хочется прогадать.
              +3
              Scala и Erlang, на мой взгляд.
                +2
                Зачем ждать выстрелит или нет? Ищите язык, который дает вам делать то, что вы хотите, может даже под конкретную задачу. С другой стороны, если проект развивается, то было бы неплохо видеть и развитие языка, на котором он написан — иногда это помогает быстрее добавить в него [проект] что-то новое
                  –1
                  Какая разница? 90% софта как писалось на потомках c и c++ так и будет писаться ближайшие лет 10.
                  Стрелять надо самом или просто получать удовольствие от открытия нового для себя.
                    0
                    Ковыряю связку Scheme (kawa) + Eclipsescript, мне нравится. Выше уже правильно написали — лучше разбираться с тем, что нравится, а не тем что выстрелит, а лучше выстреливать самому.
                      0
                      Schemescript конечно же
                      +5


                      Растут все. Дело в том, что область применения у всех разная.

                      Jython, JRuby — для Python/Ruby программистов, которым нужны Java-библиотеки или задеплоить код на JVM. Jython еще используется в серверах приложений IBM & Oracle для настройки.

                      Groovy — основной скриптовой язык для JVM. Grails, Griffon — для быстрой разработки.

                      Scala — для распределенных и нагруженных приложений, да и в местах где нужно ФП и хорошо подошел бы Haskell.

                      Clojure — многие считают сменщиком CL/Scheme и будущем LISP.

                      JavaFX — для RIA.

                      Так что просто нет причины считать, что выстрелит кто-то один.
                        +1
                        я ставлю на groovy/groovy++
                        +1
                        Вообще, сейчас все новые языки довольно интересные. Я вот, к примеру, сейчас пишу на Groovy/Grails. Штука офигенная. Жалко, что на данный момент не очень быстрая. Но я очень надеюсь, что Java 7 с ее InvokeDynamic исправит ситуацию.
                      –2
                      какие у Scala преимущества перед например, JRuby?
                        +1
                        Это совершенно разные вещи.
                        Два самых главных отличия:
                        • — Типизация: scala — статическая, ruby — динамическая.
                        • — scala работает на jvm, а jruby — это интерпретатор ruby, написанный на Java.
                          0
                          Так, у Твиттера морда написана на ruby+rails, а ядро(например, работа с графами соц. связей) — scala.
                          +2
                          Если я правильно понимаю, то — статическая типизация. И как следствие скорость исполнения кода
                            +8
                            Вы, мне кажется, палец с попой сравнили :)
                          • UFO just landed and posted this here
                              0
                              Больше интересно какие у Scala есть возможности интеграции с J2EE проектами. Web framework — это одно. Его пишут все кому не лень. Реально нужны следующие вещи:
                              Hibernate,
                              JAXB,
                              WS на Scala,
                              Spring+Scala,
                              etc…

                              У Groovy есть одно большое преимущество над Scala: source-совместимость с Java. Поэтому один и тот же код (например модель) можно использовать в Groovy и Java.
                                0
                                это всё есть, можно просто погуглить, если получится найти время — напишу об этом подробнее
                                модель без проблем делается совместимой:

                                case class Person(@BeanProperty var name: String, @BeanProperty var city: String) // получается обычный бин с джавовскими геттерами и сеттерами

                                Hibernate, Spring, JAXB точно уже интегрировали… В akka есть что-то, но подробнее — надо гуглить

                              Only users with full accounts can post comments. Log in, please.