Статьи

Scala как замена компилятору Java?


Не поймите меня неправильно — за последние десять лет я написал тонны Java и думаю, что это был большой эволюционный шаг от C ++ и Smalltalk (многие другие языки тоже помогли, такие как JavaScript, Ruby, Groovy, Python и т. Д.) ,
Однако я давно хотел долгосрочную замену javac. Я даже создал
язык, чтобы почесать этот зуд.

Java является удивительно сложным языком (спецификация составляет 600 страниц, и кто-нибудь действительно хочет использовать дженерики в Java?) С его автобоксом (и прекрасным NPE, скрывающимся там), примитивными типами, простыми массивами, которые не являются коллекциями, и общим отсутствием полиморфизма строки / текст / буферы / коллекции / массивы вместе с чрезвычайно подробным синтаксисом для работы с любым типом структуры данных и свойствами bean-компонента и без замыканий (даже в JDK7), что приводит к множеству отвратительных хренов try / catch / finally, если вы не используете фреймворки с новыми пользовательскими API и еще большей сложностью. У Java даже есть
вывод типа, он просто отказывается использовать его, чтобы позволить нам сохранить любую типизацию / чтение.

Эта проблема становится еще более актуальной из-за
отсутствия Java7(что еще более актуально после Snorcle — интересно, будет ли javac заменен на jdkc? :). Так что я думаю, что Javac достиг своего апогея; закрытие выглядит маловероятным, как и любое упрощение или прогрессия.

Так что же будет долговременной заменой javac? Конечно, динамические языки, такие как Ruby, Groovy, Python, JavaScript, стали очень популярными в последние несколько лет — многим нравится им.

Хотя мой совет, хотя для долгосрочной замены Javac это
Scala . Я очень впечатлен этим! Я могу честно сказать, что если бы кто-то показал мне книгу «
Программирование Scala » Мартина Одерски, Лекса Спуна и Билла Веннерса в 2003 году, я бы, вероятно, никогда не создавал Groovy.

Так почему же Скала? Scala статически типизирован и компилируется в тот же быстрый байт-код, что и Java, поэтому обычно он примерно такой же быстрый, как Java (иногда немного быстрее, иногда немного медленнее). Например, сравните, насколько хорошо
Scala работает в некоторых тестах с
Groovy или
Jruby . Или
это . Обратите внимание, что скорость — это еще не все — бывают случаи, когда вы захотите торговать кодом, который в 10 раз медленнее для большей производительности и краткости; но для долгосрочной замены важна скорость javac.

Тем не менее, Scala имеет вывод типов — поэтому он, как правило, такой же лаконичный, как Ruby / Groovy, но все имеет статические типы. Это хорошая вещь; это делает понимание кода, навигацию и документацию намного проще. Любой токен / метод / символ, по которому вы можете щелкнуть, чтобы перейти к фактическому коду реализации и документации. Не требуется никаких дурацких исправлений или сомнений в том, кто добавил метод, когда и как, что отлично подходит для больших проектов, когда множество людей работают над одним и тем же кодом в течение длительного времени. Кажется, что Scala идеально подходит между лаконичным ощущением динамического языка, хотя на самом деле он полностью статически типизирован. Поэтому мне никогда не нужно помнить доступные магические методы — или запускать скрипт в оболочке, а затем проверять объект, чтобы увидеть, как он на самом деле выглядит — IDE / компилятор просто знает, пока вы редактируете.

Scala имеет функции высокого порядка и поддержку замыкания наряду с
пониманием последовательноститак что вы можете написать красиво сжатый код. Scala также прекрасно объединяет функциональные и ОО-парадигмы вместе в язык, который значительно проще, чем Java (хотя система типов имеет такой же порядок, чтобы ее понимать по-настоящему, чем обобщенные, — но это обычно проблема для создателей инфраструктуры, а не для разработчиков кода приложения). Это также позволяет людям постепенно переходить от традиционного способа кодирования OO / Java к более функциональному способу, что особенно актуально для людей, пишущих параллельный или асинхронный код (который из-за того, что чипы ГГц больше не растут, а вместо этого мы получаем больше ядер становится все более необходимым). Вы можете начать OO-путь и перейти к использованию неизменного состояния, если / когда вам нужны его преимущества.Функциональное программирование становится все более и более важным, поскольку мы пытаемся сделать вещи более краткими и более высокого уровня (например, замыкания, функции более высокого порядка, сопоставление с образцом, монады и т. Д.), А также имеем дело с параллелизмом и асинхронностью через неизменяемое состояние и т. Д.

В Scala также есть правильные миксины (черты), так что вам не нужно разбираться с дурацкой AOP, чтобы получить хороший модульный код. Существуют даже структурные типы на случай, если вам действительно понадобится печатать на утке.

Что меня больше всего впечатляет, так это то, что синтаксис основного языка довольно мал и прост (спецификация примерно на четверть больше, чем у Java); но его путь более мощный и гибкий, и его очень легко расширить в
библиотеках, чтобы добавить новую семантику и функции. Например, смотрите
Scala Actors . Поэтому он идеально подходит для создания встроенных DSL или внешних DSL. В действительности нет необходимости иметь Java, XPath, XSLT, XQuery, JSP, JSTL, EL и SQL — вы можете просто использовать Scala с некоторыми DSL здесь и там (примеры этого позже …).

Scala требует некоторого привыкания — я признаюсь, что первые несколько раз, когда я смотрел на Scala, это было не так приятно на глаз — с Java вы как бы привыкли к тупому многословному коду, который не очень полезен — поначалу может быть довольно шокирующе увидеть немало символов. (Мне потребовалось некоторое время, чтобы отказаться от использования _ в scala, который является символом подстановки, поскольку * является идентификатором / методом).

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

например на Java

List<String> list = new ArrayList<String>()

в Скале

val list = new List[String]

или если вы хотите указать точный набор текста

val list : List[String] = new List[String]

Однако, если вы продолжите в том же духе, красота Скалы скоро станет очевидной; он упрощает множество гремлинов в языке Java, позволяет вам писать очень краткий код, описывающий намерения, стоящие за кодом, а не излишнюю реализацию — вместе с предоставлением удобного пути перехода к элегантному функциональному программированию, который отлично подходит для создания параллельного или распределенного программное обеспечение.

Я настоятельно рекомендую вам взглянуть на Scala — с открытым разумом — и посмотреть, сможете ли вы (как только вы настроите мозг) увидеть его красоту.

Некоторые ссылки на Scala и онлайн-презентации

Если у вас есть свободный час или около того, эти видео-разговоры очень интересны

Удобные фреймворки и библиотеки Scala

  • лифт паутина рельсы скала
  • спецификации и ScalaTest для BDD и более грамотного тестирования показывают , как типизированный DSL может помочь вам писать больше consise и выразительный код , который является очень дружественным IDE
  • scalaz удобная библиотека утилит
  • диспетчеризация для работы с сервисами HTTP / JSON

Кстати, для таких, как я, которые
любят JAXRS , теперь вы можете использовать
шаблоны
лифтов с
Джерси через новый
модуль
джерси-лифтов .

В качестве примера этого в действии вы можете проверить
RestMQ, который является проектом с открытым исходным кодом, над которым я работал в последнее время, чтобы предоставить RESTful API и веб-консоль для ориентированного на сообщения промежуточного программного обеспечения, которое построено на JAXRS (Джерси), Scala и Lift.

С точки зрения инструментов есть плагины Ant / Maven, интерактивная консоль Scala (REPL) и плагины IDE для IDEA, Eclipse, NetBeans вместе с обычными редакторами (TextMate / Emacs и т. Д.). Плагины IDE еще не до уровня Java, но они очень полезны с хорошей навигацией и завершением кода.

Я пробовал плагины для NetBeans, Eclipse и IDEA, у них всех есть свои сильные и слабые стороны; кажется, что Scala люди разделены между ними всеми. Для навигации по коду и его дополнения, а также поддержки maven я нашел IDEA достаточно хорошим. Когда вы открываете Maven pom.xml, он, кажется, замечательно обрабатывает код, находя источник scala, чтобы вы могли перемещаться по любому типу / методу, чтобы увидеть его документацию / источник и т. Д. (Обычно вам нужно вручную добавить фасет Scala для запуска отладка). Хотя IDEA не всегда лучше при выделении синтаксических ошибок при вводе. Все они могут использовать некоторую работу, чтобы привести их в соответствие со своими коллегами по Java — попробуйте их и посмотрите, что вы предпочитаете.

Скала гниды

На любом языке будут кусочки, которые вы любите, и кусочки, которые вам не очень нравятся. Ранние впечатления от Scala, похоже, были попыткой использовать слишком много символов: -; но вам не нужно использовать их все — вы можете придерживаться OO-стороны забора, если хотите. Но тогда я предполагаю, что в долгосрочной перспективе лучше использовать символы для «специальных вещей», чтобы избежать конфликтов с идентификаторами и т. Д.

Я не большой поклонник вложенного оператора import, использующего _root_.java.util.List для дифференциации «глобального» импорта от относительного импорта. Я бы предпочел детский префикс. Например, если вы импортировали com.acme.cheese.model.Foo, то для импорта model.impl.FooImpl я бы предпочел явный относительный префикс, скажем: import _.impl.FooImpl, который немного упростил бы вещи в соответствии с Попытка Scala упростить вещи и удалить излишки (будучи полиморфной при импорте java.util._).

Однако по сравнению со всеми массивными волосатыми бородавками на Яве эти недостатки Scala ничтожны по сравнению с красотой, простотой и мощью Scala.

Вывод

Учитывая, что
MrJava ,
MrJRuby и
MrGroovy все рассматривают Scala как долгосрочную замену javac, возможно, в этом что-то есть. И так, чего же ты ждешь; возьмите книгу «
Программирование Scala» или книгу «
O’Reilly Scala» и начните веселиться 🙂