Доступні мова програмування Dart 2.15 та фреймворк Flutter 2.8

Компанія Google опублікувала реліз мови програмування Dart 2.15, що продовжив розвиток кардинально переробленої гілки Dart 2, яка відрізняється від початкового варіанта мови Dart застосуванням сильної статичної типізації (типи можуть виводитися автоматично, тому вказівка ​​типів не є обов'язковою, але динамічна типізація більше не використовується і обчислена спочатку тип закріплюється за змінною та надалі застосовується сувора перевірка типу).

Особливості мови Dart:

  • Звичний і простий вивчення синтаксис, природний для програмістів на JavaScript, Сі і Java.
  • Забезпечення швидкого запуску та високої продуктивності для всіх сучасних web-браузерів та різних типів оточень, від портативних пристроїв до потужних серверів.
  • Можливість визначення класів та інтерфейсів, що дозволяють використовувати інкапсуляцію та повторно використовувати існуючі методи та дані.
  • Вказівка ​​типів дозволяє спростити налагодження та виявлення помилок, робить код більш ясним та читаним, спрощує його доопрацювання та аналіз сторонніми розробниками.
  • Серед типів, що підтримуються: різні види хешів, масивів і списків, черги, числові і рядкові типи, типи для визначення дати і часу, регулярні вирази (RegExp). Є можливість створення своїх типів.
  • Для організації паралельного виконання пропонується використовувати класи з атрибутом isolate, код яких виконується повністю в ізольованому просторі окремої області пам'яті, взаємодіючи з основним процесом через відправлення повідомлень.
  • Підтримка використання бібліотек, що спрощують підтримку та налагодження великих веб-проектів. Сторонні реалізації функцій можуть підключатися у вигляді бібліотек, що розділяються. Програми можна розбити на частини та доручити розробку кожної з частин окремій команді програмістів.
  • Набір готових інструментів для підтримки розробки мовою Dart, включаючи реалізацію засобів динамічної розробки та налагодження з виправленням коду на льоту (edit-and-continue).
  • Для спрощення розробки мовою Dart поставляється SDK, пакетний менеджер pub, статичний аналізатор коду dart_analyzer, набір бібліотек, інтегроване середовище розробки DartPad та плагіни з підтримкою Dart для IntelliJ IDEA, WebStorm, Emacs, Sublime Text 2 та Vim.
  • Додаткові пакети з бібліотеками та утилітами розповсюджуються через репозиторій pub, що налічує близько 22 тисяч пакетів.

Основні зміни у випуску Dart 2.15:

  • Надано засоби для швидкого паралельного виконання завдань з ізоляцією обробників. На багатоядерних системах Dart runtime за замовчуванням виконує код програми на одному ядрі CPU, а інші ядра залучає до виконання системних завдань, таких як асинхронне введення/виведення, запис у файли або здійснення мережевих дзвінків. Для додатків, яким необхідно паралельно виконувати свої обробники, наприклад, для малювання анімації в інтерфейсі, передбачена можливість запуску окремих блоків коду (isolate), ізольованих один від одного та виконуваних на інших ядрах CPU одночасно з основним потоком програми. Для захисту від помилок, що виникають при одночасному виконанні коду, що працює з одним набором даних, у різних в isolate-блоках заборонено спільне використання об'єктів, що змінюються, а для взаємодії між обробниками застосовується модель на основі передачі повідомлень.

    У Dart 2.15 запропоновано нову концепцію — групи ізольованих блоків (isolate groups), що дозволяє організувати спільний доступ до різних внутрішніх структур даних в isolate-блоках, що входять до однієї групи, що дозволяє значно знизити накладні витрати при взаємодії обробників у групі. Наприклад, запуск додаткового isolate-блоку в існуючій групі виконується в 100 разів швидше і вимагає в 10-100 разів менше пам'яті, ніж запуск відокремленого isolate-блоку, за винятком необхідності ініціалізації структур даних програми.

    Незважаючи на те, що в isolate-блоках у групі, як і раніше, заборонено спільний доступ до об'єктів, що змінюються, у групах використовується загальна heap-пам'ять, що дозволяє значно прискорити передачу об'єктів з одного блоку в інший без необхідності виконання ресурсомістких операцій копіювання. У новій версії також дозволено передавати результат роботи оброблювача при викликі Isolate.exit() для передачі даних до батьківського isolate-блоку без операцій копіювання. Крім того проведено оптимізацію механізму передачі повідомлень — невеликі та середні повідомлення тепер обробляються приблизно у 8 разів швидше. До об'єктів, які можна передавати між isolate-блоками за допомогою виклику SendPort.send(), включені деякі типи функцій, замикання та трасування стека.

  • У засобах для створення покажчиків на окремі функції в інших об'єктах (tear-off) знято обмеження щодо створення подібних покажчиків у коді конструкторів, що може бути корисним при побудові інтерфейсів на базі бібліотеки Flutter. Наприклад, для створення віджета Column, що включає кілька віджетів Text, можна викликати «.map()» і передати покажчики в конструктор Text.new об'єкта Text: class FruitWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children: ['Apple', 'Orange'].map(Text.new).toList()); } }
  • Розширено можливості, пов'язані з використанням покажчиків на функції. Додана можливість застосовувати узагальнені (generic) методи та покажчики функцій для створення не-generic методу та покажчика: T id (T value) => value; var intId = id ; // дозволено у версії 2.15 замість "int Function(int) intId = id;" const fo=id; // покажчик на функцію id. const c1 = fo ;
  • У бібліотеці dart:core покращено підтримку перерахувань (enum), наприклад, тепер можна виводити рядкове значення з кожного значення enum за допомогою методу «.name», здійснювати вибірку значень на ім'я або виконувати зіставлення пар значень: enum MyEnum { one, two, three } void main() { print(MyEnum.one.name); // буде виведено "one". print(MyEnum.values.byName('two') == MyEnum.two); // буде виведено "true". final map = MyEnum.values.asNameMap(); print(map['three'] == MyEnum.three); // "true". }
  • Реалізовано техніку стиснення покажчиків, що дозволяє використовувати більш компактне представлення покажчиків у 64-розрядних оточеннях, якщо для адресації достатньо 32-розрядного адресного простору (використовується не більше 4 ГБ пам'яті). Тести показали, що така оптимізація дозволяє скоротити розмір купи приблизно на 10%. У Flutter SDK за промовчанням новий режим вже активовано для Android, а в майбутньому випуску заплановано для включення для iOS.
  • До складу Dart SDK включені інструменти для налагодження та аналізу продуктивності (DevTools), які раніше постачалися в окремому пакеті.
  • До команди «dart pub» та репозиторії пакетів pub.dev додані засоби для відстеження випадкової публікації конфіденційної інформації, наприклад, залишення всередині пакета облікових даних для систем безперервної інтеграції та хмарних оточень. У разі виявлення подібних витоків виконання команди dart pub publish буде перервано з повідомленням про помилку. Якщо мало місце помилкове спрацювання надано можливість обходу перевірки через білий список.
  • До репозиторію pub.dev додано можливість відкликання вже опублікованої версії пакета, наприклад, у разі виявлення небезпечних помилок або вразливостей. Раніше для подібних виправлень практикувалася публікація слідом коригуючої версії, але в деяких ситуаціях потрібно саме скасувати випуск і екстрено зупинити його подальше поширення (наприклад, якщо виправлення ще не готове або якщо помилково замість тестової версії був опублікований повноцінний випуск). Після відкликання пакет перестає визначатися в командах pub get і pub upgrade, а на системах, що вже встановили його, при черговому виконанні pub get видається спеціальне попередження.
  • Додано захист від уразливості (CVE-2021-22567), викликаний застосуванням у коді unicode-символів, що змінюють порядок відображення.
  • Усунена вразливість (CVE-2021-22568), що дозволяє видати себе за іншого користувача pub.dev при публікації пакетів на сторонній сервер, який приймає oauth2-токени доступу pub.dev. Наприклад, уразливість може застосовуватися для атаки на внутрішні та корпоративні сервери пакетів. Розробників, які розміщують пакети лише на pub.dev, проблема не торкається.

Одночасно представлений значний реліз фреймворку побудови інтерфейсу користувача Flutter 2.8, який розглядається як альтернатива React Native і дозволяє на основі однієї кодової бази випускати програми для платформ iOS, Android, Windows, macOS та Linux, а також створювати програми для запуску в браузерах. На основі Flutter побудована оболонка користувача мікроядерної операційної системи Fuchsia, що розвивається в Google. Зазначається, що протягом останніх шість місяців кількість додатків на Flutter 2 в Google Play Store збільшилася з 200 тисяч до 375 тисяч, тобто. майже вдвічі.

Основна частина коду Flutter реалізована мовою Dart, а runtime-движок для виконання додатків написано на C++. При розробці програм, крім рідної для Flutter мови Dart, можна використовувати інтерфейс Dart Foreign Function для виклику коду C/C++. Висока продуктивність виконання досягається завдяки компіляції програм у машинний код для цільових платформ. При цьому програму не потрібно перекомпілювати після кожної зміни — Dart надає режим гарячого перезавантаження, що дозволяє вносити зміни до програми, що працює, і відразу оцінювати результат.

Зі змін у новому випуску Flutter відзначається проведення оптимізації швидкості запуску та споживання пам'яті на мобільних пристроях. Спрощено підключення програм до бекенд-сервісів, таких як Firebase та Google Cloud. Стабілізовано інструменти для інтеграції з Google Ads. Значно покращена підтримка камер та web-плагінів. Запропоновано нові засоби для спрощення розробки, наприклад додано віджет для аутентифікації з використанням Firebase. Оновлено двигун Flame, призначений для розробки 2D-ігор з використанням Flutter.

Джерело: opennet.ru

Додати коментар або відгук