
Дослідження Брауна: async/await поводиться по-різному в кожній мові
Лабораторія Брауна показує: сім сучасних середовищ async дають чотири різні результати навіть для крихітної програми, і описує дев'ять вимірів, що стоять за цією розбіжністю.
Нова стаття Cognitive Engineering Lab Університету Брауна досліджує, як поводиться async/await у семи сучасних середовищах виконання — і виявляє, що вони узгоджуються значно менше, ніж підказує спільний синтаксис. Пост опублікував Гевін Ґрей 8 вересня 2026 року.
Маленька програма, чотири відповіді
Понад п'ятнадцять років мови сходяться на «прямолінійній асинхронності» — щоб конкурентний код виглядав як звичайний лінійний (Python, Rust, Swift). Але невеликий псевдокод показує розбіжність: write_to_log друкує «A», чекає двосекундний sleep і друкує «B»; fire_and_forget запускає цю функцію фоновим завданням і повертається, не чекаючи на неї; main чекає на fire_and_forget, засинає на секунду й друкує «C». Сім середовищ — Asyncio, C#, JavaScript, Tokio, Smol, Trio і Swift — дають чотири різні відповіді, а серед трьох варіацій програми жодні два не видають однаковий результат.
Гарячий і холодний запуск, дев'ять вимірів
Частина пояснення — «нетерплячість»: гарячий запуск повертає завдання, яке вже виконується в середовищі, холодний — інертний об'єкт, що нічого не робить до await; Python і Rust оцінюють ліниво. Стаття виокремлює дев'ять таких проєктних вимірів — рішень, що змінюють спостережувану семантику виконання, а не лише продуктивність, — і групує їх у три категорії: початок життя, кінець життя та скасування.
Чому Swift друкує «AC», а Trio — «ABC»
У прикладі домінують два виміри. За динамічної області дії завдання не може пережити функцію, яка його породила, — це обрали Swift і Python з Trio. Вони різняться знищенням: Swift скасовує завдання, а Trio ввічливо чекає на його завершення. Тому Swift друкує «AC», а Trio — «ABC». Скасування відрізняється й за іншими ознаками: обізнаність, стійкість (завдання може проігнорувати скасування й продовжити роботу або залишитися скасованим) і напрям поширення сигналу — згори вниз, знизу вгору чи одночасно до всіх залежностей.
Числення за проєктним простором
Щоб зробити простір точним, автори переклали його у формальну семантику на базовому численні асинхронних програм. Траси абстрактної машини підсвічують семантичні рішення, які розводять виконання, і крок за кроком пояснюють, чому програми розходяться. Кожен вимір — компроміс між продуктивністю, пам'яттю, ергономікою та семантикою; правильних відповідей немає, і кожна мова має власне обґрунтування — але навіть крихітні програми потребують серйозних пояснень.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.