🔥

Тред (Глеб Лукьянец)


Вот-вот в swift появится structured concurrency с асинком и акторами. Наконец-то! До этого разработчики упорно притворялись что многопоточность не существует: форумы молчали, документация аккуратно обходила эту тему стороной

Нативных тредов в стандартной библиотеке не было, а компилятор так и норовил втихую разломать любое использование мьютексов/атомиков и подобного (в т.ч. dispatch_once). На практике это означало, что остается только пользоваться GCD и молиться.

Теперь уже понятно почему: команда свифта готовила более цельный, всеобъемлющий подход. Очень странно, что готовила она его аж семь лет и дотянула аж до фиксации ABI. За это время все уже успели понаписать килотонны кода на коллбеках.

Про async/await уже сейчас и так не пишет только ленивый. А я хотел бы вас познакомить с идеей, которая позволила бы запилить в язык собственные async/await любому школьнику еще в 2015м.

Возможность запоминать состояние выполнения программы (и, потенциально, работать с ним как данными), называется Continuations (продолжения). В некотором ограниченном смысле, привычные нам замыкания - подвид продолжений.

Возможность получать продолжения от какого-то конкретного заранее заданного момента называется delimited continuations. Возможность по желанию различать такие моменты - named delimited continuations.

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

Так вот представьте, что каждая функция могла бы отдельным специальным аргументом принимать функцию, которую можно было бы вызвать с текущим продолжением и получить в него от неё ответ. Или не получить. Напоминает что-нибудь? Вот именно!

Все вместе это называется системами / обработчиками эффектов. Другая штука, которую можно ими описать – обработка ошибок. Тут уже do будет устанавливать хендлер, a throw его вызывать. Только continuation всегда будет игнорироваться. Туда-же, кстати, continue и break в циклах.