プラグマ
プラグマ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/08/26 09:42 UTC 版)
GHCで記述されたプログラムを効率よく並行・並列実行させるため、KL1では以下のプラグマが導入された。プログラムの正しさに影響を与えることなく負荷分散の仕方などを変えられるように設計されている。なお、プラグマはプログラムの正しさとは分離された効率のためだけの指定であり、これに従わない方が効率がいいと処理系が判断すると、必ずしも従わない場合もある。 * ゴール分散プラグマ Goal@node(Node)* ゴール優先度指定プラグマ Goal@priority(Priority)* 節優先度指定プラグマ alternatively. ゴール分散プラグマは特定のゴール(プロセス)を実行するノードを指定する。ノードは個別のプロセッサ、あるいは負荷分散の対象となるプロセッサの集まりである。以下に、PEs 個のノードに対し N 個のspawnプロセスをサイクリックに割り当てる述語の例を示す。Prologと同様、英大文字や"_"で始まる項は変数を表す。%以降はコメントである。 :- module cyclic.:- public distribute/1.distribute(N):- true | current_node(_,PEs), %ノードの総数PEsを取得 fork(N,PEs,0). %N個のプロセスをPEs個のノードで起動fork(0,PEs,PE):- true | true.otherwise.fork(N,PEs,PE):- PeNo:=PE mod PEs | spawn@node(PeNo), %PeNoのノードでspawnプロセスを起動 NextPE:=PE+1, N1:=N-1, fork(N1,PEs,NextPE). ゴール優先度指定プラグマはゴール(プロセス)ごとの優先順位を指定する。ただし必ず優先順位を守ろうとすると効率的な実装が難しくなり、返って効率が落ちる可能性があるため、必ず守られるとは限らない。 節優先度指定プラグマはプログラムの構成要素である節(Clause)の優先順位である。節の優先順位の指定には、最初に優先したい節を先に書き、他の節との間に "alternatively." を書く。ゴール優先度指定プラグマと同様の理由で、節の優先順位も必ず守られるとは限らない。
※この「プラグマ」の解説は、「KL1」の解説の一部です。
「プラグマ」を含む「KL1」の記事については、「KL1」の概要を参照ください。
- プラグマのページへのリンク