同じasync/awaitでも言語ごとに挙動が全く違う、その設計空間を探る
A Design Space Exploration of Async/Await

async/awaitはどの言語でも同じように見えるが、実際の実行意味論は大きく異なる。Brown大学の研究チームが7つのランタイム(Asyncio、C#、JavaScript、Tokio、Smol、Trio、Swift)を比較したところ、単純なバックグラウンドログ書き込みプログラムでも4種類の出力があり、3つのバリエーションでは全て異なる結果になった。論文ではEagernessやExtentなど9つの設計次元を特定し、形式意味論で差異を説明している。
7つのランタイム全体で、この単純なプログラムの3つのバリエーションに対して、同じ出力を生成するものは2つとして存在しない!
HNでの議論
37- spankalee
うわ、これは本当に役に立つしタイムリーだ!
async/await を備えた新しい言語を作っているんだけど、こうした決定の多くを自分で下さなきゃいけなくて、でも自分を地に足つけるためのこんなに整理されたフレームワークはなかった。ほとんど Trio で、少し JavaScript を選んでいることがはっきりわかって嬉しい。
俺の言語(Zena)の async ドキュメントページ:https://zena-lang.dev/guide/async/ 一度見直して、決定ポイントをもっと明示的に挙げてみようと思う。
fwiw、Trio の作者によるキャンセルについてのこの記事はとても説得力があると思った:https://vorpus.org/blog/timeouts-and-cancellation-for-humans... そして Zena のキャンセル設計はこれをベースにしている。
追記:Cancellation のセクションに JavaScript の AbortSignal も含めてほしかった。良いからではなく、キャンセルトークンを渡すというパターンが存在するから。誰がキャンセルできるのか、そして AbortSignal のようにタスクがキャンセルチェックにオプトインしなければならないのか、という次元もある。
- biorach
async ランタイム間で重要な根本的な実装上の選択があることはずっと明らかだったけど、_9つ_ もの設計次元? すごい。
async は言語の自己完結的で比較的単純な側面のように見えるという点で deceptive だと思う。でも多くの設計上の選択があり、それらはすべて広い影響を持つ。
さらに、これらの次元の多くの含意は完全には理解されておらず、集合的に、それらが実装でどう展開しているかをまだ理解しようとしているのだと思う。これに、いくつかの含意の微妙な性質と組み合わせが加わる...
良い比較は、プログラミング言語におけるレキシカルスコープ対ダイナミックスコープだと思う。これはプログラミング言語設計の初期に10年か20年議論された設計次元だ。時間が経ち、具体的な実装を扱うことで経験が得られるにつれて、レキシカルスコープがデフォルトの選択であるべきで、ダイナミックスコープは様々なニッチに制限されるべきだと明らかになった。
- jcelerier
「願わくば C++ はこれらの軸を横断して選べるようにしてくれて、目の前の問題に最適な async プリミティブを自分で構築できるようにしてほしい」と思っていたら、その通りだった!
> Table 1 で提供される分類において、C++ を特定の設計点に帰属させることはできない。なぜなら各軸は設定可能だからだ。エレガントで中立ではあるが、完全なプログラマビリティという選択は各ライブラリを async DSL にしてしまう。同じ言語内のプロジェクト間での知識の移転が極めて難しくなる。
これらの軸と、特定の設計ではなく自分の特定の問題を解決するものを考えるなら、そうではない。例えば、想像できる最も単純なプログラムを考えてみよう:ネットワークビデオプレイヤー。たとえば、あるサーバーが RTP の音声と映像フレームを送ってきて、それを正しく再生しなければならず、その上に素敵な GUI がある。
これを可能な限り効率的に行いたいなら、async 相互運用のあらゆる可能な方法を認識する必要がある:
- コルーチンが輝く古典的なネットワークステートマシンでネットワークに接続しパケットを受信する
- ビデオフレーム表示の vsync 対 非 vsync の処理
- 使いたいハードウェアビデオデコードシステムが提供する async パラダイムに従う。例えば Intel QuickSync 対 VideoToolbox 対 NVDEC...
- プルモードで駆動される音声再生の同期モデルの処理
- 音声/映像間の同期の処理、したがって音声スレッドができないマルチスレッディングを支える async パターン […]
- biorach
ついに誰かが、俺がずっと頭の中で整理しようとして失敗し続けてきた、あの退屈なクソ全部をじっくり読み解く時間を取ってくれた。
- hankbond
> あなたは JavaScript 開発者に違いない。
それを個人的に受け止めた