308 подписчиков

Dart 3 || 1.1 Краткая история и основные особенности Dart

Dart – объектно-ориентированный язык программирования с сильной статической типизацией и поддержкой обобщенного программирования (шаблоны/дженерики) [1]. Dart не поддерживает множественное наследование, то есть родителем производного класса может выступать только один базовый класс. В тоже самое время, как и в языке программирования Java или C# класс может реализовывать множество интерфейсов. По своему синтаксису Dart очень похож на семейство языков C (Си) – (C++, C#, Java, Kotlin и т. д.).

Dart – молодой язык программирования, который был впервые анонсирован корпорацией Google 10 октября 2011 года. Первая версия языка увидела свет в ноябре 2013 года, далее отметилась версия 2.12 (март 2021), начиная с которой Dart поддерживает null-safety (нулевую безопасность, null-безопасность). В ее основе лежат следующие принципы проектирования [2]:

  • По умолчанию не допускает значения NULL. Если не указывается явно, что переменная может иметь значение NULL. Dart будет выдавать ошибки на этапе компиляции при присваивании такой переменной значения NULL.
  • Использование null-safety позволяет оптимизировать компилятор. Уменьшается не только количество ошибок, связанных с присваиванием NULL, а также объем скомпилированного приложения и повышается скорость его выполнения.

10 мая 2023 года свет увидела третья версия этого языка программирования (в книге используется Dart 3.1) и вызвала бурю негодований, т.к. его разработчики пошли по пути усложнения и помимо прикольных фич, типа: сопоставления шаблонов (pattern matching), switch-выражений, записей (Record) и т.д., расширили количество модификаторов классов. Тем, кто раньше писал на C++, Java, Kotlin это не доставило проблем, но для разработчиков, которые знакомы только с Dart, такая ситуация не сулила ничего хорошего. В итоге, у кого бы не спрашивал из знакомых, все продолжили писать код, как будто этих новых модификаторов и не существует, лишь изредка пользуясь некоторыми из них. А саму ситуацию назвали: «Ад для джуна», так как у более опытных it-шников появился инструмент, посредством которого они могут для стажеров или junior-разработчиков устроить то еще незабываемое собеседование. К тому же, с момента анонса Dart 3, прекратилась поддержка всех версий младше Dart 2.12, то есть Dart стал полностью null-safety.

В момент своего появления на свет, Dart позиционировался Google как язык программирования для замены JavaScript, что и сыграло с ним довольно злую шутку. Несмотря на изначальный интерес сообщества программистов, его не стали повсеместно использовать и чаще всего упоминание об этом языке программирования можно было встретить на форумах при описании pet-проекта. Единственное, что вернуло Dart из того колодца забытия, в который он погружался месяц от месяца – выход первой версии Flutter SDK [3] в конце 2018 года (на момент выхода книги актуальная версия - Flutter 3.13), где Dart занял место основного языка программирования, на котором посредством Flutter ведется разработка. Сам Flutter представляет собой набор инструментов для разработки приложений с графическим пользовательским интерфейсом различной сложности как для мобильных устройств, так для Интернета и настольных компьютеров. Это связано с тем, что разработка ведется в рамках одной кодовой базы для следующих платформ: iOS, Android, macOS, Windows, Linux и Web. К тому же ООО «Открытая мобильная платформа» анонсировала (https://habr.com/ru/articles/761176/) порт Flutter под отечественную мобильную операционную систему «ОС Аврора».

Таким образом, сейчас Dart – оптимизированный для клиентской части язык программирования, позволяющий вести разработку быстрых приложений на любой платформе. При этом он дает возможность использовать динамический тип в сочетании с проверками во время выполнения. Это особенно полезно при быстром прототипировании.

В основе технологии, которая используется в компиляторе Dart и позволяет запускать пользовательский код лежит понятие платформа. Всего выделяется 2 вида платформ (см. рис. 1.1):

  1. Native platform. Данная платформа используется для приложений, разрабатываемых под мобильные устройства и персональные компьютеры с различными типами операционных систем. Сюда входит как виртуальная машина Dart с JIT-компиляцией, так и опережающий компилятор (AOT) для создания машинного кода. Виртуальная машина Dart с JIT-компилятором используется в процессе разработки приложений и предоставляет разработчику возможность горячей перезагрузки приложения (нет необходимости компилировать приложение снова и запускать его), сбор различных метрик в реальном времени и т.д. Когда же приложение готово к развертыванию на целевой платформе или его загрузке в магазин для последующего скачивания пользователем, компилятор Dart AOT обеспечивает опережающую компиляцию в машинный код ARM или x64. Скомпилированный AOT код выполняется внутри среды выполнения Dart, где также присутствует сборщик мусора, в котором применяется подход на основе поколений.
  2. Web platform. Данная платформа используется для приложений, ориентированных на Интернет. В этом случае также используется 2 вида компиляторов Dart. Первый (dartdevc) используется только в процессе разработки, а второй (dart2js) для окончательной сборки приложения перед его развертыванием. Оба этих компилятора переводят пользовательский код, написанный на Dart в JavaScript.
 Dart – объектно-ориентированный язык программирования с сильной статической типизацией и поддержкой обобщенного программирования (шаблоны/дженерики) [1].

Рисунок 1.1 – Структура платформы языка программирования Dart

Dart однопоточный язык программирования, что накладывает ряд ограничений. Да, имеется возможность писать асинхронный код, но «привычного» по другим языкам класса Thread здесь нет. Вместо него используется понятие изолят (Isolate). В отличие от обычного потока Isolat-ы не разделяют общую память, а взаимодействовать между друг другом могут посредством сообщений.

У Dart имеется свой менеджер пакетов – pub, который позволяет устанавливать существующие в хранилище пакеты. В большинстве случаев нет надобности взаимодействовать с ним напрямую. Достаточно просто прописать в виде зависимости проекта пакет, который необходимо установить, в файл «pubspec.yaml».

Обязательным требованием к запускаемому приложению является наличие функции верхнего уровня «main», выступающей в роли точки входа (запуска) для разрабатываемого приложения. При этом, аналогично таким языкам программирования, как: C++, С#, Java т.д., каждая команда в коде завершается символом «;».

Хочешь более скорого выхода актуальной книги по Dart 3? Поддержи автора ;)

https://www.tinkoff.ru/rm/chernyshev.stanislav20/FUUfY1048
https://www.tinkoff.ru/rm/chernyshev.stanislav20/FUUfY1048

Любое копирование текста возможно только с разрешения автора.

© Чернышев Станислав Андреевич