web-dev-qa-db-ja.com

Cでの非同期関数呼び出しの実装

最近、jsプログラムをCに自動的に変換する汎用のトランスレーターを作成することに取り組みましたが、非同期の動作を考えると行き詰まりました。 ANSI/POSIX Cを使用し、スレッドプール実装用のライブラリの使用のみを許可する場合、Cで非同期関数呼び出しを実装するにはどうすればよいですか。方法論はスレッドセーフでなければなりません。私が自分のアプローチを思いついたとき、このソースがAsynchronous Dispatcherパターンと呼んでいるものを使用することに触発されました: https://doanduyhai.wordpress.com/2012/08/04/design-pattern -the-asynchronous-dispatcher /

5

汎用のJavascriptからCへの自動トランスレーター(つまり、JavascriptからCへのコンパイラー)を作成することを目指していますか?

これは非常にやりがいがあり、特に効率的なJavascriptからCコンパイラー(現在のほとんどのJavascript実装よりも遅くないもの)を作成する場合は、数年の作業が必要になります。

意味的にJavascriptには Scheme (動的型付け、ガベージコレクション、クロージャー、そしておそらくrun-時間評価)、構文が非常に異なる場合でもそのプロトタイプオブジェクトモデルは確かにSchemeにはありませんが、Javascriptモデルに非常に類似したSchemeのプロトタイプオブジェクトモデルの実装を見つけることができます。ですから、Schemeとその正式なセマンティクスを研究し、SchemeからCへの変換プログラム( BiglooChicken 、Stalin、...) Schemeとは対照的に、Javascriptは最初は不明確で(最初の実装は数週間のハックでした!)、JavaScriptで処理するのが面倒ないくつかの不快な特性([] + {}などの結果)があります。 Cトランスレータ。

次に、 C.QueinnecLISP In Small Pieces の本を読むことを強くお勧めします。 Scott'sprogramming language pragmatics 本も読んでください。

JavaScriptの非同期の側面は、 コルーチン および 継続渡しスタイル (別名CPS)に似ています。 Continuation Passing C を調べてください。これは、プログラムをCPC(Cの拡張方言、yieldspawnwait、...非同期計算に使用できるプリミティブ)を、継続渡しスタイル手法を使用してプレーンCに変換します。

あなたの目標がJavascriptのCへの汎用トランスレータではなく、単に手動で特定のJavaScriptプログラムをCに書き換える場合、coroutinescallbacksclosures であり、CPSはまだ評価に役立つ概念です。また、CPCのコードを生成または記述して、CPCコンパイラを使用して通常のCを取得することもできます。

deprecatedsetcontext(3) ルーチンを使用して非同期計算を実装することもできますが、それを使用することはお勧めしません非推奨であり、非常に低いレベル(基本的にはすべてのマシンレジスタを設定します)、どういうわけかマシン固有であり、デバッグが困難です。

もちろん、マルチスレッド化を検討することもできます。 POSIX pthreads またはC11 threads