
Reo [ 1 ] [ 2 ]は、個々のプロセスを完全なシステム(広義)に構成する協調プロトコルをプログラミングおよび分析するためのドメイン固有言語です。Reo で構成できるシステムのクラスの例としては、コンポーネントベースシステム、サービス指向システム、マルチスレッドシステム、生物学的システム、および暗号プロトコルなどがあります。Reo はグラフィカルな構文を持ち、コネクタまたは回路と呼ばれるすべての Reo プログラムは、ラベル付き有向ハイパーグラフです。このようなグラフは、システム内のプロセス間のデータフローを表します。Reo には形式意味論があり、これはさまざまな形式検証技術とコンパイルツールの基礎となっています。
Reoでは、並行システムは、コンポーネント間でデータの流れを可能にする回路によって結合された一連のコンポーネントで構成されます。コンポーネントは、接続されている回路の境界ノードに対してI/O操作を実行できます。I/O操作には2種類あります。putリクエストはデータ項目をノードに送信し、getリクエストはノードからデータ項目を取得します。すべてのI/O操作はブロッキング操作であり、コンポーネントは保留中のI/O操作が正常に処理された後にのみ次の操作に進むことができます。
右上図は、3つの構成要素からなる生産者・消費者システムの例を示しています。左側に2つの生産者、右側に1つの消費者が配置されています。中央の回路はプロトコルを定義しており、生産者はデータを同期的に送信し、消費者はそれらのデータを交互に受信するというものです。
正式には、回路の構造は次のように定義されます。
定義1.回路は三重関係であるどこ:
そのためすべての。 もし がチャネルである場合、Iはcの入力ノードの集合と呼ばれ、Oはcの出力ノードの集合と呼ばれます 。
回路のダイナミクスは、電子回路を流れる信号の流れに似ている。
ノードは、マージ/レプリケーターの動作が固定されています。つまり、いずれかの入力チャネルのデータは、保存や変更を行うことなく、すべての出力チャネルに伝播されます(レプリケーター動作)。複数の入力チャネルからデータが得られる場合、ノードはそれらのチャネルの中から非決定的な選択を行います(マージ動作)。入力チャネルのみ、または出力チャネルのみを持つノードは、それぞれシンクノードまたはソースノードと呼ばれ、入力チャネルと出力チャネルの両方を持つノードは混合ノードと呼ばれます。
ノードとは対照的に、チャネルはタイプによって表現されるユーザー定義の動作を持ちます。つまり、チャネルは通過するデータ項目を保存したり変更したりできます。すべてのチャネルは正確に2つのノードを接続しますが、これらのノードは入力ノードと出力ノードである必要はありません。たとえば、右上図の垂直チャネルには2つの入力がありますが、出力はありません。チャネルタイプは、データに関するチャネルの動作を定義します。以下に、一般的なタイプの一覧を示します。
協調言語を分類する一つの方法は、その場所に基づいて分類することです。協調の場所とは、協調活動が行われる場所を指し、協調モデルと言語を内生的または外生的に分類します。[ 3 ] Linda のような内生的モデルと言語は、計算の協調のために計算内に組み込む必要のあるプリミティブを提供します。このようなモデルを使用するアプリケーションでは、各モジュールの協調に影響を与えるプリミティブは、モジュール自体の中にあります。対照的に、Reo は、外部からエンティティの協調をサポートするプリミティブを提供する外生的言語です。外生的モデルを使用するアプリケーションでは、各モジュールの協調に影響を与えるプリミティブは、モジュール自体の外にあります。
内生モデルは、特定のアプリケーションにとってより自然な場合もあります。しかし、一般的には、調整プリミティブと計算コードが混在することになり、計算のセマンティクスと調整プロトコルが絡み合います。この混在によって、通信/調整プリミティブがソースコード全体に散在し、アプリケーションの協力モデルと調整プロトコルが曖昧で暗黙的なものになります。つまり、アプリケーションの協力モデルや調整プロトコルとして識別できるソースコードが存在せず、アプリケーションの他のコードから切り離して設計、開発、デバッグ、保守、再利用することはできません。一方、外生モデルは、調整モジュールを、調整対象となる計算モジュールとは別個に開発することを促します。その結果、アプリケーションの調整コンポーネントの設計と開発に多大な労力を費やした結果、理解しやすく、他のアプリケーションでも再利用できる具体的な「純粋な調整モジュール」として実現できます。
Reo回路は構成可能です。つまり、より単純な回路を再利用することで、複雑な回路を構築できます。より具体的に言うと、2つの回路を境界ノードで結合して、新しい結合回路を形成できます。他の多くの並行処理モデル(例えばπ計算)とは異なり、合成によって同期性が維持されます。つまり、ノードAとBの間で同期フローを持つ回路と、ノードBとCの間で同期フローを持つ別の回路を合成すると、結合回路ではノードAとCの間で同期フローを持つことになります。言い換えれば、2つの同期回路を合成すると、同期回路が生成されます。
Reo回路のセマンティクスは、その動作の形式的な記述である。Reoにはさまざまなセマンティクスが存在する。[ 4 ]
歴史的に、Reo の最初の意味論は、ストリーム (つまり、無限シーケンス) の共代数的概念に基づいていました。 [ 5 ]この意味論は、データ項目のストリームと単調増加するタイムスタンプ (実数) のストリームからなるペアである、時間付きデータ ストリーム の概念に基づいています。すべてのノードをこのような時間付きデータ ストリームに関連付けることで、チャネルの動作を、接続されたノード上のストリームの関係としてモデル化できます。
その後、制約オートマトンと呼ばれるオートマトンベースの意味論が開発されました。[ 6 ] 制約オートマトンとは、遷移ラベルが同期制約とデータ制約で構成されるラベル付き遷移システムです。同期制約は、遷移によってモデル化された実行ステップでどのノードが同期するかを指定し、データ制約は、これらのノード上でどのデータ項目が流れるかを指定します。
制約オートマトン(および時間付きデータストリーム)の制限の 1 つは、チャネルの動作が保留中の I/O 操作の可用性(または非可用性)に依存するような、コンテキスト依存の動作を直接モデル化できないことです。たとえば、制約オートマトンを使用すると、出力ノードに保留中の get-request がない場合にのみデータを失う LossySync の動作を直接モデル化することは不可能です。この問題を解決するために、コネクタカラーリングと呼ばれる Reo の別のセマンティクスが開発されました。[ 7 ]
Reoの他の意味論では、時間付き[ 8 ]または確率的[ 9 ]動作をモデル化することが可能になります。
拡張可能な調整ツール(ECT)は、Reo 用の統合開発環境(IDE)を構成するEclipse用プラグイン群です。ECT は、回路を描画するためのグラフィカルエディタと、回路内のデータフローをアニメーション化するためのアニメーションエンジンで構成されています。コード生成に関しては、ECT には Reo-to-Java コンパイラが含まれており、制約オートマトンの意味論に基づいて回路のコードを生成します。具体的には、Reo 回路を入力すると、その回路をモデル化する制約オートマトンをシミュレートする Java クラスを生成します。検証に関しては、ECT には Reo 回路をmCRL2のプロセス定義に変換するツールが含まれています。ユーザーはその後、mCRL2 を使用して、 μ 計算プロパティ仕様に対するモデル検査を行うことができます。(あるいは、Vereofy モデルチェッカーも Reo 回路の検証をサポートしています。)
Reoの別の実装はScalaプログラミング言語で開発されており、回路を分散的に実行します。[ 10 ]