Ich habe folgendes Spielzeug Sprache zu tun:saubere Art und Weise Rewrite-Regeln
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]
Die Sprache hat eine endliche Band von Speicherzellen, die um Wraps, und einen Zeiger, die an einem bestimmten Zelle verweist. Alle Zellen sind anfänglich Null. Das Programm wird wiederholt ausgeführt, bis der Haltebefehl gelesen wird.
Jetzt möchte ich eine Funktion schreiben, die ein bestimmtes Programm optimiert. Hier sind die Optimierungen, die Ich mag würde auszuführen:
| 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 |
Zusätzlich kann ich nur eine Optimierung auf Code tun, die nicht direkt nach einem Sprung ist, denn das tun würde, die Bedeutung des Programms ändern.
wiederholt auf der Liste Pattern-Matching, bis keine weiteren Optimierungen wirklich den besten/sauberste Weg, dies zu tun durchgeführt werden können?
Was passiert, wenn ich mich entscheide, dass ich auch weiter fortgeschritten umschreibt wie diese ausgeführt werden soll:
| 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 |
Der einfachste Weg ist in einem Kommentar verwenden könnte auszudrücken -> Vielleicht Program' (nennen wir diese Typ "Opt"); Sie können Kombinatoren auf "Opt", z. die eine Optimierung gelten, bis es ausfällt, die an jedem Knoten des AST eine Optimierung anwenden, versuchen, jede gegebene Optimierung in der Reihenfolge, gelten alle angegebenen Optimierungen etc. 'no_skips' nur eine Funktion' Programm ist -> Vielleicht (Programm, Programm) '. Eine erweiterte Ansatz finden Sie [hier] (https://hackage.haskell.org/package/compdata-0.11/docs/Data-Comp-TermRewriting.html). – user2407038