В свое время мы уже рассказывали о преимуществах Flutter. Это фреймворк, который позволяет с легкостью создавать кроссплатформенные мобильные приложения, которые хорошо выглядят и почти не уступают по быстродействию нативной разработке.
Но сегодня мы хотели бы поговорить о Dart — языке программирования, который делает Flutter таким, каким он есть. Кратко и без воды расскажем об особенностях и преимуществах Dart, поделимся опытом работы и полезными для джунов материалами.
Немного контекста
Технически Dart появился в 2011 году в дебрях Google. В те времена СМИ любили писать, что Google намерена «убить» JavaScript, да и сами разработчики Dart любили говорить на презентациях о «фундаментальных недостатках» JS.
Что ж, убить JavaScript не получилось, но сегодня Dart позиционируется как универсальный client-side-язык, который может как работать как с собственной виртуальной машиной на нативных платформах, так и компилироваться в JS.
Это очень удобный язык для мира, где параллельно существует множество платформ: десктоп, мобайл, веб. Веб-разработчики могут легко ее изучить и повторно использовать большую часть кода под разные системы — Android, IOS и MacOS, Windows, Ubuntu.
Сегодня о Dart говорят и как о языке для IoT-устройств, и как о языке для бэкенда, хотя там и без него высока конкуренция.
Принципи Dart
Мы говорим о типизированном C-образном языке программирования, а значит, синтаксис Dart очень похож на JS. Но при этом система типов у Dart не слишком разветвленная и сначала может показаться «бедной».
На самом деле Dart входит в относительно редкую категорию soundness-языков: речь идет здесь не о звуках, а о приоритете здравого смысла в работе с типами, то есть отсутствии внутренних противоречий. К примеру, если у вас есть переменная типа int
, то она гарантированно будет оставаться с типом int
. Это существенное отличие от JS, где типы можно приводить друг к другу.
На официальном сайте Dart эту модель называют sound type system, и приводят следующие преимущества:
- Своевременное выявление связанных с типами багов при компиляции.
- Лучше читаемый код (ведь типы не могут вам «лгать»).
- Удобство поддержки кода — если вы изменяете один фрагмент, система типов может предупредить вас о других фрагментах, которые только что сломались из-за вашей правки.
- Улучшенная AOT-компиляция. Хотя AOT можно производить и без типов, сгенерированный таким образом код будет менее эффективным.
Отдельно можем выделить также реализуемый в Dart null-safety: переменная не может быть нулем, если только разработчик собственными руками не определил обратное.
Dart воспринимается интуитивно и не нуждается в такой разветвленной системе типов, которая есть, например, в TypeScript. Можно воспринимать это как предохранитель, мешающий вам выстрелить себе в ногу 🙂
Как работает Dart
Dart может работать нативно через собственную виртуальную машину DartVM, которая хорошо сочетает преимущества компиляции JIT (Just in time) и AOT (Ahead of time).
JIT — это компиляция кода на лету, тогда как AOT — это работа на опережение с уже скомпилированным кодом.
При разработке на Flutter Dart предоставляет характерную для JIT опцию hot reload, что ускоряет всю работу и помогает отлавливать баги. Но при развертывании продукта он также предоставляет возможности AOT-компиляции (например, под ARM или x64), чтобы конечный продукт был стабильным и работал быстро. При этом Flutter предоставляет в скомпилированный код определенный рантайм, чтобы обеспечить сбор мусора и избежать проблем с типами.
В то же время Dart может с легкостью интерпретироваться и в JavaScript, то есть превращаться в код, который можно открыть в любом браузере. Компиляция под веб происходит по пайплайнам V8 или любому другому движущему устройству.
Такая гибкость в компиляции делает Dart очень универсальным, код с мобайла можно с минимальными изменениями переносить в интернет, и наоборот. Создаваемые таким образом проекты легко поддерживать. При этом скомпилированный у Dart код остается достаточно резвым, лишь немного уступая в нативном быстродействии.
За что мы любим Dart?
- Легкий в изучении. Если у вас есть определенный опыт с JS или Rust, изучение Dart не составит для вас никакой проблемы. Синтаксис будет интуитивно понятен и очевиден. Следовательно, на адаптацию понадобится буквально две-три недели.
- Делает возможным Hot Reload. Это некая магия, полностью меняющая ваш опыт разработки. Ведь вы можете вживую видеть, как изменения в коде влияют на визуал и функционал того, что вы создаете.
- Есть документация и инструменты. Разработчики сделали все, чтобы вам не пришлось проводить шаманские ритуалы и искать ответы в дебрях Stack Overflow и Github. Это не значит, что вы не будете этого делать, но в целом ваши поиски будут безболезненными.
- Доступный. Никакой проприетарности: инструменты для разработки доступны практически на всех десктопных системах — Windows, MacOS, Ubuntu. Почти всюду доступны эмуляторы Android и IOS. Для работы подойдет большинство распространенных IDE — Visual Studio Code или Android Studio.
- Помогает улучшать UI. Ведь речь идет о client-side-языке, нацеленном на работу с визуалом и анимациями. В Dart есть множество функций для борьбы с микролагами и дерганием в работе интерфейсов. Обычно приложения на Flutter работают плавно и выглядят приятно.
Какие сложности возникают из Dart?
К чему должен быть готов разработчик, изучающий Dart или мигрирующий на него? Какие здесь подводные камни? Ничего критического, но о некоторых вещах нужно сказать.
Dart = Flutter
Flutter — это единственный большой фреймворк на Dart, и это проблема. Каким бы удобным и мощным ни был Flutter, это всего один инструмент, и его мало. Dart-комьюнити могло бы развиваться гораздо быстрее, если бы у Flutter появились приспешники и конкуренты, но пока их не видно (если не учитывать Angular Dart, который, к сожалению, не выстрелил).
Экосистема Flutter развивается быстро, но за быстрый рост силами малой команды приходится платить багами.
Однопоточность
Это немаловажная особенность, чем недостаток, но Dart — номинально однопоточная речь. Многопоточные языки в теории позволяют использовать ресурсы железа гораздо эффективнее, но требуют от разработчиков мастерства. Одновременные языки просты и лаконичны, что играет на пользу в циклах разработки.
На самом деле у Dart есть возможности работы с многопоточностью через модель изолятов. Если говорить в двух словах, это облегченные потоки, обладающие обособленной памятью и связанные между собой только в ограниченном формате. Нельзя сказать, что изоляты — это совсем редкая практика, но большинство проектов на Flutter сегодня обходятся без них. Вам ведь не нужны чудеса быстродействия в приложении для заказа пиццы.
Кроссплатформенность
Вы скажете, что это ключевое преимущество Dart, и будете правы. Но множество платформ, на которые ориентируется Flutter, диктуют разработчикам дополнительные требования: им придется получить базовые представления о принципах и особенностях этих платформ. Это самая большая сложность, с которой при переходе на Flutter сталкиваются веб-разработчики.
Где искать информацию и ответы
Итак, вы решили изучить Dart/Flutter, нужно ли вам быстро овладеть его. С чего начать:
- В арто пойти на официальные сайты — Dart.dev и Flutter.dev. Документация закрывает 90% всех вопросов работы в экосистеме.
- Если английский позволяет, то стоит пойти на самые крупные англоязычные веб-ячейки комьюнити — Awesome Flutter и Awesome Dart на Github.
- Можно посетить крупнейшие Discord-сообщества, посвященные Dart и Flutter.
- Украинский чат на тему Dart/Flutter в Telegram — для поиска ответов, вакансий и единомышленников.
Будущее Dart
Flutter стал для нас ключевым инструментом разработки кроссплатформенных мобильных приложений — мы ценим его гибкость, доступность и технологичность.
Стремительное распространение Flutter работает на комьюнити и стимулирует развитие Dart. Поэтому мы верим, что проектов на нем будет становиться все больше — и не только в мобайле, но и в интернете. Уверены: в дальнейшем он может заполучить себе место и в бэкенде, и на десктопных системах.
Этот материал – не редакционный, это – личное мнение его автора. Редакция может не разделять это мнение.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: