Firma Google opublikowała wydanie języka programowania Dart 2.14, kontynuując rozwój radykalnie przebudowanej gałęzi Dart 2, która różni się od pierwotnej wersji języka Dart zastosowaniem silnej statycznej typizacji (typy mogą być wywnioskowane automatycznie, więc wskazywanie typów nie jest obowiązkowe, ale typizacja dynamiczna już nie jest stosowana, a pierwotnie wyliczony typ jest przypisany do zmiennej i jest dalej stosowana ścisła kontrola typu).
Cechy języka Dart:
- Znany i prosty w nauce składnik, naturalny dla programistów JavaScript, C i Java.
- Z zapewnieniem szybkiego uruchamiania i wysokiej wydajności dla wszystkich współczesnych przeglądarek internetowych i różnych typów środowiska, od urządzeń przenośnych po mocne. serwerów.
- Możliwość definiowania klas i interfejsów, co pozwala na wykorzystanie enkapsulacji i ponowne wykorzystanie istniejących metod i danych.
- Określenie typów ułatwia debugowanie i identyfikację błędów, czyni kod bardziej przejrzystym i czytelnym, upraszcza jego dopracowanie i analizę przez innych programistów.
- Wśród obsługiwanych typów: różne typy hash, tablice i listy, kolejki, typy numeryczne i ciągów, typy do określania daty i czasu, wyrażenia regularne (RegExp). Istnieje możliwość tworzenia własnych typów.
- Do organizacji równoległego wykonywania zaleca się używanie klas z atrybutem isolate, których kod jest wykonywany całkowicie w odizolowanej przestrzeni w osobnym obszarze pamięci, komunikując się z głównym procesem za pomocą wysyłania wiadomości.
- Wsparcie dla używania bibliotek, które upraszczają wsparcie i debugowanie dużych projektów webowych. Zewnętrzne implementacje funkcji mogą być podłączane jako wspólne biblioteki. Aplikacje można podzielić na części i powierzyć rozwój każdego z nich osobnym zespołom programistycznym.
- Zestaw gotowych narzędzi do wsparcia rozwoju w języku Dart, w tym implementacja narzędzi do dynamicznego rozwoju i debugowania z poprawą kodu w locie („edit-and-continue”).
- Aby uprościć rozwój w języku Dart, dostępne jest SDK, menedżer pakietów pub, statyczny analizator kodu dart_analyzer, zestaw bibliotek, zintegrowane środowisko programistyczne DartPad oraz wtyczki z obsługą Dart dla IntelliJ IDEA, WebStorm, Emacs, Sublime Text 2 i Vim.
- Dodatkowe pakiety z bibliotekami i narzędziami są dystrybuowane przez repozytorium pub, które liczy ponad 20 tysięcy pakietów.
Główne zmiany w wydaniu Dart 2.14:
- Dodano nowy operator potrójnego przesunięcia (>>>), który w przeciwieństwie do operatora „>>” wykonuje przesunięcie logiczne, działające bez uwzględnienia bitu znaku (przesunięcie odbywa się bez podziału na liczby dodatnie i ujemne).
- Usunięto ograniczenie dotyczące argumentów typu, które uniemożliwiało użycie ogólnych typów funkcji jako argumentów z typem. Na przykład, teraz można wskazywać: late List<T Function(T)> idFunctions; var callback = [(T value) => value]; late S Function<S extends T Function(T)>(S) f;
- Zezwolono na wskazywanie argumentów z typami w adnotacjach, takich jak @Deprecated. Na przykład, teraz można wskazywać: @TypeHelper(42, "The meaning")
- Do standardowej biblioteki (core) w klasie Object dodano metody statyczne hash, hashAll i hashAllUnordered. W klasie DateTime poprawiono obsługę czasu lokalnego przy przeliczaniu godzin między czasem letnim a czasem standardowym nie będącym wielokrotnością jednej godziny (na przykład w Australii stosuje się przesunięcie o 30 minut). Do pakietu ffi dodano wsparcie dla mechanizmu przydzielania pamięci arena, automatycznie zwalniającego zasoby. W pakiecie ffigen dodano możliwość generowania definicji typedef typów Dart z języka C.
- 250 najpopularniejszych pakietów z repozytorium pub.dev oraz 94% z top-1000 zostały przetłumaczone na zastosowanie trybu bezpiecznego użycia wartości „Null” (null safety), który pozwala uniknąć awarii spowodowanych próbami użycia zmiennych, których wartość jest nieokreślona i ustawiona na „Null”. Tryb ten oznacza, że zmienne nie mogą mieć nieokreślonych wartości, chyba że jawnie przypisano im wartość null. W trybie ścisły typy zmiennych są brane pod uwagę, co pozwala kompilatorowi na zastosowanie dodatkowych optymalizacji. Zgodność typów jest sprawdzana na etapie kompilacji, na przykład w przypadku próby przypisania wartości „Null” zmiennej z typem, który nie dopuszcza nieokreślonego stanu, takiego jak „int”, wystąpi błąd.
- Zaproponowano zunifikowane zestawy reguł dla analizy kodu (linter), zapewniające jednoczesne wsparcie dla sprawdzania zgodności z zaleceniami dotyczącymi stylu kodu dla Dart i frameworka Flutter. Z powodów historycznych zasady formatowania kodu dla Fluttera i Darta różniły się, a dla Darta w użyciu były dwa zestawy reguł — pedantyczne od Google oraz zasady od społeczności programistów Darta. W Dart 2.14 wprowadzono nowy wspólny zestaw reguł dla lintera, który postanowiono stosować domyślnie w nowych projektach Dart oraz w Flutter SDK. Zestaw obejmuje podstawowe zasady (pakiet lints/core.yaml), zalecane dodatkowe zasady (lints/recommended.yaml) oraz specyficzne dla Fluttera rekomendacje (flutter_lints/flutter.yaml). Użytkownikom pedantycznych reguł zaleca się przejście na nowy styl kodowania oparty na zaleceniach z dokumentacji Darta.
- W formatterze wprowadzono optymalizacje w formatowaniu kaskadowych bloków kodu, pozwalające znacznie zwiększyć wydajność formatowania i uniknąć niejednoznacznej interpretacji przynależności elementów wyrażenia. Na przykład, wywołanie „..doIt” w wyrażeniu „var result = errorState ? foo : bad..doIt()” dotyczy nie warunkowej części bloku „bad”, lecz całego wyrażenia, dlatego podczas formatowania teraz jest ono rozdzielane: var result = errorState ? foo : bad ..doIt();
- W SDK dodano wsparcie dla procesorów Apple M1 (Silicon), co oznacza zarówno możliwość uruchamiania Dart VM, narzędzi i komponentów SDK na systemach z procesorami Apple Silicon, jak i wsparcie dla kompilacji plików wykonywalnych dla tych chipów.
- Do zespołu „dart pub” dodano wsparcie dla nowego pliku pomocniczego „.pubignore”, który pozwala określić listę plików, które zostaną pominięte podczas publikacji pakietu w repozytorium pub.dev. Podane ustawienia nie pokrywają się z listą ignorowania „.gitignore” (w niektórych sytuacjach w pub.dev konieczne jest, aby nie przesyłać plików, które są potrzebne w Git, na przykład wewnętrznych skryptów używanych podczas rozwoju).
- Wykonano prace nad zwiększeniem wydajności zespołu „dart test”, który teraz nie wymaga ponownej kompilacji testów po zmianie pubspec, jeśli numer wersji się nie zmienił.
- Zaprzestano wsparcia dla kompilacji w trybie kompatybilności z ECMAScript 5 (zmiana ta doprowadzi do utraty kompatybilności z przeglądarką IE11).
- Ogłoszono przestarzałymi poszczególne narzędzia stagehand, dartfmt i dart2native, które zostały zastąpione wbudowanymi poleceniami wywoływanymi za pomocą narzędzia dart.
- Przesunięto do kategorii przestarzałych mechanizm VM Native Extensions. Do wywoływania kodu natywnego z kodu w języku Dart zaleca się użycie nowego interfejsu Dart FFI (Foreign Function Interface).
Jednocześnie zaprezentowano znaczącą wersję frameworka do budowania interfejsów użytkownika Flutter 2.5, który jest postrzegany jako alternatywa dla React Native i pozwala na wydawanie aplikacji na platformy iOS, Android, Windows, macOS i Linux na podstawie jednego kodu źródłowego, a także na tworzenie aplikacji do uruchamiania w przeglądarkach. Na podstawie Flutter zbudowano interfejs użytkownika rozwijanej w Google mikrojądrowej systemu operacyjnego Fuchsia.
Główna część kodu Fluttera jest napisana w języku Dart, a silnik wykonawczy do uruchamiania aplikacji jest napisany w C++. Podczas tworzenia aplikacji, oprócz rodzimych dla Fluttera języka Dart, można wykorzystać interfejs Dart Foreign Function do wywoływania kodu w C/C++. Wysoka wydajność wykonania osiągana jest dzięki kompilacji aplikacji do kodu maszynowego dla docelowych platform. Aplikacji nie trzeba rekompilować po każdej zmianie — Dart zapewnia tryb gorącego przeładowania, który umożliwia wprowadzanie zmian w działającej aplikacji i natychmiastowe ocenianie wyników.
Główne zmiany w Flutter 2.5:
- Wprowadzono znaczące optymalizacje wydajności. Na platformach iOS i macOS wdrożono prekompilację shaderów dla graficznego API Metal. Zwiększona efektywność obsługi asynchronicznych zdarzeń. Rozwiązano problem z opóźnieniami podczas zwalniania pamięci przez zbieracza śmieci z nieużywanych obrazów (na przykład w czasie odtwarzania 20-sekundowego animowanego GIF-u liczba operacji zbierania śmieci zmniejszyła się z 400 do 4. Opóźnienia przy przesyłaniu wiadomości między Dart a Objective-C/Swift (iOS) lub Java/Kotlin (Android) zmniejszono o 50%. Dodano wsparcie dla natywnej kompilacji dla systemów opartych na chipie Apple Silicon.

- Na platformie Android wprowadzono wsparcie dla aplikacji działających w trybie pełnoekranowym. Kontynuowano realizację koncepcji interfejsu „Material You”, przedstawianej jako wariant następnej generacji Material Design. Dodano nowe stanje MaterialState.scrolledUnder, wdrożono dynamiczne wyświetlanie pasków przewijania przy zmianie rozmiaru i zaproponowano nowy interfejs do wyświetlania banerów powiadomień.
- Znacznie rozszerzono możliwości wtyczki do pracy z kamerą, w której pojawiły się narzędzia do zarządzania autofokusem, ekspozycją, lampą błyskową, powiększeniem, redukcją szumów i rozdzielczością.
- Udoskonalono narzędzia dla deweloperów (DevTools), które zyskały zaktualizowany tryb inspekcji widżetów oraz dostarczono narzędzia do wykrywania opóźnień w renderowaniu i śledzenia kompilacji shaderów.

- Udoskonalono wtyczki dla Visual Studio Code oraz IntelliJ/Android Studio.
Źródło: opennet.ru


