Hacker News Digest

09 сентября 2026 г. в 13:59 • cel.cs.brown.edu • ⭐ 463 • 💬 134

Original • HN

#async-await#cold-start#concurrency#design-space#destruction#eagerness#extent#hot-start#reference-strength#runtime

A Design Space Exploration of Async/Await

Семь современных языков реализуют async/await по-разному, что приводит к разным результатам даже для простых программ. В примере с фоновой записью в лог и последующим выводом «C» наблюдаются четыре варианта вывода: ничего, «A», «AB» или «ACB». Это зависит от того, насколько «жадно» запускается задача (Eagerness), как долго она живёт (Extent), как хранится ссылка на неё (Reference Strength) и как происходит её уничтожение (Destruction). Например, в некоторых языках задача начинает выполняться сразу при spawn («hot start»), в других — только при await («cold start»). В некоторых runtime задачи живут вечно, пока не будут явно awaited, в других — ограничены областью порождения. Эти различия формализованы в девяти измерениях дизайна, сгруппированных по жизненному циклу задачи: начало жизни, конец жизни и отмена. Ни одна из семи реализаций не даёт одинаковогоOutput для всех трёх вариантов теста, что показывает, что знание async/await в одном языке не переносится на другой без уточнения семантики. Чтобы понять поведение своего языка, нужно явно знать, где он находится в этом пространстве дизайна. Подробности — в статье «A Design Space Exploration of Async/Await».