0

別のスクリプト言語を使用することは別として、node.jsの主な魅力は、イベント駆動型プログラミングのサポートであるように思われます。これにより、単純化された非I/O呼び出しをブロックします。ただし、この機能には、コールバック関数の後にコールバックを渡す必要がある新しいプログラミングモデルを学習する必要があるという犠牲が伴います。これにより、いくつかの単純なタスク(たとえば、依存するアクションのシーケンス)が少し複雑になります。

そのプログラミングモデルを、すべてのI / O操作をブロックし(事実上)シングルスレッド(MRIのグリーンスレッド実装のため)であるRubyonRailsの従来のモデルと比較してください。

ここで大声で夢を見ているだけで、I / O呼び出しをトラップし、非ブロッキングバージョンに透過的に置き換え、現在の継続を保存して呼び出すことで、これらのモデルを調整するRuby(またはRails)ランタイムを実装できるはずです。 I/O操作が完了したとき。このようにして、使い慣れた手続き型プログラミングスタイルと、イベント駆動型/非同期/コールバックモデルの利点を得ることができます。

そのようなランタイム(またはランタイムトランスレータ)は技術的に可能ですか?すでにこのようなことをするWebフレームワークはありますか?

4

2 に答える 2

2

はい。

非同期であるが命令型プログラミングを行うには2つの可能性があります

実際の非同期言語を使用します。

Erlangは、命令型でこれを実行し、そのコードを実行すると、非同期に変換される例です。でも、うまくいくとは思いません。

コンパイラを使用する

ブロッキングスタイルコードを非ブロッキングコードに変換するコンパイラを使用できます。これはブラックボックスであり、デバッグするのは悪夢なので、個人的にはこれに反対することを強くお勧めします。

一例は嵐です

ただし、この機能には、コールバック関数の後にコールバックを渡す必要がある新しいプログラミングモデルを学習する必要があるという犠牲が伴います。これにより、いくつかの単純なタスク(たとえば、依存するアクションのシーケンス)が少し複雑になります。

ただし、弾丸を噛んでパラダイムを切り替えることをお勧めします。これは、長期的にははるかに優れた投資になります。node.jsを使用する必要はありませんが、erlangやhaskellなどの強力な代替手段があります。

于 2011-06-25T07:46:51.133 に答える
0

@igorwのおかげで、async-railsプロジェクトは私が想像していたものです。

しかし、@ Raynosと@apneadivingが指摘しているように、RubyEventMachineやstormjsなどのより優れたソリューションが存在する可能性あります

于 2011-06-27T20:53:15.567 に答える