コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「Strand」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
m ボット: 言語間リンク 1 件をウィキデータ上の (d:Q7621223 に転記)
Cewbot (会話 | 投稿記録)
m Bot作業依頼: sourceタグをsyntaxhighlightタグに置換 (Category:非推奨のsourceタグを使用しているページ) - log
25行目: 25行目:
== プログラム例 ==
== プログラム例 ==
2本のストリームをマージして1本のストリームにするStrandプログラムの例を以下に示す。[[Prolog]]と同様、A や Xs など英大文字で始まる項は変数を表す。
2本のストリームをマージして1本のストリームにするStrandプログラムの例を以下に示す。[[Prolog]]と同様、A や Xs など英大文字で始まる項は変数を表す。
<source lang="prolog">
<syntaxhighlight lang="prolog">
merge([A|Xs],Ys,Zs0) :- true | Zs0:=[A|Zs], merge(Xs,Ys,Zs).
merge([A|Xs],Ys,Zs0) :- true | Zs0:=[A|Zs], merge(Xs,Ys,Zs).
merge(Xs,[A|Ys],Zs0) :- true | Zs0:=[A|Zs], merge(Xs,Ys,Zs).
merge(Xs,[A|Ys],Zs0) :- true | Zs0:=[A|Zs], merge(Xs,Ys,Zs).
merge([],Ys,Zs) :- true | Zs:=Ys.
merge([],Ys,Zs) :- true | Zs:=Ys.
merge(Xs,[],Zs) :- true | Zs:=Xs.
merge(Xs,[],Zs) :- true | Zs:=Xs.
</syntaxhighlight>
</source>


例えば、上記プログラムの最初の節では、最初の引数が[A|Xs]のようなリストの形になっていない場合は中断し、他のプロセスにより[A|Xs]の形に具体化された(具体的に値が決まった)場合に実行を再開する。この時点でXs自体は具体化されていなくても構わないため、リストの先頭からインクリメンタルに具体化されるストリームを素直に処理できる。
例えば、上記プログラムの最初の節では、最初の引数が[A|Xs]のようなリストの形になっていない場合は中断し、他のプロセスにより[A|Xs]の形に具体化された(具体的に値が決まった)場合に実行を再開する。この時点でXs自体は具体化されていなくても構わないため、リストの先頭からインクリメンタルに具体化されるストリームを素直に処理できる。

2020年7月5日 (日) 23:02時点における版

Strand
パラダイム 並行論理プログラミング
登場時期 1989年
設計者 Ian Foster 他
型付け 動的型付け
主な処理系 Strand88
影響を受けた言語 PrologRelational LanguageConcurrent PrologPARLOGGuarded Horn Clauses
影響を与えた言語 PCN
テンプレートを表示

Strandは、1989年に発表された商用ベースの並行論理プログラミング言語である。Ian FosterとStephen Taylorにより設計された。開発はArtificial Intelligence Limitedで行われ、1989年のBritish Computer Society Awardを受賞した[1]。販売はStrand Software Technologies Inc.から行われた。この言語はErlang開発初期にベース言語としても使われた。[2]

概要

Strandは並行プログラミングのためのプログラミング言語で、論理変数を介して通信を行う複数の軽量プロセスのネットワークとしてプログラムを記述する。言語仕様や考え方はそれ以前に開発されたPARLOG第五世代コンピュータプロジェクトで開発されたGuarded Horn Clausesと非常によく似ている。 Strandではホーン節ガードを導入した以下のような規則の集まりでプログラムを記述する。

Head :- G1, ..., Gn| B1, ..., Bm.  (n,m≧0)

HeadとG1, ..., Gnはプロセス書き換えのための条件、B1, ..., Bmは書き換え後のプロセスを表す。生成されたプロセスは全て並行に実行される。プロセス間の通信にはプロセスで共有する論理変数を使用する。書き換え規則の適用に十分な情報がなければ書き換えを中断し、判断に必要な情報が得られるまで待つことで、プロセス間の同期が行われる。ストリームは論理変数を含んだリストとして表現する。論理変数を共有するプロセスの数に制限はないため、ストリーム通信は1対1だけではなく1対Nのブロードキャストなど、様々な形態が可能である。

StrandはFortranやC言語とのインタフェースを持ち、また個々のプロセスを実行するプロセッサーを指定するためのプラグマを持っていた。

プログラム例

2本のストリームをマージして1本のストリームにするStrandプログラムの例を以下に示す。Prologと同様、A や Xs など英大文字で始まる項は変数を表す。

merge([A|Xs],Ys,Zs0) :- true | Zs0:=[A|Zs], merge(Xs,Ys,Zs).
merge(Xs,[A|Ys],Zs0) :- true | Zs0:=[A|Zs], merge(Xs,Ys,Zs).
merge([],Ys,Zs) :- true | Zs:=Ys.
merge(Xs,[],Zs) :- true | Zs:=Xs.

例えば、上記プログラムの最初の節では、最初の引数が[A|Xs]のようなリストの形になっていない場合は中断し、他のプロセスにより[A|Xs]の形に具体化された(具体的に値が決まった)場合に実行を再開する。この時点でXs自体は具体化されていなくても構わないため、リストの先頭からインクリメンタルに具体化されるストリームを素直に処理できる。

関連項目

参考文献

  • Foster, I.,and Tayler, S.(ed) Strand: New Concepts in Parallel Programming. Prentice Hall 1990, ISBN 978-0138505875
  1. ^ BCS IT Awards: 1973 - 1999. 2010年1月22日検索
  2. ^ Foster, I.,and Tayler, S.(ed) Strand: New Concepts in Parallel Programming. p.288-304