私はどちらのモデルが優れているかについての議論の状況について十分な情報を得ていないので、かなり率直な質問をしたいと思います: 2 つの対立する意見が本当に論争を激化させているように見えますか? たとえば、プロトタイプ/クラス ベースの OOP や動的型付けと静的型付けのようなものです。
(これらは実際にはあまり適切な例ではありませんが、私の質問をより明確に表現する方法がわかりません)
私はどちらのモデルが優れているかについての議論の状況について十分な情報を得ていないので、かなり率直な質問をしたいと思います: 2 つの対立する意見が本当に論争を激化させているように見えますか? たとえば、プロトタイプ/クラス ベースの OOP や動的型付けと静的型付けのようなものです。
(これらは実際にはあまり適切な例ではありませんが、私の質問をより明確に表現する方法がわかりません)
一部の並行コンピューティング システムでは、並行コンポーネント間の通信はプログラマーから隠されていますが (たとえば、フューチャーを使用することによって)、明示的に処理する必要がある場合もあります。明示的な通信は、次の 2 つのクラスに分けることができます。
共有メモリー通信 並行コンポーネントは、共有メモリー位置の内容を変更することによって通信します (Java および C# で例示されます)。通常、このスタイルの並行プログラミングでは、スレッド間で調整するために何らかの形式のロック (mutex、セマフォ、モニターなど) を適用する必要があります。
メッセージパッシング通信 コンカレントコンポーネントは、メッセージを交換することで通信します (Erlang と ocam がその例です)。メッセージの交換は、非同期的に実行される場合もあれば、メッセージが受信されるまで送信者がブロックするランデブー スタイルを使用する場合もあります。非同期メッセージ パッシングは、信頼できる場合とそうでない場合があります (「送信して祈る」と呼ばれることもあります)。メッセージ パッシングの同時実行は、共有メモリの同時実行よりもはるかに簡単に推論できる傾向があり、通常、並行プログラミングのより堅牢な形式と見なされます。アクター モデルやさまざまなプロセス計算など、メッセージ パッシング システムを理解および分析するためのさまざまな数学的理論が利用可能です。メッセージ パッシングは、共有コヒーレント メモリの有無にかかわらず、対称型マルチプロセッサに効率的に実装できます。
共有メモリとメッセージ パッシングの同時実行には、異なるパフォーマンス特性があります。通常 (常にではありませんが)、プロセスごとのメモリ オーバーヘッドとタスク切り替えオーバーヘッドはメッセージ パッシング システムの方が低くなりますが、メッセージ パッシング自体のオーバーヘッドはプロシージャ コールよりも大きくなります。これらの違いは、多くの場合、他のパフォーマンス要因によって圧倒されます。上記の部分は、非同期通信は信頼できない可能性があることを示していますが、トランザクションキューイングシステム (JMS over MQSeries、OpenMQ など) を使用することで回避できます。
私の2セントの価値。
2 つのパラダイムは競合しません。目的が異なります。非同期通信と同期通信について話しているのです。スケーラビリティを確保するためには、帯域幅に余裕があるときはいつでも別のプロセスを延期したり、結果を処理したりできるため、通常は可能な限り非同期で実行することをお勧めします。アルゴリズムを非同期の作業に分割できるとは限りません。