shira
shira
ルールコンパイラによって中間命令列が構築された後、コード変換器によって中間命令列は再構築される。コード変換器には長年の成果により様々な最適化処理などが記述されており、例えばピープホール最適化や膜再利用最適化が行われている。 コード変換器 - `compile.Compactor` - `compile.Grouping` - `compile.Merger` - `compile.Optimizer` ただその全容は多分誰も把握していない。このままでは、例えばルールコンパイラに新しい中間命令を導入しようにも、その後のコード変換で何が起きているのか分からないので追加できない。ので、どこかに分かりやすい形でまとめる。どんなオプションをつけたとき(つけなくても)に中間命令列にどんなこと変換が施されるのか、そしてそれはどこに記述されているか、など。 また、 #35 に関連して、slimcode化の結果必要のない最適化が出てきていると思うので除去する。 #39 のプルリクの変更内容や、slimの [src/vm/task.cpp](https://github.com/lmntal/slim/blob/develop/src/vm/task.cpp)で`do nothing`になっている中間命令に注目すればいいと思う。
膜が再利用される際はOptimizerでremovemem命令やnewmem命令が削除されたのちにどんなときでもenqueuemem命令が出力される。enqueuemem命令は膜を再度実行膜スタックに積む命令であるが、これは膜の中にルールが含まれていないときは必要ないように思う。どうだろうか。
`lib/slimoptimizer` や `tools/make_module` や `tools/make_systemcheck` や そこら中にあるperlのスクリプトは使われているのか、使われていないにしても使えるのか分からない。slimで使えないのならば削除してしまうし、使えるなら使い方を整理する
以下の例の場合、aアトムから辿れるgroundのリンクをcommit前とcommit後で2度取り直しているが、2度目は必要ない。Optimizer等で打ち消すようにする。 ``` ╰─ echo 'a(X) :- ground(X) | b(X)' | lmntal --slimcode --stdin-lmn -O3 ... Compiled Ruleset @601 Compiled Rule ... --memmatch: spec [1, 14] findatom [1, 0, 'a'_1] getlink...
例えばコンパイラの字句解析・構文解析結果のみを使用したい、といったときに現状のコンパイラではそれができない(はず) コンパイラ内の各処理段階の入出力を持ち出せ、組み込めるようにjsonなどで出力できるようにするようにするなどしたい。
アトムとプロセス文脈再利用を一緒くたに再利用するために実装した中間命令が含まれます。