Async/Awaitの設計差異を論文が解明

原題: A Design Space Exploration of Async/Await

なぜ重要か

多言語環境が当たり前となった現代の開発現場で、Async/Awaitの意味論的差異は移植バグや競合状態の温床になりうる。

Brown大学のCognitive Engineering LabのGavin Grayが2026年9月8日に発表した論文「A Design Space Exploration of Async/Await」によると、Python・Rust・C#・JavaScript・Swiftなど7つの非同期ランタイムは、同一の擬似コードプログラムに対して最大4通りの異なる出力を生成することが判明した。言語間のAsync/Await実装が想定以上に大きく乖離していることを体系的に示した研究である。

「Async/Awaitは直感的な並行処理の記法だ」という共通認識は、実は幻想かもしれない。Brown大学のCognitive Engineering Labが公開したこの論文は、過去15年以上にわたって各言語に実装されてきたAsync/Awaitの設計を比較分析し、驚くほど大きな意味論的差異があることを示した。

研究チームは、バックグラウンドタスクとしてログ書き込みを行うだけの短い擬似コードプログラムを用意し、7つのランタイム(JavaScript・C#・Python(Asyncio・Trio)・Rust(Tokio・Smol)・Swift)で動作を検証した。結果は4通りに分かれ、さらに3つのバリエーションを加えると、どの2つのランタイムも同一の出力を返さなかった。

論文では、こうした差異を生む設計上の決定を「非同期設計次元(async design dimension)」と定義し、9つの次元を特定した。これらはタスクのライフサイクルに沿って3カテゴリに整理されている。

**タスク開始時(Start of Life)**

- 「Eagerness(即時性)」:関数呼び出し時にすぐ実行する「hot start」(C#・JavaScript)か、awaitまで待機する「cold start」(Python・Rust)か。

- 「Suspension(中断保証)」:awaitポイントで必ず中断するか(JavaScript)、保証なしか(C#・Swift・各Rustランタイム)。

**タスク終了時(End of Life)**

- 「Extent(存在期間)」:タスクがランタイム終了まで存在するか(JavaScript・C#・Tokio・Smol・Asyncio)、生成スコープの終了で消えるか(Swift・Trio)。

- 「Reference Strength」:ランタイムがタスクへの強参照を持つか(JavaScript・C#・Tokio)、弱参照か(Asyncio・Smol)。

- 「Destruction(後処理)」:タスクをawaitして完了させるか(JavaScript・Trio)、キャンセルするか(Swift・Tokio・Smol・Asyncio)、プログラムを終了させるか(C#)。

**キャンセル(Cancellation)**

未awaitのタスクで例外が発生した際の「Propagation(伝播方式)」についても、言語によって破壊的・非破壊的など挙動が異なる。

この研究は、プログラマが「Async/Awaitは同じもの」と思い込んで言語を移行したり、ドキュメントを参照せずにコードを書いたりすることの危険性を具体的なデータで裏付けている。

出典

cel.cs.brown.edu — 元記事を読む →