Комментарии 18
Понятно что Дарт развивался гуглом как браузерный язык под копирку модели JS. Но теперь в рамках того же Flutter это выглядит как-то странно, почему гугл не задумался о том что Дарт может использоваться намного шире, в т.ч для реально параллельных вычислений?
Если честно, у меня от Дарта в целом — и от Flutter в частности — довольно противоречивые впечатления. Это, скорее, вкусовщина, потому что язык-то свою функцию выполняет (да и развивается: extension-методы и null-safety появились). Однако, меня не покидает ощущение, что они как будто хотели угодить всем. Ну типа, джависты, смотрите, вот эти штуки вы знаете, особо привыкать не придётся ради вас точку с запятой в конце строк оставили; джаваскриптеры, а вот тут прям как у вас, легко перейдёте на Дарт хоть прям сейчас. И в большой степени оно так и есть и даже работает, но… не знаю. Закончу приложение на Flutter, может оформлю мысли хабр всё стерпит.
А по поводу асинхронности и параллельности: ну так параллельность далеко не всегда нужна. Скажем так, её нужно применять гораздо более осознанно, чем асинхронность. И механизм Изолятов в Дарт, по-моему, делает достаточно, чтобы усложнить "выстрел в ногу".
Кстати, правильно ли я понял что внутри VM Дарт тоже однопоточный, т.е нет аналога пула потоков и распределения горутин/корутнин по потокам? Соглашусь что асинхронности бывает достаточно, но всё таки не всегда. Понятно что таким образом пытаются оградить от выстреливаний в ногу без применения средств синхронизации, но все равно не считаю это поводом убирать потоки, ибо даже в JS они в той или иной форме появляются, потребность в них всё равно есть.
Судя по тому, что пишут здесь: https://mrale.ph/dartvm/ — какой-то пул потоков есть. Однако ВМ ими управляет как считает нужным и создание Изолята
!= создание Потока
или типа того. Один поток ОС может поработать с одним Изолятом, потом пойти в другой. Так же код в Изоляте может повыполнять один поток ОС, потом другой. Как-то так.
Я не думаю, что тут дело в стремлении угождать всем. По-моему почти все современные мейнстримовые языки движутся примерно в одном направлении и воруют вдохновляются друг другом. И это нормально. Если посмотреть дартовский гитхаб – то они там прямо и обсуждают новые потенциальные фичи, сравнивая другие языки и где-то ориентируясь на них.
Ну и плюс не стоит забывать, что дарт2 произошел от дарт, который, в свою очередь, позиционировался как более лучший джаваскрипт. Так что, конечно, там было много знакомого для джаваскриптеров.
Мне вот лично Котлин всё равно как-то больше нравится, но и в дарте есть свои интересные штуки. Хотя бы уже не плююсь от него, как поначалу (или это стокгольмский синдром разыгрался?).
А те языки, в свою очередь, "вдохновляются" не-мейнстримовыми языками вроде хаскеля)
Да мне тоже сначала Дарт казался недо-Котлином. Но это скорее именно потому, что я смотрел со стороны Котлина. А так Дарт действительно более лучший джаваскрипт и это хорошо.
В результате так: для меня Дарт — это последний из поводов пинать Flutter.
- возвращается экземпляр Future со статусом не завершено (incomplete)
- если есть синхронный код для исполнения, он исполняется (но не код Future)
Вроде бы так было до Dart 2.0, а сейчас сначала внутри async функции выполняется синхронный код, и только далее, когда внутри всретился await, возвращается незавершенная фьюча?
Execution flow with async and await
An async function runs synchronously until the first await keyword. This means that within an async function body, all synchronous code before the first await keyword executes immediately.
Имеет смысл обратить внимание на пакет https://pub.dev/packages/easy_isolate, облегчающий некоторые варианты применения многопоточности
// Ждём ответ и возвращаем его
//
return port.first;
Это выглядит неправильным для работы с изолятами.
Завешивать главный поток на время ожидания параллельного - это лажа какая-то. Тут тоже нужен port.listen(), насколько я понимаю. Но, с другой стороны, тут консольное приложение и сама идея выноса в нём работы в изолят выглядит странной, если не сделать например вывода какого-то прогресса про статус изолята на время его работы...
А где вы тут видите "завешивание" главного потока?
Вам возвращаемое значение Future<String>
ничего не говорит?
А в каком порядке что выполняется в главном потоке, если в нём выполнять
var s = await sendReceive('test');
?
Flutter. Асинхронность и параллельность