- PVSM.RU - https://www.pvsm.ru -

Анонсирован Dart 2.2: более оптимальный машинный код, поддержка Set литералов

Источник [Announcing Dart 2.2: Faster native code, support for set literals] [1]

Сегодня (26 февраля 2019) мы объявляем о выпуске Dart 2.2 SDK — обновления для Dart 2, которое предлагает улучшенную производительность ahead-of-time (AOT) [2] кода и поддержку Set литералов.

image

Повышение производительности Dart для разработки на Flutter

Мы продолжаем нашу работу, чтобы сделать AOT-скомпилированный код [3], вроде Flutter приложений, еще быстрее. В Dart 2.1 мы сократили издержки [4] на проверку типов, значительно снизив стоимость проверки типов как для кода, скомпилированного AOT, так и для кода, выполняемого на виртуальной машине с JIT (just-in-time) компиляцией.

В Dart 2.2 мы сосредоточились на производительности AOT-скомпилированного кода, улучшив производительность на 11-16% на микробенчмарках [5] (за счет увеличения размера кода на ~1%). Это улучшение является результатом работы в течение нескольких кварталов, с целью уменьшить издержки статических вызовов. Наш оптимизированный AOT код теперь может вызывать запрошенный объект напрямую с помощью вызова PC (то есть с помощью Program counter [6]). До этого мы должны были провести несколько раз поиск в пуле объектов для определения необходимого адреса. Эти оптимизации особенно полезны, когда код содержит множество конструкторов и статических вызовов методов, таких как код пользовательского интерфейса Flutter, который содержит множество виджетов.

Поддержка Set литералов в Dart 2.2

Основная библиотека Dart (dart:core) содержит несколько классов коллекций: Maps [7], Lists [8], и Sets [9]. Maps представляют собой наборы пар ключ-значение. Lists являются упорядоченными последовательностями значений, к каждому из которых может быть получен доступ с помощью индекса и которые могут встречаться несколько раз. Sets — это неупорядоченные коллекции значений, в которых каждое значение может встречаться только один раз и где можно эффективно проверить, есть ли значение в коллекции.

Коллекции Dart обычно инициализируются compile-time константами, и Dart предлагает удобный синтаксис для написания этой инициализации. В Dart List можно инициализировать следующим образом:

const List<String> releases = ['Dart 2.0', 'Dart 2.1', 'Dart 2.2'];

Ранее Dart поддерживал литеральный синтаксис только для List и Map, поэтому инициализация Set была громоздкой, так как нам приходилось инициализировать через список:

Set<String> currencies = Set.of(['EUR', 'USD', 'JPY']);

Этот код не просто неудобен и неэффективен; отсутствие поддержки литералов не позволяет создать неизменяемый Set во время компиляции. С добавлением поддержки Set литералов в Dart 2.2 инициализировать множество и сделать его неизменяемым, используя удобный новый синтаксис:

const Set<String> currencies = {'EUR', 'USD', 'JPY'};

Реальные примеры использования Set литералов командой Flutter можно посмотреть здесь [10]. Для более подробного углубления в вопрос предлагаем ознакомиться с обновленным Dart 2.2 language tour [11].

Обеспечение нововведений с помощью Dart 2 Common Front-End (CFE)

Dart предлагает несколько своих реализаций: Dart VM, используемая Flutter, dart2js компилятор и Dart dev компилятор (dartdevc), — все они используют Common Front-End компилятор. Dart Common Front End, или CFE, парсит код Dart, выполняет вывод типов и транслирует Dart на промежуточный язык более низкого уровня, который back end компиляторы принимают в качестве входа.

Set литералы — пример языковой конструкции, которые мы смогли быстро реализовать благодаря CFE. Код для парсинга Set литералов и выполнение вывода типов были реализованы один раз с помощью CFE для всех реализаций. Кроме того, мы создали переходную реализацию, которая могла бы использоваться back end компиляторами на начальном этапе. В промежуточной реализации изменяемая версия указанных Set литералов переводилась в ходе компиляции в эквивалентную форму:

Set<String> currencies = Set<String>()..add('EUR')..add('USD')..add('JPY');

Промежуточная реализация константных Set литералов отличается тем, что не могут быть собраны постепенно по частям. Вместо этого мы реализовали это в терминах приватного неизменяемого Set класса, который оборачивает неизменяемый Map, где элементы Set являются ключами Map:

const Set<String> currencies =
   _UnmodifiableSet<String>({'EUR': null, 'USD': null, 'JPY': null});

Неизменяемый Set класс реализует методы в интерфейсе Set, делегируя их во внутренний Map.

В целом, мы смогли реализовать Set литералы изначально как функцию исключительно CFE. Back end мог сразу использовать реализацию CFE, и реализовать свою собственную поддержку позднее. Это позволило back end компиляторам отложить свою поддержку до тех пор, пока аспекты производительности этой функции не стали поняты лучше.

Спецификация Dart 2.2

Dart 2 был настолько существенным обновлением Dart [12], что нам потребовалось некоторое время, чтобы обновить официальную спецификацию языка [13], чтобы соответствовать всем изменениям, которые мы сделали. Мы, наконец, завершили эту работу, и спецификация обновлена до версии Dart 2.2. Мы также переместили спецификацию языка в новый репозиторий [14] и добавили непрерывную интеграцию, чтобы обеспечить постоянное обновление спецификации в формате PDF по мере развития будущих версий языка Dart. И 2.2, и будущие Dart 2.x спецификации доступны на странице спецификации Dart [13].

Как установить Dart 2.2

Dart SDK 2.2 [15] доступен на домашней странице Dart с сегодняшнего дня. Если вы Flutter разработчик, Dart 2.2 уже включен. (Примечание: на консольную команду «flutter doctor» текущие каналы Flutter master и dev сообщат о Dart 2.2. Сегодняшняя стабильная версия Flutter 1.2 [16] выведет Dart 2.1.2; данная версия имеет те же возможности, что и Dart 2.2).

На данный момент это все. Мы надеемся, что вам понравится Dart 2.2!


Огромное спасибо за помощь в переводе PsyHaSTe [17]

Автор: Кирилл Матросов

Источник [18]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/dart/310173

Ссылки в тексте:

[1] Источник [Announcing Dart 2.2: Faster native code, support for set literals]: https://medium.com/dartlang/announcing-dart-2-2-faster-native-code-support-for-set-literals-7e2ab19cc86d

[2] ahead-of-time (AOT): https://en.wikipedia.org/wiki/Ahead-of-time_compilation

[3] AOT-скомпилированный код: https://hackernoon.com/why-flutter-uses-dart-dd635a054ebf

[4] мы сократили издержки: https://medium.com/dartlang/announcing-dart-2-1-improved-performance-usability-9f55fca6f31a

[5] на 11-16% на микробенчмарках: https://github.com/flutter/flutter/pull/27789#issuecomment-464234710

[6] Program counter: https://en.wikipedia.org/wiki/Program_counter

[7] Maps: https://api.dartlang.org/stable/2.2.0/dart-core/Map-class.html

[8] Lists: https://api.dartlang.org/stable/2.2.0/dart-core/List-class.html

[9] Sets: https://api.dartlang.org/stable/2.2.0/dart-core/Set-class.html

[10] здесь: https://github.com/flutter/flutter/pull/27811

[11] обновленным Dart 2.2 language tour: https://www.dartlang.org/guides/language/language-tour#sets

[12] Dart 2 был настолько существенным обновлением Dart: https://medium.com/dartlang/dart-2-stable-and-the-dart-web-platform-3775d5f8eac7

[13] официальную спецификацию языка: https://www.dartlang.org/guides/language/spec

[14] новый репозиторий: https://github.com/dart-lang/language/tree/master/specification

[15] Dart SDK 2.2: https://www.dartlang.org/tools/sdk/archive

[16] Сегодняшняя стабильная версия Flutter 1.2: https://developers.googleblog.com/2019/02/launching-flutter-12-at-mobile-world.html

[17] PsyHaSTe: https://habr.com/ru/users/psyhaste/

[18] Источник: https://habr.com/ru/post/442014/?utm_source=habrahabr&utm_medium=rss&utm_campaign=442014