Próbuję zoptymalizować ocenę wyrażeń w kompilatorze.Jak uprościć arytmetyczne wyrażenie w stylu C zawierające zmienne podczas generowania kodu?
Wyrażenia arytmetyczne mają styl litery C i mogą zawierać zmienne. Mam nadzieję uprościć wyrażenia tak bardzo, jak to możliwe.
Na przykład (3+100*A*B+100)*3+100
można uprościć do 409+300*A*B
.
Jest to głównie zależne od prawa rozdzielczego, prawa asocjacyjnego i prawa przemiennego.
Główną trudnością, jaką napotykam, jest łączenie tych praw arytmetycznych z tradycyjnymi algorytmami oceny stosu.
Czy ktoś może podzielić się doświadczeniami związanymi z tym lub podobnymi problemami w kontekście budowania kompilatora?
Tylko '+ - * /' i nawiasy? –
@CaseyChu W rzeczywistości mogą pojawić się wszyscy operatorzy C. Ale myślę, że tylko uwzględnienie + - * /() jest również dopuszczalne. Staram się jak najlepiej "uprościć je. – konjac
Prawdopodobnie musisz opracować [system przepisywania] (http://en.wikipedia.org/wiki/Rewriting), który będzie sukcesywnie stosować reguły przepisywania do wyrażenia. Zanim to zrobisz, możesz rzucić okiem na istniejący kod źródłowy kompilatora, aby zobaczyć, jak radzi sobie z takimi optymalizacjami. Słyszałem, że kod źródłowy LLVM jest bardzo czytelny. –