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)
handicraftsman
24.02.2018 15:01- Когда запилят eval? Ведь существуют не только мобильные приложения и фротенды. Так, из-за этого отсутствует вменяемый repl в Dart SDK.
- Добавят ли возможность ждать завершения выполнения async кода в sync функциях? Особенно полезно в небольших CLI утилитах.
- В stagehand не хватает шаблона бекенд+фронтенд, который идеально подходит для небольших приложений.
Это всё, чего мне не хватает в Dart.
chromimon
24.02.2018 15:24eval как раз выпиливают усиленно из за проблем с безопасностью и с невозможностью автоматизации проверок
handicraftsman
24.02.2018 16:06Но ведь можно оставить только в Dart VM. Тогда шанс инъекции будет ниже. А если добавить bind (как в sqlite) или setcontext (как в lua), то проблем с безопасностью станет ещё меньше
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 :)
vintage
24.02.2018 15:08+1Однако с Dart 2 этот код выдаст ошибку типизации.
С чего бы вдруг?
PS: А, поэтому?
List<int>
Тогда чего это в первой версии ошибки не было?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>[];
vintage
24.02.2018 18:52+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>()
vintage
24.02.2018 22:57Тут не касты с динамиками нужны, а рантайм валидация. Зачем делать статически типизированный язык и потом "представлять, что он динамический"? У нас уже есть динамический JS.
mraleph
25.02.2018 00:23Вот в том-то и дело, что Dart 1 никогда и не был задизайнен, как статически типизированный язык. Все странности языка перестают быть странностями, если это знать и воспринимать его именно таким образом.
Logos_Intellect
25.02.2018 01:28Интересно было узнать, что язык развивается. Писал на нём 4 года назад дипломный проект и сильно верил в его победу над JavaScript. Ох уж эта наивность… То что начали избавляться от визуального шума (new, const), это хорошо. Если бы ещё точку с запятой убрали так вообще сказка :)
chromimon
25.02.2018 06:49Победу как?
В браузерах JS и поменять миллиарды браузеров в мире невозможно и за 10 лет.Logos_Intellect
25.02.2018 09:59Так Dart VM же для браузера есть. Если бы решились вставить его в Chrome, то уже больше половины аудитории имело бы Dart VM на борту. Для остальных компиляция в JavaScript
chromimon
25.02.2018 10:55Так Dart VM же для браузера есть.
Для одного? В экспериментальной версии?
Если бы решились вставить его в Chrome, то уже больше половины аудитории имело бы Dart VM на борту.
Ошибаетесь. В мире огромное количество необновляемых устойств.
Хотя бы взять старые Андроиды, где люди пользуются штатным браузером и ничего вручную не ставят нового. Понимаю, что вам как ИТ-шнику это кажется диким.
Но 95% пользователей в мире — это «домохозяйки» по отношению к ИТ-шным технологиям. Они могут быть крутыми врачами или там журналистами — но вовсе не являются «продвинутыми» пользователями.
Да, эти устройства совсем недавно исчезли из магазинов. Но вы что считаете — их покупатели уже выкинули что ли?
Причем ситуация усугубляется тем, что это как правило дешевые модели, то есть их продано гораздо больше чем топ-смартфонов. Традиционно свежие ОС придерживаются для топ-смартфонов.
Китайцы же вообще не обновляют своих телефонов в массе.
Для остальных компиляция в JavaScript
Ну вот вы лично согласны поддерживать сейчас IE6?
Нет же?
Аналогично было бы и с Dart VM.
Если бы было все просто — то JS давным давно был бы заменен на что то более удобноваримое. Еще за много лет до появления Dart.
А это не удалось даже MS в эпохи рассвета их браузера.VolCh
25.02.2018 16:07С другой стороны, в те времена не было ничего подобного современной экосистеме JS. Сейчас очень часто достаточно указать целевые браузеры и исходный код, который может быть.де-факто уникальным для проекта языком, собранным по кусочкам из разных языков, предложений и уникальных плагинов. И больше ничего делать не нужно, экосистема позаботится.
justboris
За воодушевляющим началом
Следует только описание необязательных new и const. Неужели не нашлось большего числа интересных фич, достойных упоминания?
bunopus Автор
Я так думаю Anders не хотел раздувать анонс, потому что про ту же систему типов можно написать очень много
justboris
В результате получился анонс, от которого останется только пара предложений, если выжать всю воду.
Ну, ждем следующих постов с более подробным обзором фич второй версии.
mraleph
В Dart 2 состоит из следующих компонентов:
dynamic
иvoid
);int
больше не является целым числом произвольного размера (aka bigint), а ограничен 64-битами;justboris
Спасибо! С таким списком намного понятнее.