Pull to refresh

Comments 18

Вам спасибо за внимание. Форматирование текста, конечно, где-то поехало, и кривизна формулировок иногда зашкаливает, но в целом не очень стыдно.

Понятно что Дарт развивался гуглом как браузерный язык под копирку модели JS. Но теперь в рамках того же Flutter это выглядит как-то странно, почему гугл не задумался о том что Дарт может использоваться намного шире, в т.ч для реально параллельных вычислений?

Если честно, у меня от Дарта в целом — и от Flutter в частности — довольно противоречивые впечатления. Это, скорее, вкусовщина, потому что язык-то свою функцию выполняет (да и развивается: extension-методы и null-safety появились). Однако, меня не покидает ощущение, что они как будто хотели угодить всем. Ну типа, джависты, смотрите, вот эти штуки вы знаете, особо привыкать не придётся ради вас точку с запятой в конце строк оставили; джаваскриптеры, а вот тут прям как у вас, легко перейдёте на Дарт хоть прям сейчас. И в большой степени оно так и есть и даже работает, но… не знаю. Закончу приложение на Flutter, может оформлю мысли хабр всё стерпит.


А по поводу асинхронности и параллельности: ну так параллельность далеко не всегда нужна. Скажем так, её нужно применять гораздо более осознанно, чем асинхронность. И механизм Изолятов в Дарт, по-моему, делает достаточно, чтобы усложнить "выстрел в ногу".

Кстати, правильно ли я понял что внутри VM Дарт тоже однопоточный, т.е нет аналога пула потоков и распределения горутин/корутнин по потокам? Соглашусь что асинхронности бывает достаточно, но всё таки не всегда. Понятно что таким образом пытаются оградить от выстреливаний в ногу без применения средств синхронизации, но все равно не считаю это поводом убирать потоки, ибо даже в JS они в той или иной форме появляются, потребность в них всё равно есть.

Судя по тому, что пишут здесь: https://mrale.ph/dartvm/ — какой-то пул потоков есть. Однако ВМ ими управляет как считает нужным и создание Изолята != создание Потока или типа того. Один поток ОС может поработать с одним Изолятом, потом пойти в другой. Так же код в Изоляте может повыполнять один поток ОС, потом другой. Как-то так.

Я не думаю, что тут дело в стремлении угождать всем. По-моему почти все современные мейнстримовые языки движутся примерно в одном направлении и воруют вдохновляются друг другом. И это нормально. Если посмотреть дартовский гитхаб – то они там прямо и обсуждают новые потенциальные фичи, сравнивая другие языки и где-то ориентируясь на них.


Ну и плюс не стоит забывать, что дарт2 произошел от дарт, который, в свою очередь, позиционировался как более лучший джаваскрипт. Так что, конечно, там было много знакомого для джаваскриптеров.


Мне вот лично Котлин всё равно как-то больше нравится, но и в дарте есть свои интересные штуки. Хотя бы уже не плююсь от него, как поначалу (или это стокгольмский синдром разыгрался?).

А те языки, в свою очередь, "вдохновляются" не-мейнстримовыми языками вроде хаскеля)

И это тоже хорошо :) Как с тем же F# – писать большое приложение исключительно на нем – довольно спорное решение, но смотреть, как некоторые его идеи проникают в C# приятно.

Да мне тоже сначала Дарт казался недо-Котлином. Но это скорее именно потому, что я смотрел со стороны Котлина. А так Дарт действительно более лучший джаваскрипт и это хорошо.
В результате так: для меня Дарт — это последний из поводов пинать Flutter.

А во всем остальном меня флаттер очень даже устраивает. Особенно в разработке кастомных компонентов – по сравнению с нативным андроидом это просто праздник какой-то.

  • возвращается экземпляр Future со статусом не завершено (incomplete)
  • если есть синхронный код для исполнения, он исполняется (но не код Future)


Вроде бы так было до Dart 2.0, а сейчас сначала внутри async функции выполняется синхронный код, и только далее, когда внутри всретился await, возвращается незавершенная фьюча?
да, вот в доках dart.dev/codelabs/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.

    // Ждём ответ и возвращаем его
    //
    return port.first;

Это выглядит неправильным для работы с изолятами.
Завешивать главный поток на время ожидания параллельного - это лажа какая-то. Тут тоже нужен port.listen(), насколько я понимаю. Но, с другой стороны, тут консольное приложение и сама идея выноса в нём работы в изолят выглядит странной, если не сделать например вывода какого-то прогресса про статус изолята на время его работы...

А где вы тут видите "завешивание" главного потока?


Вам возвращаемое значение Future<String> ничего не говорит?

А в каком порядке что выполняется в главном потоке, если в нём выполнять

var s = await sendReceive('test');

?

  1. будет создан ReceiverPort и отправлено сообщение изоляту
  2. оператор await приостановит текущую сопрограмму до получения ответа
  3. будут обрабатываться другие события пока ответ ожидается
  4. после получения ответа исполнение сопрограммы будет продолжено
Sign up to leave a comment.

Articles