2013-06-10 5 views
7

Ich versuche, die Auswertung von Ausdrücken in einem Compiler zu optimieren.Wie vereinfacht man einen C-artigen arithmetischen Ausdruck, der Variablen während der Code-Generierung enthält?

Die arithmetischen Ausdrücke sind alle C-Stil, und sie können Variablen enthalten. Ich hoffe, die Ausdrücke so weit wie möglich zu vereinfachen.

Zum Beispiel kann (3+100*A*B+100)*3+100 zu 409+300*A*B vereinfacht werden.

Es hängt hauptsächlich von dem Verteilungsgesetz, dem assoziativen Gesetz und dem Kommutativgesetz ab.

Die Hauptschwierigkeit, auf die ich stoße, ist, wie man diese arithmetischen Gesetze und traditionellen Stack-Scan-Auswertealgorithmen kombiniert.

Kann jemand Erfahrungen im Zusammenhang mit diesem oder ähnlichen Problemen im Zusammenhang mit Compiler-Erstellung teilen?

+0

Nur '+ - * /' und Klammern? –

+0

@CaseyChu Tatsächlich können alle C-Operatoren angezeigt werden. Aber ich denke, nur + - * /() ist akzeptabel. Ich versuche mein Bestes, um sie zu vereinfachen. – konjac

+2

Sie müssen wahrscheinlich ein [Rewriting-System] (http://en.wikipedia.org/wiki/Rewriting) entwickeln, das nacheinander Rewriting-Regeln auf den Ausdruck anwenden würde. Bevor Sie das tun, können Sie sich einen vorhandenen Compiler-Quellcode ansehen, um zu sehen, wie er mit solchen Optimierungen umgeht. Ich habe gehört, dass der LLVM-Quellcode sehr gut lesbar ist. –

Antwort

1

Wenden Sie constant folding zusammen mit der Verringerung der Stärke während der Code-Generierung Pass der Kompilierung. Die meisten Compiler-Texte bieten einen Algorithmus, um dies zu implementieren.

1

Compiler haben normalerweise einige interne Normierungsregeln wie "Konstanten auf der linken Seite". Dies bedeutet, a + 3 würde in 3 + a umgewandelt werden, aber nicht umgekehrt.

In Ihrem Beispiel (3+100*A*B+100)*3+100 würde in (3+100+(100*A*B))*3+100 normalisiert werden. Jetzt ist es klar zu optimieren 3+100.

könnten andere Transformation a*C1+C2 in (a+(C2/C1))*C1 unter der Bedingung, dass C1 und C2 Konstanten sind. Intuitiv normalisiert dies "add before multiply".

Diese Normalisierungen sind keine Optimierungen. Die Absicht besteht hauptsächlich darin, Konstanten zu gruppieren, so dass eine konstante Faltung effektiver ist.

Verwandte Themen