LMNtalルールコンパイラにおける 内部命令の設計 早稲田大学理工学部情報学科 ○水野 謙 永田 貴彦 加藤 紀夫 上田 和紀 LMNtalとは 階層的グラフの書き換えに基づく並行言語モデル プロセスとデータを同等に扱う 多重集合が膜によって階層化される 膜は局所的な書き換えルールを持つ事ができる ルールの移送が可能 グラフィカルなプログラミングが可能 LMNtalプロセス アトム GUI表現 小文字英数で始まる名前を持つ。 有限本のリンクが接続する。 名前と接続するリンクの数(ファンクタ)で 識別される。 a b リンク リンク a :- 書き換え規則をあらわす。 膜 c 大文字で始まる名前を持つ。 アトム間を接続する。 ルール 階層化された多重集合をつくる。 アトム a b LMNtalプログラムの例(1) no1 no2 res a c c n c c n no3 no4 Z0 a Y A X c :- Z0 A c a Y X Z0 a Y n :- Z0 = Y LMNtalプログラムの例(1) no1 res no2 c a c n c c n no3 no4 Z0 a Y A X c :- Z0 A c a Y X Z0 a Y n :- Z0 = Y LMNtalプログラムの例(1) no1 res no2 c a c n c c n no3 no4 Z0 a Y A X c :- Z0 A c a Y X Z0 a Y n :- Z0 = Y LMNtalプログラムの例(1) no1 no2 res c c a n c c n no3 no4 Z0 a Y A X c :- Z0 A c a Y X Z0 a Y n :- Z0 = Y LMNtalプログラムの例(1) no1 no2 res c c a n c c n no3 no4 Z0 a Y A X c :- Z0 A c a Y X Z0 a Y n :- Z0 = Y LMNtalプログラムの例(1) no1 no2 res c c = c c n no3 no4 Z0 a Y A X c :- Z0 A c a Y X Z0 a Y n :- Z0 = Y LMNtalプログラムの例(1) no1 no2 res c c c c n no3 no4 Z0 a Y A X c :- Z0 A c a Y X Z0 a Y n :- Z0 = Y LMNtalプログラムの例(1) res(a(c(no1, c(no2, n)), c(no3, c(no4, n)))), ( a(c(D, L1), L2, Z) :- c(D, a(L1, L2), Z) ), ( a(n, L2, Z) :- Z=L2 ) LMNtalプログラムの例(2) a b $p @p a $q @q b :- :- c $p @p $q @q LMNtalプログラムの例(2) a b $p @p a $q @q b :- :- c $p @p $q @q LMNtalプログラムの例(2) c $p @p a $q @q b :- :- c $p @p $q @q LMNtalプログラムの例(2) { a }, { b, (a, b :- c) }, ( { $p,@p }, { $q,@q } :- { $p,$q,@p,@q} ) プロトタイプ処理系 http://www.ueda.info.waseda.ac.jp/lmntal/ Javaによる実装 LMNtalプロセス(アトム、膜、リンク、ルール)を Javaのオブジェクトとして扱う ルールは、LMNtalプロセスを検査・操作するた めの命令列にコンパイルされる マッチング : ルール左辺にマッチするプロセスの有無 を調べる ボディ実行 : ルール適用によるプロセスの書き換えを おこなう 処理系の動作 LMNtal ソース ルール コンパイラ 内部 命令列 最適化済 命令列 最適化器 実行時 処理系 解釈実行 (将来) バイト コード Java ソース トランス レータ javac 実行時 処理系 実行 マッチング命令 アトムの検査・取得 deref findatom func eqatom neqatom [-dstatom, srcatom, srcpos, dstpos] リンク先のアトム取得 [-dstatom, srcmem, func] ファンクタによるアトム取得 [srcatom, func] ファンクタの確認 [atom1, atom2] アトムの同一性確認 [atom1, atom2] アトムの非同一性比較 膜の検査・取得 testmem lockmem anymem eqmem norules [dstmem, srcatom] [-dstmem, freelinkatom] [-dstmem, srcmem] [mem1, mem2] [srcmem] アトムの所属確認 所属膜の取得 膜の取得 膜の一致確認 ルールが存在しない事の確認 ボディ命令 アトムの操作 removeatom newatom [srcatom] [-dstatom, srcmem, func] アトムの除去 アトムの生成 リンクの操作 newlink unify getlink inheritlink [atom1, [atom1, [-link, [atom1, pos1, pos1, atom, pos1, atom2, pos2] atom2, pos2] pos] link2] リンクの生成 リンクの単一化 リンクの取得 リンクの継承 膜の操作 removemem newmem movecells [srcmem, parentmem] [-dstmem, srcmem] [dstmem, srcmem] 膜の除去 膜の生成 セルの移動 ルールの操作 loadruleset [dstmem, ruleset] ルールの読み込み マッチング : アトムの取得 アトムの取得 すでに取得しているアトムと接続している場合 リンク先アトムの取得 deref ファンクタの確認 func [-dstatom, srcatom, srcpos, dstpos] [srcatom, func] 接続していない場合 アトムの取得 findatom[-dstatom, srcmem, func] すでに取得しているアトムとの非同一性の確認 neqatom [atom1, atom2] • neqatomが必要な例 X b b Y • neqatomは不要な例 b X a b b Y マッチング : リンクの検査 取得したアトムに接続しているリンクを、次のよう にして検査する。 接続先のアトムをまだ取得していない場合 アトムの取得・検査を行う すでに取得している場合 deref [dstatom, srcatom, srcpos, dstpos] eqatom [atom1, atom2] 例: a b c ボディ実行 removeatom [srcatom] 1. 左辺のアトムを除去する。 removemem [srcmem] 2. 左辺の膜を除去する。 newmem [-dstmem, srcmem] 3. 右辺の膜を生成する。 4. プロセス文脈の内容を移動する。 movecells [dstmem, srcmem] newatom [-dstatom, srcmem, func] 5. 右辺のアトムを生成する。 6. ルール文脈の内容をコピーする。 copyrules [dstmem, srcmem] loadruleset [dstmem, ruleset] 7. 右辺のルールをロードする。 [atom1, pos1, atom2, pos2] 8. リンクのつなぎ替えをおこなう。 newlink unify [atom1, pos1, atom2, pos2] getlink [-link, atom, pos] inheritlink [atom1, pos1, link2] ボディ実行 : リンクのつなぎ替え 右辺に2回出現するリンク newlink命令で生成する。 左辺と右辺に1回ずつ出現するリンク 「=」アトムに接続している場合、 unify命令を用いる。 それ以外のアトムに接続している場合、 getlink/inheritlink命令を用いる。 X a :- X b 命令列の例 Z0 a Y A X c :- Z0 A c a Y X findatom deref func [1, 0, append_3] [2, 1, 0, 2] [2, cons_3] removeatom removeatom newatom newatom getlink getlink getlink getlink inheritlink newlink inheritlink inheritlink inheritlink [1] [2] [3, [4, [5, [6, [7, [8, [3, [3, [3, [4, [4, 0, 0, 1, 1, 2, 2, 0, 1, 2, 0, 1, cons_3] append_3] 1] 2] 0] 1] 7] 4, 2] 6] 8] 5] 命令列の最適化 アトムの再利用 膜の再利用 ルール適用のループ化 アトムの再利用 左辺のアトムをすべて除去してから右辺のアトムを生成 するのは明らかに冗長 アトムを再利用する事で、除去・生成を低減する。 リンクのつなぎ替えも一部省略できるようになる。 Z0 a A X c Y 1. 左辺のアトムの除去 2. 右辺のアトムの生成 3. リンクのつなぎ替え :- Z0 A c a X Y アトムの再利用によって 不要になる リンクA、Yの処理は不要になる 最適化の効果 リスト連結 素数生成 時間 速度 比率 時間 速度 比率 (sec) 最適化前 アトム再利用 ループ化 (103回/sec) 4.07 3.52 0.66 環境 CPU : Memory : OS : java : 7.36 1.00 8.51 1.16 45.4 6.17 8.03 7.28 0.83 Pentium Ⅲ-M 800MHz 384MB Windows XP Home j2sdk1.4.2 1.33 1.00 1.47 1.10 12.8 2.63 まとめと今後の課題 内部命令セット、および命令列の生成手順を示した。 アトムの再利用による最適化を紹介した。 プリミティブ型を扱うルールの最適化 Javaへのトランスレータの実装
© Copyright 2024 ExpyDoc