«Убить JavaScript не получилось»: за что мы любим Dart — язык создания приложений на Flutter (и кому он подходит)

Сергій Гузенко

В свое время мы уже рассказывали о преимуществах 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, и приводят следующие преимущества:

  1. Своевременное выявление связанных с типами багов при компиляции.
  2. Лучше читаемый код (ведь типы не могут вам «лгать»).
  3. Удобство поддержки кода — если вы изменяете один фрагмент, система типов может предупредить вас о других фрагментах, которые только что сломались из-за вашей правки.
  4. Улучшенная 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, нужно ли вам быстро овладеть его. С чего начать:

  1. В арто пойти на официальные сайты — Dart.dev и Flutter.dev. Документация закрывает 90% всех вопросов работы в экосистеме.
  2. Если английский позволяет, то стоит пойти на самые крупные англоязычные веб-ячейки комьюнити — Awesome Flutter и Awesome Dart на Github.
  3. Можно посетить крупнейшие Discord-сообщества, посвященные Dart и Flutter.
  4. Украинский чат на тему Dart/Flutter в Telegram — для поиска ответов, вакансий и единомышленников.

Будущее Dart

Flutter стал для нас ключевым инструментом разработки кроссплатформенных мобильных приложений — мы ценим его гибкость, доступность и технологичность.

Стремительное распространение Flutter работает на комьюнити и стимулирует развитие Dart. Поэтому мы верим, что проектов на нем будет становиться все больше — и не только в мобайле, но и в интернете. Уверены: в дальнейшем он может заполучить себе место и в бэкенде, и на десктопных системах. 

If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.

Останні статті

Токсичные коллеги. Как не стать одним из них и прекратить ныть

В благословенные офисные времена, когда не было большой войны и коронавируса, люди гораздо больше общались…

07.12.2023

Делать что-то впервые всегда очень трудно. Две истории о начале карьеры PM

Вот две истории из собственного опыта, с тех пор, когда только начинал делать свою карьеру…

04.12.2023

«Тыжпрограммист». Как люди не из ІТ-отрасли обесценивают профессию

«Ты же программист». За свою жизнь я много раз слышал эту фразу. От всех. Кто…

15.11.2023

Почему чат GitHub Copilot лучше для разработчиков, чем ChatGPT

Отличные новости! Если вы пропустили, GitHub Copilot — это уже не отдельный продукт, а набор…

13.11.2023

Как мы используем ИИ и Low-Code технологии для разработки IT-продукта

Несколько месяцев назад мы с командой Promodo (агентство инвестировало в продукт более $100 000) запустили…

07.11.2023

Университет или курсы. Что лучше для получения IT-образования

Пару дней назад прочитал сообщение о том, что хорошие курсы могут стать альтернативой классическому образованию.…

19.10.2023