Joyce(プログラミング言語)
| ジョイス | |
|---|---|
| パラダイム | 同時実行、命令型、構造化 |
| 家族 | ヴィルト・ パスカル |
| デザイン: | ペル・ブリンチ・ハンセン |
| 初登場 | 1987年 |
| 安定版リリース | 1 / 1987 |
| タイピングの規律 | 強い |
| 影響を受けた | |
| 通信シーケンシャルプロセス、Pascal、並行Pascal | |
| 影響を受けた | |
| スーパーパスカル | |
Joyceは、1980年代にPer Brinch Hansenによって設計された、並行コンピューティングのための安全なプログラミング言語です。 [1]逐次言語Pascalと、逐次プロセス通信(CSP)の原理に基づいています。Joyceは、プログラミング言語としてCSPに適用する際の欠点を解消し、主に教育用に分散コンピューティングシステムの実装ツールを提供するために開発されました。
この言語はエージェントの概念に基づいています。エージェントとは、チャネルとメッセージパッシングのみを使用して通信する、並行して実行されるプロセスです。エージェントはサブエージェントを動的かつ再帰的に起動できます。Joyceの開発は、1993年頃にHansenによって開発された言語SuperPascalの基礎となりました。
特徴
JoyceはPascalの小さなサブセットをベースに、並行処理のためのCSPからヒントを得た機能を拡張したものです。[2]次のセクションでは、導入されたいくつかの斬新な機能について説明します。
エージェント
エージェントは、一連の文と、場合によっては他のエージェントのネストされた定義から構成される手続きです。エージェントは、作成者と並行して実行されるサブエージェントを動的に起動できます。エージェントは、すべてのサブエージェントが終了した場合にのみ終了できます。例えば、エージェントは次のように起動します。process2process1
エージェントプロセス1 ( x , y :整数) ; 始める ...終わり;エージェントプロセス2 () ; プロセス1を使用します。 始める プロセス1 ( 9 , 17 ) ; 終わり;エージェントが活性化されると、すべてのローカル変数の新しいインスタンスが作成され、各仮パラメータの値はローカル変数にコピーされます。したがって、エージェントは他のエージェントの変数にアクセスできず、チャネルを介してのみ通信できます。この制限により、共有変数の使用に伴う競合状態などの問題が回避されます。
コミュニケーション
エージェントは、チャネルと呼ばれるエンティティを介して通信します。チャネルにはアルファベットがあり、送信可能なシンボルの集合を定義します。チャネルは動的に作成され、ポート変数を用いてアクセスされます。ポートの型は、アルファベットを構成する一連のシンボルによって定義されます。複数の値を持つシンボルは、特定の型で定義されます。例えば、次のようになります。
ストリーム= [ int (整数) , eos ] ; シンボルは、任意の整数値を持つメッセージシンボルint(integer)を表します。2番目の型なしシンボル宣言(ストリームの末尾)は、シグナルと呼ばれます。ポート型が定義されると、その型のポート変数を宣言できます。inteos
出力: ストリームin : ストリームそして、それを作成したエージェント内部のチャネル エンティティは、次のようにアクティブ化できます。
+アウト;?シンボルは、CSP形式の入力演算子と出力演算子を用いて、チャネル上で送受信できます!。通信は、送信エージェントと一致する受信エージェントが存在する場合にのみ発生します。受信エージェントは、送信されたシンボルの型を受信することを期待する必要があります。例えば、値9に続いてeosシンボルがポート に送信されますout。
アウト!int (9 )アウト!eos そして、整数メッセージが一致する型の変数に受信され、その後に次のメッセージが続きますeos。
受信: ? int ( received ) in ? eosの整数 世論調査の声明
ポーリング文は、CSPのガード付き選択肢の概念に基づいています。ポーリング文は、入力チャネル文によってガードされた複数の文のセットで構成されます。送信エージェントとガードの間で通信が一致すると、ガードが実行され、その後に対応する文が実行されます。例えば、次のようになります。
世論調査 ? X -> x := x + 1 | で ? Y -> y := y + 1 で終わりポートがin信号Xまたはに対して監視されている場合Y、一致する通信では、対応する変数xまたはyが増分されます。
安全
Joyce は、コンパイラが言語規則のすべての違反を検出できるという意味で、安全な言語となるように設計されました。
サンプルプログラム
以下は、Joyceプログラミング言語の原論文[1]から抜粋した完全なサンプルプログラムです。この論文では、素数生成のためのふるい分け手法に基づいて素数を生成するアルゴリズムを実装しています。sieveエージェントは、前のエージェントから整数のストリームを受け取ります。最初のストリームは素数です。エージェントはストリームからこの素数の倍数をすべて削除し、後続のエージェントを起動します。この処理は、eos信号がふるいの集合に沿って伝播するまで続けられます。
agent sieve(inp, out: stream);var more: boolean; x, y: integer; succ: stream;begin poll inp?int(x) -> +succ; sieve(succ, out); more := true | inp?eos -> out!eos; more := false end; while more do poll inp?int(y) -> if y mod x <> 0 then succ!int(y) | inp?eos -> out!int(x); succ!eos; more := false end;end;The following agent initialises the set of sieve agents and inputs into them a stream of integers between 3 and 9999.
agent primes;use generate, sieve, print;var a, b: stream;begin +a; +b; generate(a, 3, 2, 4999); sieve(a, b); print(b)end;Implementation
Stack allocation
エージェント手続きの同時実行のため、エージェント呼び出しのアクティベーションレコードが後入先出パターンに従わないため、従来の順次スタック割り当て方式は使用できません。代わりに、作成者とサブエージェントの関係がツリー構造のスタックを形成します。この動作を実装するために、新しいアクティベーションレコードをスタックの先頭に割り当て、サブエージェントのアクティベーションレコードをその作成者のレコードにリンクするという単純な方式が使用されています。これらのレコードは、エージェントが終了し、スタックの先頭になった場合にのみ解放されます。[3]この方式の有効性はプログラムの構造と動作に依存し、場合によってはメモリの使用効率が悪くなります。より効果的な方式がHansenの言語SuperPascalに実装されました。
参考文献
- ^ ab Hansen, Brinch (2002). 「Joyce: 分散システムのためのプログラミング言語」. ハンセン、パー・ブリンチ編. 『並行プログラミングの起源:セマフォからリモートプロシージャコールまで』. ニューヨーク、ニューヨーク:シュプリンガー. pp. 464– 492. doi :10.1007/978-1-4757-3472-0. ISBN 978-1-4419-2986-0. S2CID 44909506。
- ^ ハンセン、ブリンチ(1989年6月)「ジョイス言語レポート」『ソフトウェア:実践と経験』19(6). John Wiley & Sons: 553–578 . doi :10.1002/spe.4380190606. S2CID 30474491.
- ^ Hansen, Brinch (1989年6月). 「Joyceのマルチプロセッサ実装」 .ソフトウェア:実践と経験. 19 (6). John Wiley & Sons: 579– 592. doi :10.1002/spe.4380190606. S2CID 30474491.
外部リンク
- 公式ウェブサイト、ブリンチ・ハンセン・アーカイブ、彼の文書集