Dotty — это новый компилятор Scala, который будет использоваться в версии 2.13 Scala. Он основан на DOT по своей внутренней структуре. Исчисление, используемое в Dotty, такое же, как и в DOT. Dotty — более быстрый компилятор, чем компилятор Scala, используемый в Scala 2. В этом блоге я буду обсуждать преимущества dotty, его архитектуру и функции, которые были исключены из этого нового компилятора.

Преимущества Dotty по сравнению с текущим компилятором scala:

- Это чуть больше половины текущего компилятора scala.

– Это в два раза быстрее, чем текущий компилятор scala.

Дотти Архитектура

В этом исходники scala служат входом в точечный интерфейс. Интерфейс Dotty выдает AST в качестве вывода. AST — это абстрактное синтаксическое дерево, которое формируется после проверки типов. Затем Дотти выполняет некоторые преобразования перед созданием окончательного AST. Этот упрощенный AST очень похож на java-программу и сделан так, что обход дерева происходит гораздо реже. Это дополняет причину, по которой Дотти работает быстрее. Затем окончательный AST передается в GenBCode, который генерирует байт-код для создания файлов классов. GenBCode использует стандартную структуру когенерации Gen ASM для байт-кодов Java. Кроме того, есть формат pickled, который по существу отделяет компиляцию, у которой на самом деле нет имени. Он берет эти сериализованные таблицы символов и использует их, когда вашей программе нужно скомпилироваться в другом блоке компиляции. Кроме того, существует гораздо более богатый формат, называемый TASTYтипом AST. Это позволяет нам оптимизировать всю программу, и все переводится во ВКУСНОЕ, и над ним выполняются точечные преобразования.

Отброшенные функции в Dotty

Поскольку Dotty — это новый компилятор, который будет использовать Scala 3, участники проекта позаботились об удалении ненужных функций. Некоторые из удаленных функций подробно описаны ниже:

1. Синтаксис процедуры

теперь заменен на

def f () = { … } def f (): Unit = { … }

Синтаксис процедур нельзя использовать в Scala 2.13.

2. Ранний инициализатор

abstract class X { val name: String val size = name.size } class Y extends { val name = "class Y" } with X

Если код был написан вместо этого как

class Z extends X { val name = "class Z" }

тогда при инициализации Z возникнет исключение нулевого указателя, потому что размер инициализируется перед именем в обычном порядке инициализации (суперкласс перед классом).

3. Макросы

Макросы — это функции, вызываемые компилятором во время компиляции. Макросы имеют доступ к API уровня компилятора. Эти микрометры теперь были удалены. Теперь Dotty предоставляет встроенные и метаданные, которые можно использовать вместо макросов.

4. Экзистенциальные типы

Экзистенциальные типы — это способ абстрагироваться от типов. Они позволяют вам подтвердить наличие задействованного типа без точного указания, что это такое, обычно потому, что вы не знаете, что это такое, и вам не нужны эти знания в текущем контексте. Для получения дополнительной информации см. Экзистенциальные типы в Scala. Экзистенциальный тип, использующий forSome, теперь исключен из текущего компилятора Dotty, поскольку он нарушает принцип надежности типов, на котором построены DOT и Dotty. Этот принцип гласит, что каждый префикс (p, соответственно S) выбора типа p. T или S#T должны либо исходить из значения, созданного во время выполнения, либо ссылаться на тип, который, как известно, имеет только хорошие границы.

6. Проекция типа

До сих пор Scala допускала проекцию общего типа T#A, где T — произвольный тип, а A называет член типа T.

Dotty запрещает это, если T является абстрактным типом (допустимы типы классов и псевдонимы типов). Это изменение было внесено из-за того, что неограниченная проекция шрифта нецелесообразна.

В этом блоге я кратко рассказал о Дотти. Для получения дополнительной информации обратитесь к Dotty docs и Keynote: Scala’s Road Ahead by Martin Odersky. В следующем блоге я расскажу о новых функциях, представленных Dotty.

Ссылки

Первоначально опубликовано на сайте blog.knoldus.com 29 ноября 2018 г.