- PVSM.RU - https://www.pvsm.ru -
Совсем недавно на Хабре появилась статья [1], которая дает не совсем верное представление о текущем положении вещей в Scala-сообществе.
У читателя создается ложное впечатление о застое и загнивании в экосистеме Scala. В этой статье я хотел бы исправить это и рассказать о недавно вышедших новинках и будущих изменениях.
В мае 2016 году на конференции Scala Days в Нью-Йорке Мартином Одерски была представлена презентация [2], описывающая настоящее и будущее языка Scala.
В ноябре 2016 года вышла новая версия компилятора Scala версии 2.12, в которой трейты компилируются прямо в Java-интерфейсы с дефолтными методами, а лямбда-функции в Scala и Java стали полностью совместимыми, так что теперь их можно вызывать в обоих направлениях одинаково удобно. Также это способствовало улучшению производительности Scala-кода на JRE 8.
На новый релиз комилятора scalac намечен рефакторинг стандартной библиотеки. Особое внимание будет уделено коллекциям и возможно стандартная библиотека будет разделена на компактное ядро и платформу, в которую войдет все, что не попало в ядро. Кажется, будто, разработка scalac буксует на месте. Возможно, это отчасти правда, потому самая мякотка разрабатывается сейчас для нового компилятора Scala, окрещенного Dotty в честь теории зависимых типов, на которой он основан.
Разработка нового компилятора [3] ведется уже несколько лет силами команды EPFL, возглавляемой Мартином Одерски. Кроме него в ядро команды входит еще 5 человек, включаяина Дмитрия Петрашко aka darkdimius [4]. Основной для новой версии языка является Dependent Object Types calculus, разработанный Мартином Одерски специально для нужд Scala.
Из-за новой структуры компилятора, суть которой объясняется в этом видео [5], скорость компиляции уже вдвое быстрее, чем в scalac. И это еще при учете того, что разработчики еще даже не приступали к оптимизации компилятора. Так что все уже устаревшие на данный момент мифы про неудобство тормозной компиляции Scala будут окончательно развенчаны.
В Dotty будет обновлена система типов, будут убраны неиспользуемые возможности языка. Многие вещи будут сильно упрощены. Но это все абстрактные слова. Давайте побыстрее перейдем к примерам.
Сначала пройдемся по тому, что убрали за ненужностью.
Вместо этого всего были добавлены новые улученные фичи:
val a : A & B
val a : A | B
//Было
val numbersAndLetters = List((1,"A"), (2,"B"))
numbersAndLetters.map {
case (number, letter) => ...
}
//Стало
numbersAndLetters.map((number, letter) => ...)
trait WithParameter(name:String) {
...
}
trait Map[type Key, type Value]
Map[Key = Int]
В текущем виде компилятор dotc можно опробовать на этом тестовом проекте [6]. В будущем же обещано добавить в язык новых возможностей.
type CtxS = implicit Context => S
def f(x:T):CtxS = {
... implicitly[Context] ...
}
f(e) //Context argument is passed implicitly
A => B (can be impure)
A -> B (pure)
T? = T | Null
val stream: PrintStream? = System.out.printStream
type (S, T, U) = (S, (T, (U, Unit)))
Также в Dotty спроектирована система Tasty, позволяющая не перекомпилировать библиотеки под каждую версию компилятора, что было проблемным в Scala 2. И по сравнению со второй версией Scala в Dotty обещают сделать хорошие объяснения [7] ошибкам при компиляции.
Венцом на короне Dotty является Linker [8], разрабатываемый Дмитрием Петрашко. Это оптимизатор, позволяющий компилировать код исключительно для тех типов, которые реально используются. Это позволяет добиться серьезного уменьшения количества кода и увелечения производительности. С помощью линкера сильно улучшается даже производительность подключаемых библиотек. Подробнее об этом чудо-оптимизаторе можно узнать в этом видео [9].
Вместо старых макросов выходят новые удобные Scala Meta [10] макросы, разрабатываемыемые Евгением Бурмако. Пока что они вышли только для Scala 2.11 и только для аннотаций, но не методов. Но уже можно сказать, что они получились гораздо удобнее предыдущей версии. Теперь объявление макроса и его имплементация не разделены, а работа с синтаксическими деревьями просто великолепна. Также scala.meta работают с исходными деревьями, а не с уже слегка преобразованными как макросы, основанные на старой scala.reflect.
Подробнее о них можно почитать в этом туториале [11].
Scala.js [12] компилирует код на Scala в высокопроизводительный Javascript код. Вместе со Scalatags [13] и ScalaCSS [14] становится возможна полноценная разработка веб-фронтенда. Огромным плюсом является возможность расшаривать сущности между клиентом и сервером, и использовать вместо явного определения HTTP API, удаленный вызов процедур. В последние несколько лет появилось несколько хорошо отлаженных и используемых в продакшене фреймворков с реактивными биндингами вроде Udash [15]. Многие разработчики используют Scala.js, так как не хотят мучатся с динамическим и «странным» JS. Приведу пример, используемый в официальной документации.
javascript> ["10", "10", "10", "10"].map(parseInt)
[10, NaN, 2, 3] // What???
scala> List("10", "10", "10", "10").map(parseInt)
List(10, 10, 10, 10) // That's it
Недавно вышел Scala Native [16] — компилятор в нативный бинарник, основанный на LLVM. Это позволяет писать на Scala сверхбыстрый мгновенно запускающийся код и использовать низкоуровневые структуры данных.
Так как Scala компилируется в Java код, то является возможным использования этого языка для разработки под Андроид. Для этого существует специализированная библеотека Macroid [17], предоставляющая удобное для использование Android API. Так же существует возможность cкомпилировать Scala код по IOS с помощью RoboScala — обертки вокруг RoboVM [18]
Для разработки десктопного софта существует библиотека ScalaFX [19], являющаяся оберткой вокруг известной JavaFX.
Хоть статья и получилась сильно сумбурной, но она может послужить хорошим списком ссылок на различные инструменты компиляции Scala под различные платформы, и источником информации о будущих наработках и фичах. Все представленные в статье инструменты и компиляторы активно разрабатываются, улучшаются и используются. Так что говорить о каком-либо застое или даже упадке в экосистеме Scala не приходится.
Автор: SergioShpadi
Источник [20]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/214201
Ссылки в тексте:
[1] статья: https://habrahabr.ru/post/314308/
[2] презентация: http://www.slideshare.net/Odersky/scala-days-nyc-2016
[3] нового компилятора: https://github.com/lampepfl/dotty
[4] darkdimius: https://habrahabr.ru/users/darkdimius/
[5] этом видео: https://www.youtube.com/watch?v=WxyyJyB_Ssc
[6] этом тестовом проекте: https://github.com/smarter/dotty-example-project
[7] объяснения: http://www.scala-lang.org/blog/2016/10/14/dotty-errors.html
[8] Linker: https://github.com/dotty-linker/dotty
[9] этом видео: https://www.youtube.com/watch?v=xCeI1ArdXM4
[10] Scala Meta: http://scalameta.org/
[11] туториале: http://scalameta.org/tutorial/
[12] Scala.js: https://www.scala-js.org/
[13] Scalatags: http://www.lihaoyi.com/scalatags/
[14] ScalaCSS: https://japgolly.github.io/scalacss/book/
[15] Udash: http://udash.io/
[16] Scala Native: http://www.scala-native.org/
[17] Macroid: http://macroid.github.io/
[18] RoboVM: https://github.com/roboscala/roboscala-samples
[19] ScalaFX: http://www.scalafx.org/
[20] Источник: https://habrahabr.ru/post/316204/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.