Сегодня мы анонсируем Dart 2, перезагрузку языка, которая более полно отражает наше видение Dart как уникально оптимизированного языка для клиентской разработки на Web и мобильных платформах.

Dash - официальный маскот языка
Dash — официальный маскот языка

С Dart 2 мы значительно усилили и упростили систему типов, очистили синтаксис и переписали большую часть инструментария с нуля, чтобы сделать мобильную и веб-разработку более приятной и продуктивной. Dart 2 также учитывает уроки, полученные от ранних пользователей языка, включая Flutter, AdWords и AdSense, а также тысячи улучшений, больших и малых, сделанных в ответ на отзывы клиентов.

Основные принципы Dart


Прежде чем говорить о нововведениях в Dart 2, стоит понять, почему мы считаем, что Dart удовлетворяет всем потребностям разработчиков клиентского кода.

В дополнение к свойствам, необходимым для современного языка общего назначения, язык для клиентской разработки должен быть:

  • Продуктивным. Синтаксис должен быть четким и кратким, инструментарий — простым, а цикл разработки — почти мгновенным
  • Быстрым. Производительность запуска и выполнения должны быть отличными и предсказуемыми даже на медленных мобильных устройствах.
  • Портируемым. Разработчики клиентских приложений должны сегодня думать о трех платформах: iOS, Android и Web. Язык должен хорошо работать на всех из них.
  • Доступным. Язык не может уходить слишком далеко от знакомых вещей, если он хочет оставаться понятным миллионам разработчиков.
  • Реактивным. Язык должен поддерживать реактивный стиль программирования.

Dart используется для создания критически важных высококачественных приложений в Web, iOS и Android в Google и других компаниях и ??отлично подходит для мобильной и веб-разработки:

  • Dart увеличивает скорость разработки, поскольку он имеет четкий, лаконичный синтаксис и может работать на виртуальной машине с JIT-компилятором. Это позволяет поддерживать горячую перезагрузку в процессе мобильной разработки, что приводит к супер быстрым циклам разработки, где вы можете редактировать, компилировать и заменять код в уже запущенном приложении на устройстве.
  • Благодаря своей способности эффективно компилировать исходный код заранее, Dart обеспечивает предсказуемую и высокую производительность, а также быстрый запуск на мобильных устройствах.
  • Dart поддерживает компиляцию в нативный код (ARM, x86 и т.д.) для быстрой работы на мобильных устройствах, а также транспиляцию в эффективный JavaScript код для Web.
  • Dart понятен для большинства разработчиков благодаря своим объектно-ориентированным аспектам и синтаксису, которые, по словам наших пользователей, позволяют C++, C#, Objective-C или Java разработчикам писать код на Dart буквально через несколько дней.
  • Dart с его SDK хорошо подходит для реактивного программирования, он включает потоки и фьючерсы; также обладает хорошей поддержкой управления короткоживущими объектами с помощью быстрого сборщика мусора.

Dart 2: улучшение клиентской поддержки


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

Строгая типизация


Команды, стоящие за AdWords и AdSense, с помощью Dart создали одни из самых крупных и самых передовых веб-приложений Google для управления рекламой, эти сервисы приносят значительную долю дохода Google. Работая в тесном контакте с этими командами, мы решили усилить систему типов Dart. Это поможет Dart-программистам ловить ошибки в процессе разработки, лучше масштабировать приложения, созданные крупными командами, и повышать общее качество кода.

Конечно, в этом нет ничего уникального. В экосистеме Web также наблюдается тенденция к добавлению типов к JavaScript. Например, TypeScript и Flow расширяют JavaScript аннотациями и выводом типов, чтобы улучшить возможности для анализа кода.

В небольшом примере ниже, Dart 2 позволяет выявить неявную ошибку и, как результат, помогает улучшить общее качество кода.

void main() {
  List<int> prices = ['99', '27', '10000', '20000000'];
  
  // Отсортировать цены от низких к высоким
  prices.sort();
  
  print('Самая низкая цена: ${prices[0]}!');
}

Что делает этот код? Вы можете ожидать, что он напечатает «27». Но без системы типов Dart 2 он печатал «10000», потому что это самый первый элемент в списке строк, упорядоченных лексикографически. Однако с Dart 2 этот код выдаст ошибку типизации.

Пользовательский интерфейс через код


При создании пользовательского интерфейса необходимость переключаться между отдельным языком разметки и языком программирования, который вы используете в приложении, часто вызывает раздражение. Мы стремимся уменьшить необходимость переключения контекста. Dart 2 вводит необязательные new и const. Этот функционал очень ценен сам по себе, а также открывает другие возможности. Например, благодаря необязательным new и const мы можем сделать определение виджета более чистым и простым.

// До Dart 2
Widget build(BuildContext context) {
  return new Container(
    height: 56.0,
    padding: const EdgeInsets.symmetric(horizontal: 8.0),
    decoration: new BoxDecoration(color: Colors.blue[500]),
    child: new Row(
      ...
    ),
  );
}

// После Dart 2
Widget build(BuildContext context) =>
  Container(
    height: 56.0,
    padding: EdgeInsets.symmetric(horizontal: 8.0),
    decoration: BoxDecoration(color: Colors.blue[500]),
    child: Row(
      ...
    ),
  );

Использование Dart на стороне клиента


Мобильные платформы


Одним из самых важных применений Dart является Flutter, новая мобильная платформа Google для создания пользовательских интерфейсов для iOS и Android. Официальное приложение для чрезвычайно популярного шоу Hamilton: The Musical — пример того, как Flutter помогает разработчикам создавать приложения в рекордные сроки. Flutter использует реактивный стиль программирования и контролирует пользовательский интерфейс пиксель за пикселем. Для Flutter, Dart подходит идеально, с точки зрения простоты обучения, реактивного программирования, высокой скорости разработки и высокопроизводительной системы исполнения с быстрым сборщиком мусора.

Web


Dart отлично проявил себя как платформа для критически-важных веб-приложений. В нем есть веб-библиотеки, такие как dart:html, а также полная веб-среда на основе Dart. Команды, использующие Dart для Web, были в восторге от улучшения скорости разработки. Как говорит Маниш Гупта, вице-президент по разработке Google AdWords:
Интерфейс AdWords большой и сложный, и он имеет решающее значение для доходов Google.
Мы выбрали Dart из-за отличной комбинации продуктивности и предсказуемости, простоты обучения, системы типов и поддержки в Web и мобильных устройствах.
Наши инженеры в два-три раза более продуктивны, чем раньше, и мы рады, что мы перешли на Dart.

Что дальше


С Flutter и Dart разработчики наконец-то получили возможность писать качественные приложения для Android, iOS и Web без каких-либо компромиссов, используя общую кодовую базу. В результате члены команды могут плавно перемещаться между платформами и помогать друг другу, например, проверять код. Такие команды, как AdWords Express и AppTree, переиспользуют от 50% до 70% своего кода на мобильных устройствах и в Web.

Dart — проект с открытым исходным кодом, поддерживает открытый стандарт ECMA. Мы приветствуем вклад как в основной проект Dart, так и в растущую экосистему пакетов для Dart.

Вы можете попробовать Dart 2 во Flutter и Dart SDK прямо из командной строки. Для Dart SDK, загрузите Dart 2 из dev канала и запустите свой код с флагом --preview-dart-2. Мы также приглашаем вас присоединиться к нашему сообществу на gitter.

Благодаря объявленным сегодня улучшениям, Dart 2 — производительный, чистый и проверенный в деле язык, который решает проблемы разработки современных приложений. Его уже любят некоторые из самых требовательных разработчиков на планете, и мы надеемся, что он понравится и вам.

Примечание переводчика: присоединяйтесь к рускоязычному сообществу Dart в Telegram или Slack.

Комментарии (24)


  1. justboris
    24.02.2018 14:46
    +1

    За воодушевляющим началом


    С Dart 2 мы значительно усилили и упростили систему типов, очистили синтаксис и переписали большую часть инструментария с нуля

    Следует только описание необязательных new и const. Неужели не нашлось большего числа интересных фич, достойных упоминания?


    1. bunopus Автор
      24.02.2018 15:02

      Я так думаю Anders не хотел раздувать анонс, потому что про ту же систему типов можно написать очень много


      1. justboris
        24.02.2018 15:15
        +1

        В результате получился анонс, от которого останется только пара предложений, если выжать всю воду.


        Ну, ждем следующих постов с более подробным обзором фич второй версии.


    1. mraleph
      24.02.2018 16:24

      В Dart 2 состоит из следующих компонентов:


      • серьезно переработанная система типов (strong mode, которая включает в себя generic methods, локальный вывод типов, изменения в семантике dynamic и void);
      • int больше не является целым числом произвольного размера (aka bigint), а ограничен 64-битами;
      • мелкие изменения в языке (optional new/const, async functions start synchronously);
      • большое число новых методов в core библиотеках (см CHANGELOG.md);
      • важное инфраструктурное изменение: введение Общего Фронтенда и Kernel, унифицированного формата представления и сериализации Dart AST — все тулы будут использовать один и тот же парсер Dart написанный на Dartе, даже VM.


      1. justboris
        24.02.2018 19:59

        Спасибо! С таким списком намного понятнее.


  1. handicraftsman
    24.02.2018 15:01

    1. Когда запилят eval? Ведь существуют не только мобильные приложения и фротенды. Так, из-за этого отсутствует вменяемый repl в Dart SDK.
    2. Добавят ли возможность ждать завершения выполнения async кода в sync функциях? Особенно полезно в небольших CLI утилитах.
    3. В stagehand не хватает шаблона бекенд+фронтенд, который идеально подходит для небольших приложений.

    Это всё, чего мне не хватает в Dart.


    1. chromimon
      24.02.2018 15:24

      eval как раз выпиливают усиленно из за проблем с безопасностью и с невозможностью автоматизации проверок


      1. handicraftsman
        24.02.2018 16:06

        Но ведь можно оставить только в Dart VM. Тогда шанс инъекции будет ниже. А если добавить bind (как в sqlite) или setcontext (как в lua), то проблем с безопасностью станет ещё меньше


    1. bunopus Автор
      24.02.2018 15:26

      Возможно mraleph лучше ответит


    1. mraleph
      24.02.2018 16:11

      Когда запилят eval? Ведь существуют не только мобильные приложения и фротенды. Так, из-за этого отсутствует вменяемый repl в Dart SDK.

      eval можно через service протокол делать. Есть сторонние прототипы replов на основе этого.


      Добавят ли возможность ждать завершения выполнения async кода в sync функциях?

      По нормальному это добавлять тяжко (по разным техническим причинам), но в 2.0 добавили dart:cli с методом waitFor, который синхронно ждет завершения Future. Я думаю после 2.0 будем смотреть на "многопоточность" и асинхронность в целом более пристально, потому что людям хочется чего-то более вменяемого особенно за пределами браузера.


      В stagehand не хватает шаблона бекенд+фронтенд

      Можно в stagehand репе сделать баг на эту тему или там нарисовать PR :)


  1. vintage
    24.02.2018 15:08
    +1

    Однако с Dart 2 этот код выдаст ошибку типизации.

    С чего бы вдруг?


    PS: А, поэтому? List<int> Тогда чего это в первой версии ошибки не было?


    1. mraleph
      24.02.2018 16:31
      +1

      В Dart 1 ["1", "2"] имеет тип List<dynamic>, а List<dynamic> является подтипом List<int>. Это было сделано, чтобы можно было легко смешивать полностью динамический и типизированный код. dynamic был одновременно и top и bottom решетки типов, т.е. в коде внизу оба присваивания были валидны и в runtime и в compile time


      List<dynamic> a;
      List<int> b;
      
      a = <int>[]; 
      b = <dynamic>[];  


      1. vintage
        24.02.2018 18:52
        +1

        Очень странное решение. Похоже всем разработчикам языков нужно сначала набить шишки на ковариантности, чтобы её понять и потом прикручивать костыли, чтобы сильно не менять дизайн языка :-)


        1. mraleph
          24.02.2018 21:29
          +1

          Решение становится гораздо менее странным, если воспринимать Dart 1, как динамически типизированный язык. Допустим приехал вам JSON [1, 2, 3], вообще-то он List<dynamic>, но вы допустим как-то знаете, что он на самом-то деле List<int>. В Dart 1 вы его спокойно можете передать куда-нибудь, где ожидают List<int>. В Dart 2 вам его сначала надо бы преобразовать, например через list.cast<int>()


          1. vintage
            24.02.2018 22:57

            Тут не касты с динамиками нужны, а рантайм валидация. Зачем делать статически типизированный язык и потом "представлять, что он динамический"? У нас уже есть динамический JS.


            1. mraleph
              25.02.2018 00:23

              Вот в том-то и дело, что Dart 1 никогда и не был задизайнен, как статически типизированный язык. Все странности языка перестают быть странностями, если это знать и воспринимать его именно таким образом.


      1. dimka11
        24.02.2018 21:13

        Что имеется в виду под "решетка типов"?


        1. mraleph
          24.02.2018 21:34
          +1

          Решетка (lattice) — это такая алгебраическая структура.


  1. DarthVictor
    24.02.2018 16:12

    del


  1. Logos_Intellect
    25.02.2018 01:28

    Интересно было узнать, что язык развивается. Писал на нём 4 года назад дипломный проект и сильно верил в его победу над JavaScript. Ох уж эта наивность… То что начали избавляться от визуального шума (new, const), это хорошо. Если бы ещё точку с запятой убрали так вообще сказка :)


    1. chromimon
      25.02.2018 06:49

      Победу как?
      В браузерах JS и поменять миллиарды браузеров в мире невозможно и за 10 лет.


      1. Logos_Intellect
        25.02.2018 09:59

        Так Dart VM же для браузера есть. Если бы решились вставить его в Chrome, то уже больше половины аудитории имело бы Dart VM на борту. Для остальных компиляция в JavaScript


        1. chromimon
          25.02.2018 10:55

          Так Dart VM же для браузера есть.

          Для одного? В экспериментальной версии?
          Если бы решились вставить его в Chrome, то уже больше половины аудитории имело бы Dart VM на борту.

          Ошибаетесь. В мире огромное количество необновляемых устойств.
          Хотя бы взять старые Андроиды, где люди пользуются штатным браузером и ничего вручную не ставят нового. Понимаю, что вам как ИТ-шнику это кажется диким.
          Но 95% пользователей в мире — это «домохозяйки» по отношению к ИТ-шным технологиям. Они могут быть крутыми врачами или там журналистами — но вовсе не являются «продвинутыми» пользователями.
          Да, эти устройства совсем недавно исчезли из магазинов. Но вы что считаете — их покупатели уже выкинули что ли?
          Причем ситуация усугубляется тем, что это как правило дешевые модели, то есть их продано гораздо больше чем топ-смартфонов. Традиционно свежие ОС придерживаются для топ-смартфонов.
          Китайцы же вообще не обновляют своих телефонов в массе.
          Для остальных компиляция в JavaScript

          Ну вот вы лично согласны поддерживать сейчас IE6?
          Нет же?
          Аналогично было бы и с Dart VM.

          Если бы было все просто — то JS давным давно был бы заменен на что то более удобноваримое. Еще за много лет до появления Dart.
          А это не удалось даже MS в эпохи рассвета их браузера.


          1. VolCh
            25.02.2018 16:07

            С другой стороны, в те времена не было ничего подобного современной экосистеме JS. Сейчас очень часто достаточно указать целевые браузеры и исходный код, который может быть.де-факто уникальным для проекта языком, собранным по кусочкам из разных языков, предложений и уникальных плагинов. И больше ничего делать не нужно, экосистема позаботится.