I下記のおもちゃの言語があります。クリーンな方法
module Lang where
data Op = Move Int -- Move the pointer N steps
| Add Int -- Add N to the value under the pointer
| Skip -- Skip next op if the value under the pointer is 0
| Halt -- End execution
deriving (Show, Eq)
type Program = [Op]
言語はラップアラウンドメモリセルの有限のテープを持っており、いくつかのセルに指し示すポインタを。すべてのセルは、最初はゼロです。プログラムは、停止命令が読み取られるまで繰り返し実行されます。
ここでは、特定のプログラムを最適化する関数を記述したいと思います。
| Original code | Optimization |
|---------------------|----------------|
| Move a : Move b : x | Move (a+b) : x |
| Add a : Add b : x | Add (a+b) : x |
| Move 0 : x | x |
| Add 0 : x | x |
| Skip : Skip : x : y | x : y |
| Halt : _ | Halt |
また、私はスキップした後、直接ではないコードの最適化を行うことができ、それを行うことは、プログラムの意味を変えてしまうため:ここで私が実行したいの最適化です。
これ以上の最適化が実行できなくなるまで、繰り返しリストのパターンマッチングが行われますか?
私はまた、これらのような、より高度な書き換えを実行したいことは何を決定した場合:
| Original code | Optimization |
|--------------------------------------------------------|------------------------------------------------|
| if the program begins with (Skip : a) | move it to the end of the program |
| Move x ++ no_skips : Move -x ++ no_skips' : Move w : q | Move x ++ no_skips ++ no_skips' : Move w-x : q |
でたぶん使うことができることを最も簡単な方法は、関数 'プログラムとして、各最適化(表中の各ライン)を発現させることである私に言った - >たぶんProgram'は(これを呼び出します'Opt'と入力してください)。 'Opt'にコンビネータを表現することができます。 ASTのすべてのノードで最適化を適用し、与えられた最適化を順番に試し、与えられたすべての最適化を適用します。 'no_skips'はちょうど関数' Program - > Maybe(Program、Program ) '。より高度なアプローチについては、[here](https://hackage.haskell.org/package/compdata-0.11/docs/Data-Comp-TermRewriting.html)を参照してください。 – user2407038