Путь к Dart 3: Надежный язык с null-безопасностью

Как подготовиться к следующему крупному выпуску, где Dart поддерживает только sound null safety? Команда мобильной разработки Friflex приводит перевод статьи Майкла Томсона, продуктового менеджера Dart и Flutter, о главных изменениях в Dart 3 и том, как лучше подготовить к ним ваши приложения и пакеты.

Подготовка к новому большому релизу, в котором Dart будет поддерживать только sound null safety

За последние четыре года Dart превратился в быстрый, компактный и современный язык. Следующий релиз, Dart 3, завершает путь становления языка с полной поддержкой sound null safety. Последний шаг в этом пути – удаление артефактов SDK и языка Dart, включая прекращение поддержки работы без sound null safety. Это делает Dart проще для изучения и позволяет Dart SDK развиваться и поддерживать новые функции с большей скоростью.

Почему sound null safety?

Многие современные языки программирование поддерживают null safety (null-безопасность, также известную как void safety). Она позволяет избежать проблем при использовании null-элементов, которые Тони Хоар описал в ошибке на миллиард долларов: «Это привело к бессчетным ошибкам, уязвимостям и системным сбоям, которые скорее всего нанесли урона на миллиарды долларов за последние сорок лет» (Hoare 2009).‎ Чтобы это решить, такие языки как Swift, C# и Kotlin поддерживают систему типов, где можно указать переменные либо как non-null (ненулевые, они не могут принимать нулевое значение), или nullable (могут принимать нулевое и ненулевое значения). Эта система типов может быть совмещена со статистическим анализом для выявления любых присвоений нуля ненулевым переменным. Поддержка null-безопасности в языке Dart использует похожую модель, которая присваивает переменным тип non-null по умолчанию, и позволяет нулевое значение только когда оно открыто присвоено.

Сделав шаг вперед, Dart вводит в существующий язык sound null safety. Система гарантирует, что ненулевая переменная никогда не будет содержать нулевое значение. Во время раннего планирования null-безопасности Dart, этот вопрос изучался, как и компромиссы, на которые пошли другие языки. Дизайн Swift с самого начала включал в себя надежность.TypeScript по определению ненадежен, так как его базовая система типов позволяет рассматривать любой объект как любой статический тип. Как можно наблюдать в этом примере TypeScript, в нем можно назначить нулевое значение ненулевой переменной. Как по соображениям эргономики, так и во избежание переноса всего существующего кода в C# есть несколько исключений в проверке нулевых значений. У Kotlin есть несколько необоснованных исключений, отчасти из-за его взаимодействия с Java. Как можно видеть в этом примере Kotlin, универсальные типы могут вызывать случаи, когда нулевые значения могут попасть в список, объявленный как содержащий ненулевые элементы.

Для Dart был выбран путь sound null safety. Это включало компромисс. В некоторых случаях это сделало переход на null safety чуть более затратным, но привело к созданию надежной системы типов с полным доверием к аннотациям ненулевых типов. Можно оптимизировать реализацию в наших компиляторах и средах выполнения, основываясь на аспекте обнуляемости системы типов. Мы точно знаем, когда переменная не равна null. Мы думаем, что это был правильный набор компромиссов для Dart.

В Dart 3, весь код Dart будет использовать sound null safety

Проблема отслеживания: SDK #49530.

Прошло больше года с тех пор, как в язык Dart ввели null safety в Dart 2.12. Как упоминалось в предыдущем разделе, мы признаем влияние, необходимое для переноса существующих пакетов и приложений Dart. Чтобы облегчить переход, Dart поддерживает запуск кода вашего приложения тремя способами. Он может работать без null safety, в смешанном режиме с частичной null safety или с полной sound null safety. Полная sound null safety возникает, когда 100% кода, включая все зависимости, перенесены. Это дало разработчикам Dart время для поэтапного переноса существующего кода. Однако поддержка нескольких режимов добавила накладных расходов и сложности.

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

Во-вторых, поддержка всех трех режимов в наших компиляторах и средах выполнения замедляет развитие Dart SDK. Эта поддержка увеличивает стоимость и сложность добавления новых функций.

В Dart 3, sound null safety будет, как было упомянуто и анонсировано ранее, единственным поддерживаемым режимом. Файлы Pubspec с ограничением SDK, имеющим нижнюю границу менее 2,12, перестанут работать в Dart 3 и более поздних версиях. Любой исходный код, содержащий языковые маркеры, не будет работать, если вы установите ограничение менее 2,12 (например, // @dart=2.9).

Исходя из нашей телеметрии, предполагается, что около 85% всех запусков flutter runа в настоящее время используют sound null safety. Если у вас есть приложения или пакеты из оставшихся 15%, выполните переход до того, как выйдет Dart 3 — релиз ожидается примерно в середине 2023 года.

Перенос больших кодовых баз может занять некоторое время. Мы уверены, что вы сочтете миграцию, стоящей потраченных усилий. BMW недавно перенесла свое основное масштабное приложение MyBMW, созданное командой из 300 разработчиков.

«Хотя переход на нулевую безопасность, безусловно, был непростым для такой крупномасштабной кодовой базы, как приложение MyBMW, инструменты Google оказали нам большую помощь в процессе миграции. После завершения перехода нам нравится иметь менее подверженную ошибкам кодовую базу», Кристиан Шмид, BMW AG

Чтобы узнать больше о миграции, посмотрите видео или ознакомьтесь с руководством по миграции.

Критические изменения языка и API

Наряду с изменение нулевой безопасности мы вносим несколько других изменений, чтобы удалить артефакты в языках Dart и основных библиотек API. Эти изменения включают в себя удаление устаревших API основной библиотеки (#49529), удаление устаревшего синтаксиса для значений параметров по умолчанию (#2357) и требование явного выделения (#2399).

Мы считаем, что эти изменения мало повлияют на код, перенесенный для использования null safety. Когда будет выпущена первая альфа-версия Dart 3, вы сможете быстро проверить, применимы ли какие-либо из этих небольших критических изменений к вашим пакетам или приложениям.

Новые функции и возможности Dart 3

Также ожидается, что Dart 3 будет содержать ряд новых возможностей, в том числе улучшенную совместимость с другими языками программирования и новые языковые функции. Об этом, в том числе пойдет речь на Flutter Forward, 25 января 2023 года.

Давайте вкратце рассмотрим одну языковую функцию, называемую patterns (шаблоны). Шаблоны делают язык Dart намного более выразительным, добавляют поддержку более структурированных данных и обеспечивают более функциональный стиль с алгебраическими типами данных.

В коде ниже показан пример использования нескольких возвращаемых значений функции в сочетании с возможностью деструктурировать их в отдельные переменные:

// A function which returns a record -- in this case a pair of two doubles: (double x, double y) getLocation(String name) { if (name == 'Aarhus') { return (56.1629, 10.2039); } else { ... } } // Deconstructing the returned record back into individual variables: void main(List<String> arguments) { final (lat, long) = getLocation('Aarhus'); print('Current location: $lat, $long'); } // You can also define a hierarchy of classes, and then pattern match on those: sealed class Shape { double calculateArea(); } class Square implements Shape { final double length; Square(this.length); double calculateArea() => length * length; } class Circle implements Shape { final double radius; ... } double calculateArea(Shape shape) => switch (shape) { Square(length: var l) => l * l, Circle(radius: var r) => math.pi * r * r };

Чтобы увидеть все в предварительном просмотре, вы можете посмотреть спецификацию языка.

За пределами Dart 3

Мы параллельно работаем над множеством потенциальных новых функций, переходя от идеи к экспериментированию и потенциальному запуску. Как следствие, некоторые текущие работы будут завершены после Dart 3.

Во-первых, как упоминалось в прошлом году, ведется работа над поддержкой компиляции кода Dart в WebAssembly (Wasm). Wasm позволяет запускать веб-приложения Flutter как полный нативный код в браузерах. Это крупное начинание, требующее работы помимо обновления компиляторов Dart. Это требует сотрудничества с W3C и поставщиками браузеров для добавления поддержки языков со сборкой мусора в Wasm через расширение WasmGC.

Во-вторых, ведется работа над макросами. Они делают возможным статическое метапрограммирование. Этот мощный механизм позволяет фрагменту кода (макросу) изменять и расширять исходный код программы во время компиляции программы. Например, это может уменьшить количество шаблонов, необходимых для десериализации JSON или создания классов данных.

Эти и другие функции будут внесены после релиза Dart 3.

Путь к Dart 3

Если вы еще не перешли sound null safety, это первый шаг. Рекомендуем сделать его прямо сейчас!

Затем Dart 3 будет запущен в несколько этапов. Наши текущие ожидания связаны с этими датами:

  • В январе/феврале 2023: выпуск альфа-версии Dart 3. Она ориентирована на раннее тестирование совместимости с Dart 3. Предполагается, что вы сможете запустить статический анализ (dart analyze / flutter analyze). Наша цель состоит в том, чтобы любое приложение или пакет, прошедшие статический анализ с помощью альфа-версии Dart 3, поддерживали стабильную версию Dart 3.
  • В марте/апреле 2023: выпуск бета-версии Dart 3. В этом выпуске будут представлены новые функции Dart 3. Вы можете использовать его, чтобы поэкспериментировать с новыми функциями и оставить отзыв о проблемах или предложениях по улучшению.
  • В середине 2023: выпуск стабильной версии Dart 3. Sound null safety становится единственным поддерживаемым режимом.

Выпуск Dart 3 запланирован на середину 2023 года. Он будет содержать несколько критических изменений, в первую очередь прекращение работы без sound null safety. Примерно в январе или феврале 2023 года будет готова альфа-версия Dart 3, которую вы сможете использовать для тестирования совместимости с Dart 3.

Чтобы подготовить ваши приложения:

  • Завершите все незавершенные миграции с нулевой безопасностью
  • Убедитесь, что ваш код не использует устаревшие API
  • Запустите dart fix.

Dart 3 также будет содержать несколько новых мощных функций, таких как шаблоны. Весной ожидается выход бета-версия Dart 3, которая продемонстрирует все новые функции.

0
3 комментария
Yura Petrov

Язык очень быстро развивается)

Ответить
Развернуть ветку
Igor S

Годно.

Ответить
Развернуть ветку
Ali Blogger

Приступил к изучению именно этого языка. Это будет мой первый язык.

Ответить
Развернуть ветку
0 комментариев
Раскрывать всегда