GolangとCSP-Languageの主な違いはHoareによる質問です

GolangとCSP-Languageの主な違いはHoareによる質問です

この声明を見てくださいトニー・ホーアの1978年の論文の例:

Go の設計は Hoare の論文に強く影響を受けています。Go は論文で使用されている例の言語とは大きく異なりますが、それでも例は比較的簡単に翻訳できます。構文以外の最大の違いは、Go が並行通信の導管を明示的にチャネルとしてモデル化するのに対し、Hoare の言語のプロセスは Erlang と同様に互いに直接メッセージを送信することです。Hoare はセクション 7.3 でこの可能性を示唆していますが、「各ポートは別のプロセスの 1 つのポートに正確に接続されています」という制限があります。その場合、それは主に構文上の違いになります。

私は混乱しています。

Hoare 言語のプロセスは互いに直接通信します。Go ルーチンもチャネルを使用して互いに直接通信します。

では、Golang の制限はどのような影響を与えるのでしょうか。実際の違いは何でしょうか?

ベストアンサー1

その答えを得るには、CSP に関する Hoare の研究をより深く理解する必要があります。彼の研究の進展は、次の 3 つの段階にまとめることができます。

  • ダイクストラのセマフォに基づいて、ホーアはモニターこれらはJavaで使用されているのと同じですが、Javaの実装には間違いがあります(Welchの記事を参照)。鶏がいない)。Java が Hoare の後の研究を無視したのは残念です。

  • CSP はここから生まれました。当初、CSP ではプロセス A からプロセス B への直接交換が必要でした。このランデブー アプローチは、Ada と Erlang で使用されています。

  • CSPは1985年に完成し、彼の本が初めて公開されました。このCSPの最終バージョンには、Goで使用されるチャネルが含まれています。オックスフォードのHoareのチームとともに、David Mayは同時にオッカムは、CSPを実用的なプログラミング言語に意図的に融合させた言語です。CSPとオッカムは互いに影響し合っています(例えば、オッカムプログラミングの法則長年、OccamはCSPに適したアーキテクチャを持つTransputerプロセッサでのみ利用可能でした。最近では、オッカムは開発した他のプロセッサをターゲットにし、他の一般的な同期プリミティブとともに円周率計算も取り入れました。

したがって、元の質問に答えるには、Go を CSP と Occam の両方と比較すると役立つでしょう。

  1. チャネル: CSP、Go、Occam はすべてチャネルに対して同じセマンティクスを持っています。さらに、Go ではチャネルにバッファリングを簡単に追加できます (Occam ではできません)。

  2. 選択肢:CSPは、内部そして外部の選択。ただし、Go と Occam の両方には 1 種類の選択があります。選択するGoと代替オッカムでは、2種類のCSP選択があるという事実は、実用的な言語ではそれほど重要ではないことが証明されました。

  3. オッカムの代替条件ガードは許可されますが、Goの選択する(回避策があります:チャンネルエイリアスを次のように設定できます)ゼロ同じ行動を真似する。

  4. モビリティ: Go では、チャネルの端を (他のデータとともに) チャネル経由で送信できます。これにより、動的に変化するトポロジが作成され、CSP で可能な範囲を超えますが、Milner の円周率計算は、このようなネットワークを記述するために (CCS から) 開発されました。

  5. プロセス: goroutine はフォークされたプロセスです。必要なときに終了し、親を持ちません。これは、プロセスが合成的である CSP / Occam とはあまり似ていません。

ここで例を挙げると次のようになります: まずオッカム (インデントは重要です)

SEQ
  PAR
    processA()
    processB()
  processC()

そして2番目は

go processA()
go processB()
processC()

Occam の場合、processC は processA と processB の両方が終了するまで開始されません。Go では、processA と processB は非常に速くフォークし、その後 processC がすぐに実行されます。

  1. 共有データ: CSP は実際にはデータに直接関係していません。しかし、共有データに関して Go と Occam の間に重要な違いがあることは興味深いことです。複数の goroutine が共通のデータ変数セットを共有する場合、競合状態が発生する可能性があります。Go の優れた競合検出器は、問題を排除するのに役立ちます。しかし、Occam は異なるスタンスを取ります。共有された可変データは、コンパイル時に防止されます。

  2. エイリアス: 上記に関連して、Go では各データ項目を参照するために多くのポインターを使用できます。このようなエイリアスは Occam では禁止されているため、競合状態を検出するために必要な労力が軽減されます。

最後の 2 つの点は、Hoare の CSP に関するものではなく、May の Occam に関するものです。ただし、安全な並行コーディングに直接関係するため、関連性があります。

おすすめ記事