Langphilia! / KL1 / Distributed KL1 / DKLIC4, 2002-01-11
従来の分散型言語処理系や分散ミドルウェアは手続き型言語の拡張であり、
逐次プログラムのシームレスな分散化が行えない。
並行論理型言語KL1は、
DKLICはKL1に基づく宣言型広域分散計算環境である。
+----------+
| O.............................
| . | +--.-------+
| . | | . |
| ..O | | O |
| . | | |
| . | +----------+ ......O |
+-----.----+ | | . | O |
. | O.......... | |
. | | +----------+
.............O |
. | |
............O |
+----------+
+-+
| | ホスト
+-+
O プロセス
... 通信路
宣言型で楽なネットワークプログラミング。 非決定的な通信順序・同期の抽象化。
ユーザプロセスは実行系 DKLIC Runtime にホスト間通信を要求する。 Runtimeはユーザプロセスの要求に応じてソケットを管理する。
+----------+ +----------+ | | | | | Runtime ========== Runtime | | . | | . | | . | | . | | O | | O | | | | | +----------+ +----------+ +-+ | | ホスト +-+ O ユーザプロセス ... 通信路 === ソケット
KL1 program KLIC C program cc binary
Runtime/C -----> Runtime/bin
Runtime/KL1 -----> Runtime/C -----> Runtime/bin
user /KL1 -----> user /C -----> user /bin
基本サーバ
拡張サーバ
検索 通信
unix -- low Port -> ServSock Host:Port -> file_io
dklic -- high Port -> ServSock Host:Port -> Stream
naming high -- ID, Host:Port -> 0 ID -> Host:Port
N1 N2
+-----------+ +-----------+
| dklic ================== dklic |
| . | ..../ . |
| . L1 | R...../| . |
| . ...../ | . L2 |
| ....../| | . |
| O........................O |
+-----------+ S +-----------+
: :
dklic(L1), dklic(L2),
L2=[bind(SS)],
L1=[connect(R)@N2], SS=[accept(S)|..],
S=[request(Answer)|..], service(S)..
: :
append(X,Y,Z) :- X=[] | Z=Y. append(X,Y,Z) :- X=[A|X1] | Z=[A|Z1], append(X1,Y,Z1). +------------------+ X=[] +-----+ | |----------->| | | append([],[a],Z) | Y=[a|Y1] | Z=Y | | |----------->| | | | Z=[a|Z1] | | | |<-----------| | +------------------+ +-----+→ 未定義変数の同一性検出を行なう。
agent([A|S]) :- agent(S)@node(A).
+----------------+ S=[2|S1] +---+
| agent([1,2,3]) |---------->| 1 |
+----------------+ S1=[3|S2] +---+
| S1=[3|S2]
+---+
| 2 |
+---+
→ 未定義変数の輸出入を第3者に通知する。+------------------+ X=[] +-----+ | |----------->| | | append([],[a],Z) | Z=Y | Z=Y | | |<-----------| | +------------------+ +-----+
+----------------+ S=[2|S1] +---+
| agent([1,2,3]) |---------->| 1 |
| |<----------| |
+----------------+ S1->node2 +---+
|
| S1=[3|S2] +---+
+------------------->| 2 |
+---+
KLIC/KL1 プログラムから見ると、Data Object は値, Consumer/Generator Object はゴールの中断原因変数のように見える。
D は Data Object、 C は Consumer Object、 G は Generator Object、 * は3種すべてに共通するメソッド
*.h は include/klic/ に、 *.c や *.kl1 は runtime/ にある。
*.kl1 と *.c の名前が異なるのは、 KLIC翻訳系が生成するファイル名と衝突するのを避けるためだろう。 逆に言うと、*.kl1 と同名の *.c はKLIC翻訳系に生成されたもの。
*.h と *.c の名前が異なるのは意味不明だ。
append([],Y,Z) :- Y=Z.
+----------+ +----------+
|{X,Y,Z,,,}========{X,Y,Z,,,}|
| : : : | Y=Z | : : : |
| : : : | | : : : |
| : : : | | : : : |
|[] Y Z | |[] Y=Z |
| | | |
+----------+ +----------+