Sto cercando di ottimizzare la valutazione delle espressioni in un compilatore.Come semplificare un'espressione aritmetica in stile C contenente variabili durante la generazione del codice?
Le espressioni aritmetiche sono tutte in stile C e possono contenere variabili. Spero di semplificare il più possibile le espressioni.
Ad esempio, (3+100*A*B+100)*3+100
può essere semplificato in 409+300*A*B
.
Dipende principalmente dalla legge distributiva, dalla legge associativa e dalla legge commutativa.
La principale difficoltà che incontro è come combinare queste leggi aritmetiche e gli algoritmi di valutazione dello stack-scan tradizionali.
Qualcuno può condividere esperienze relative a questo o problemi simili nel contesto della compilazione del compilatore?
Solo '+ - * /' e parentesi? –
@CaseyChu In effetti, possono apparire tutti gli operatori C. Ma penso che anche solo considerare + - * /() sia accettabile. Sto 'facendo del mio meglio per semplificarli. – konjac
Probabilmente è necessario sviluppare un [sistema di riscrittura] (http://en.wikipedia.org/wiki/Rewriting), che applicherà successivamente le regole di riscrittura all'espressione. Prima di farlo, potresti dare un'occhiata ad un codice sorgente del compilatore esistente, per vedere come gestisce tali ottimizzazioni. Ho sentito che il codice sorgente LLVM è molto leggibile. –