1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/CarGuo-GSYFlutterBook

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Dart-215.md 26 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 10.03.2025 00:06 5767d61

Оригинальная статья доступна по ссылке https://medium.com/dartlang/dart-2-15-7e7a598e508a

SDK Dart версии 2.15 включает более быстрое параллельное выполнение изолятов, поддержку tear-off для конструкторов, улучшения в отношении поддержки перечислений в библиотеке dart:core, а также новые возможности для публицистов пакетов и многое другое.

Параллелизм изолятов

Современные аппаратные устройства практически все имеют многопроцессорные процессоры, способные выполнять несколько задач одновременно. Для большинства программ на Dart использование этих ядер является прозрачным:

По умолчанию время выполнения Dart выполняет все код Dart на одном ядре, но использует другие ядра для выполнения системных задач, таких как асинхронное чтение/запись файлов или сетевые запросы.

Однако иногда самому коду Dart может потребоваться параллельное выполнение, например, когда требуется одновременная работа "анимации с непрерывной анимацией и долгоживущего задания" или при анализе большого файла JSON и так далее.

Если дополнительные задачи занимают слишком много времени, это может вызвать замедление интерфейса пользователя или задержки выполнения. Поэтому важно переместить эти дополнительные задачи на отдельное ядро, чтобы обеспечить продолжение работы анимации на основном потоке выполнения без помех.Модель параллелизма Dart основана на изолатах — независимых вычислительных единицах, которые изолированы друг от друга. Это сделано для предотвращения ошибок параллельного программирования, связанных с использованием общего пространства памяти, таких как data races.

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

Dart 2.15 был переработан и реализован заново, введено новое понятие: группы изолатов. Изолаты внутри группы используют различные внутренние структуры данных текущей программы, что делает каждого изолата внутри группы более эффективным.> В настоящее время запуск дополнительного изолата в группе изолатов может происходить почти в 100 раз быстрее, поскольку теперь нет необходимости инициализировать структуры программы, а объем необходимой памяти для создания нового изолата уменьшился в 10–100 раз. Хотя группы изолатов всё ещё запрещают совместное использование изменяемых объектов между изолатами, они могут использовать общую кучу, что позволяет раскрыть больше возможностей, такие как передача объекта с одного изолата на другой, что можно использовать для выполнения задач, требующих возврата больших объёмов данных.> Например, получение данных через сеть, парсинг этих данных в большой объект JSON и последующее возвращение этого объекта основному изоляту. До версии Dart 2.15 для выполнения этой операции требовалось «глубокое копирование», которое могло привести к замедлению интерфейса пользователя, если время копирования превышало бюджет времени кадра.

Изолят, работающий в версии 2.15, может вызвать Isolate.exit() с результатом в качестве аргумента. Передача памяти результата исполняющегося изолята основному изоляту вместо копирования позволяет основному изоляту принимать результат в течение указанного времени.

Это поведение также было изменено в обновленной версии Flutter 2.8 в функции compute(), которая теперь работает таким образом. Если вы уже используете Isolate.exit() и compute(), то после обновления до Flutter 2.8 вы автоматически получите эти производительности.

Кроме того, Dart 2.15 переработал реализацию механизма передачи сообщений между изолятами, увеличив скорость передачи средних и маленьких сообщений примерно в 8 раз. Также расширился набор типов объектов, которые могут быть отправлены между изолятами, добавлена поддержка функциональных типов, замыканий и объектов трассировки стека. Подробнее см. документацию API SendPort.send():> Для получения более подробной информации о работе с изолятами перейдите к новому разделу Concurrency Introduction в документации Dart версии 2.15, а также ознакомьтесь со множеством примеров кода.

Новая языковая возможность: Tear-off конструкторов

В Dart можно создать объект функции, который указывает на метод объекта, как показано ниже. Вторая строка метода main() объявляет, что g будет указывать на метод greet объекта m:

class Greeter {
  final String name;
  Greeter(this.name);

  void greet(String who) {
    print('${this.name} говорит: Привет ${who}!');
  }
}

void main() {
  final m = Greeter('Михаил');
  final g = m.greet; // g хранит указатель на метод m.greet.
  g('Листья'); // Вызов и вывод "Михаил говорит: Привет Листья!"
}

При использовании библиотек Dart Core такие класс-функциональные указатели (также известные как tear-offs функций) часто встречаются, вот пример использования forEach() с передачей функционального указателя для вызова метода итерируемого объекта:

final m = Greeter('Михаил'); ['Лассе', 'Боб', 'Эрик'].forEach(m.greet);
// Выведет "Михаил говорит: Привет Лассе!", "Михаил говорит: Привет Боб!",
// "Михаил говорит: Привет Эрик!"
```В более ранних версиях Dart SDK отсутствовала поддержка создания tear-offs из конструкторов (языковой проблемы [#216](https://github.com/dart-lang/language/issues/216)), что было затруднительно, особенно при создании пользовательских интерфейсов Flutter, где tear-offs из конструкторов могут требоваться в различных случаях. Поэтому начиная с Dart 2.15 была добавлена поддержка этого синтаксиса.Вот пример создания `Column`, содержащей три `Text` виджета, путём применения метода `.map()` и передачи его в `Text`:

```dart
class ФруктовыйВиджет extends StatelessWidget {
    @override
    Widget build(BuildContext контекст) {
        return Column(
            children: ['Яблоко', 'Апельсин'].map(Text.new).toList()
        );
    }
}

Text.new указывает на конструктор по умолчанию класса Text. Также можно сослаться на названный конструктор, например: .map(Text.rich)

Изменения языка

Когда реализуется поддержка tear-offs конструкторов, Dart 2.15 воспользовался возможностью исправить некоторые несоответствия существующего поддержки функциональных указателей, теперь можно специализировать генерический метод для создания негенерического метода:

T id<T>(T значение) => значение;
var intId = id<int>; // Новое в 2.15.
int Function(int) intId = id; // Обходной путь до 2.15.

Вы даже можете специализировать генерический функциональный объект для создания негенерического функционального объекта:

const fo = id; // Создание tear-off `id`, создающего функциональный объект.
const c1 = fo<int>; // Новое в 2.15; ошибка ранее.

Наконец, были улучшены типы литералы, связанные с генериками:

var y = List; // Уже поддерживается.
var z = List<int>; // Новое в 2.15.
var z = typeOf<List<int>>(); // Обходной путь до 2.15.

Улучшенные энумерации в библиотеке dart:coreDart 2.15 добавляет больше оптимизаций для API энумераций в библиотеке dart:core (#1511), теперь разработчики могут получить строковое представление каждого значения энумерации через свойство .name.```dart

enum МоёЭнум { один, два, три } void main() { print(МоёЭнум.один.name); // Выведет "один". }


Еще одним способом поиска значений перечислений является поиск по имени:

```dart
print(MyEnum.values.byName('two') == MyEnum.two); // Выведет "true".

Также можно получить отображение всех пар имя-значение:

final map = MyEnum.values.asNameMap();
print(map['three'] == MyEnum.three); // Выведет "true".

Пример использования этих новых API можно найти в PR Flutter #94496.

Сжатые указатели

Dart 2.15 добавил поддержку сжатых указателей. Если требуется поддержка только адресного пространства 32 бита (максимально 4 ГБ памяти), то 64-битный SDK может использовать более компактное представление указателей.

Сжатие указателей приводит к заметному снижению потребляемой памяти; при внутренних тестах на приложении Google Pay мы наблюдали уменьшение размера кучи Dart примерно на 10%.

Поскольку сжатые указатели ограничивают доступ к памяти свыше 4 ГБ, эта функциональность находится за конфигурационной опцией в Dart SDK, которую могут переключать только эмбеддеры SDK при сборке.

Конфигурация для этой опции уже активирована в Flutter SDK версии 2.8 для сборки под Android, а команда Flutter рассматривает возможность активации этой конфигурации для сборки под iOS в будущих версиях.

Dart DevTools включены в Dart SDKРанее набор DevTools для отладки и анализа производительности не входил в состав Dart SDK, поэтому разработчики должны были скачивать его отдельно.С Dart 2.15 DevTools теперь доступны непосредственно в скачиваемом Dart SDK без необходимости дополнительной установки.

Дополнительная информация о том, как использовать DevTools вместе с командной строкой Dart, доступна в документации DevTools.

Новые возможности для публикаторов пакетов в pub

В Dart 2.15 SDK появились две новые возможности для разработчиков в команде dart pub и pub.dev хранилище пакетов.

Первое новшество — это новый безопасный механизм для публикаторов, предназначенный для выявления случайного выпуска секретных данных (например, учетных данных облачных сервисов или систем CI) в пакете.

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

Проверка утечек выполняется как часть предпубликационной проверки команды dart pub publish. Если она обнаруживает потенциально утеченные данные в файлах, подготовленных для публикации, команда publish завершает работу с сообщением об ошибке, например:

Обнаружено потенциально утеченное секретное значение. Публикация отменена.

Публикация пакета my_package версии 1.0.0 на https://pub.dartlang.org завершилась следующими ошибками:* строка 1, столбец 1 файла lib/key.pem: Обнаружена потенциальная утечка приватного ключа.

┬ - - -BEGIN PRIVATE KEY - - -
│ H0M6xpM2q+53wmsN/eYLdgtjgBd3DBmHtPilCkiFICXyaA8z9LkJ
└ - - -END PRIVATE KEY - - -
  • строка 2, столбец 23 файла lib/my_package.dart: Обнаружена потенциальная утечка Google OAuth Refresh Token.
final refreshToken = "1//042ys8uoFwZrkCgYIARAAGAQSNwF-L9IrXmFYE-sfKefSpoCnyqEcsHX97Y90KY-p8TPYPPnY2IPgRXdy0QeVw7URuF5u9oUeIF0";
```В очень редких случаях этот анализ может выдавать ложноположительные срабатывания; в таких случаях можно добавить файлы в список разрешённых.

> Разрешенный список: <https://dart.dev/go/false-secrets>

Кроме того, для публикаторов была добавлена возможность **возврата уже опубликованных версий пакетов**.

Обычно при наличии проблемной версии пакета рекомендуется выпуск небольшого исправленного пакета, чтобы исправить возникшие проблемы.

Однако в очень редких случаях, когда разработчики ещё не имеют возможности для выпуска исправленного пакета, или случайно выпустили новый основной пакет, можно использовать новую функцию возврата пакета как последний вариант решения, эта функция доступна через административный интерфейс на pub.dev:

![Изображение](http://img.cdn.guoshuyu.cn/20211223_Dart-215/image1)

Когда версия пакета возвращается, клиент pub больше не будет разбирать эту версию для команд `pub get` или `pub upgrade`. Если разработчик использует успешную отозванную версию (поэтому она указана в его файле `pubspec.lock`), он получит предупреждение `pub` при следующем запуске:

$ dart pub get Разрешение зависимостей... mypackage 0.0.181-buggy (отозвано, доступна версия 0.0.182-fixed) Зависимости успешно загружены!


## Анализ безопасности для обнаружения двунаправленных символов Юникода (CVE-2021-22567)Недавно была обнаружена общая уязвимость программирования языков, поддерживающих Юникод ([CVE-2021-42574](https://nvd.nist.gov/vuln/detail/CVE-2021-42574)), которая затрагивает большинство современных языков программирования, поддерживающих Юникод. Ниже приведён пример кода на Dart, демонстрирующий данную проблему:

```dart
void main() {
  final accessLevel = 'user';
  if (accessLevel == 'user‮ .⁦// Проверяем, является ли это администратором⁩ ⁦') {
    print('Вы обычный пользователь.');
  } else {
    print('Вы администратор.');
  }
}

Вы можете подумать, что программа выведет "Вы обычный пользователь.", но на самом деле она может вывести "Вы администратор.". Используя строки, содержащие двунаправленные символы Юникода, можно воспользоваться данной уязвимостью, так как эти символы могут изменять направление отображаемого текста с лево-направленного на право-направленное и обратно.

Для двунаправленных символов внешний вид текста на экране может кардинально отличаться от его реального содержания, что демонстрируется в примерах на GitHub code gist.Средства защиты от этой уязвимости включают использование инструментов, способных выявлять двунаправленные символы Юникода (редакторы, средства проверки кода и т. д.), чтобы разработчики могли осознавать их присутствие и принимать решения о дальнейшем использовании. Пример такого инструмента представлен в просмотрщике файлов GitHub gist по указанной выше ссылке.Dart 2.15 также внедрил дополнительные меры защиты (Dart безопасность объявление CVE-2021–22567): анализатор Dart теперь сканирует двунаправленные символы Юникода и помечает любое их использование:

$ dart analyze
Анализирую cvetest...                   2.6s
info • bin/cvetest.dart:4:27 • Юникодный кодовой точкой 'U+202E' меняется внешний вид текста относительно того, как он интерпретируется компилятором. Удалите этот кодовой пункт или используйте последовательность экранирования Юникода '\u202E'.
       text_direction_code_point_in_literal

Мы рекомендуем заменить эти символы последовательностями экранирования Юникода, чтобы они были видимыми во всех текстовых редакторах или просмотрах, либо если разработчики считают, что использование этих символов действительно легально, то они могут отключить предупреждение, добавив переопределение до строки использования:

// ignore: text_direction_code_point_in_literal

Уязвимость учетных данных pub.dev при использовании сторонних серверов pub (CVE-2021–22568)

Dart 2.15 также выпустил второй Dart безопасный объект CVE-2021–22568 связанный с pub.dev.> Этот объект предназначен для пакетных издателей, которые могут использовать сторонние серверы публикации пакетов (например, частные или внутренние корпоративные серверы публикации пакетов), а не только общедоступное pub.dev хранилище (стандартная конфигурация). Разработчики, использующие только общедоступное pub.dev хранилище, не подвержены данной уязвимости.Если разработчик уже использовал стороннее хранилище, уязвимость заключается в предоставлении временного (часового) OAuth2-токена доступа для аутентификации в этом стороннем хранилище, который может быть незаконно использован для аутентификации в общедоступном pub.dev хранилище. Поэтому злонамеренный третий сторонний сервер pub может использовать токены доступа для имитации разработчика на pub.dev и публикации пакетов от его имени.

Если разработчики уже опубликовали свои пакеты в ненадёжном третьестороннем хранилище пакетов, рекомендуется проверить все действия всех аккаунтов в общедоступном хранилище пакетов pub.dev, например, с помощью журнала действий на pub.dev.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/CarGuo-GSYFlutterBook.git
git@api.gitlife.ru:oschina-mirror/CarGuo-GSYFlutterBook.git
oschina-mirror
CarGuo-GSYFlutterBook
CarGuo-GSYFlutterBook
master