Yleisten alilausekkeiden poistaminen

Yleisten osalausekkeiden poistaminen ( eng.  Common Subexpression elimination tai CSE) on kääntäjän optimointi , joka etsii ohjelmasta laskelmia , jotka suoritetaan useammin kuin kerran tarkasteltavassa osiossa, ja poistaa toisen ja sitä seuraavat identtiset toiminnot, mikäli mahdollista ja tehokasta . Tämä optimointi vaatii tietovirta-analyysinredundanttien laskelmien löytämiseen ja lähes aina parantaa ohjelman suoritusaikaa käytettäessä [1] .

Yleinen kuvaus ongelmasta

Ohjelman osalauseketta kutsutaan yhteiseksi osalausekkeeksi , jos on olemassa toinen sellainen osalauseke, joka arvioidaan aina ennen annettua, ja operandit eivät muutu arvioiden välillä. Esimerkiksi alla olevassa esimerkissä lauseke b * c on yleinen osalauseke.

Tämän määritelmän perusteella yhteisten osalausekkeiden poistaminen on muunnos , joka eliminoi yhteisten osalausekkeiden toistuvan arvioinnin ja korvaa ne ensimmäisen arvioinnin jälkeen tallennetun arvon käytöllä. Tarkasteltavassa esimerkissä on kuitenkin mahdotonta korvata yhteistä osalauseketta välittömästi muuttujan a arvolla d:tä laskettaessa, koska tämä muuttuja voi muuttua kyseessä olevien laskelmien välillä.

Harkitse seuraavaa koodinpätkää:

a = b * c + g ; d = b * c * d _

Seuraava muunnos koskee sitä:

tmp = b * c ; a = tmp + g ; d = tmp * d ;

joka on tehokas, jos uuden muuttujan "tmp" kirjoittamiseen ja useisiin lukemiin kuluva kokonaisaika on pienempi kuin lausekkeen "b * c" arvioimiseen käytetty kokonaisaika joka kerta, kun se esiintyy koodissa.

Tätä optimointia on kahta tyyppiä:

  • yhteisten osalausekkeiden paikallinen poisto , joka toimii samalla lineaarisella alueella ;
  • yleisten alilausekkeiden globaali poistaminen , joka toimii koko menettelyn sisällä.

Molemmat optimoinnit perustuvat tietovirta-analyysiin, jonka aikana määritetään lausekkeen saatavuus ohjelman jokaisessa kohdassa.

Periaate

Optimointisovellus perustuu käytettävissä olevien lausekkeiden analyysiin . Lauseke x + yon käytettävissä jossain vaiheessa pohjelmaa, jos: [2]

  • mitä tahansa polkua pitkin aloitussolmusta plausekkeeseen x + yarvioidaan, kunnes saavutetaan piste p;
  • lausekkeiden arvioinnin ja pisteen saavuttamisen pvälillä ei muutu muuttujien arvoissa xja y.

Muunnostehokkuuden määrää pääasiassa se, että uuden muuttujan "tmp" kirjoittamisen ja useiden lukemien kokonaisaika osoittautuu pienemmäksi kuin lausekkeen "b * c" arvioimiseen käytetty kokonaisaika joka kerta, kun se esiintyy koodi. Käytännössä lopulliseen tehokkuuteen vaikuttavat myös monet muut tekijät, erityisesti muuttujien jakautuminen rekistereiden kesken .

Hyöty

Yksinkertaisissa tapauksissa, kuten edellä käsitellyssä, aritmeettisten lausekkeiden laskutoimitukset poistetaan. Tämä optimointi on merkittävin kääntäjän sisäisen esityksen kannalta, esimerkiksi taulukkoindeksien laskennassa, jossa manuaalinen optimointi on erittäin vaikeaa tai mahdotonta. Joissakin ohjelmointikielissä on mahdollista muodostaa useita samanlaisia ​​laskelmia. Esimerkiksi C-kielen makroja , jotka lähdekoodissa eivät muodosta samoja lausekkeita, mutta sen jälkeen kun makron nimi on korvattu esiprosessorin käsittelyn aikana ohjelman käskysarjalla, voi ilmaantua sellaisia.

Optimoinnin globaalissa sovelluksessa lisäkriteerit vaikuttavat hyötyyn. Esimerkiksi on tarpeen ottaa huomioon peruslohkojen suorituslaskurit, koska vähentämällä lausekearviointien staattista määrää voit lisätä dynaamista numeroa, mikä vaikuttaa negatiivisesti ohjelmassa suoritettavien toimintojen määrään. Tämä johtaa siihen, että PRE-luokkaan (partial redundancy elimination) liittyvä käänteinen optimointi voi olla hyödyllistä.

Muistiinpanot

  1. Advanced Compiler Design and Implementation, 1997 , s. 377.
  2. Kääntäjät: periaatteet, tekniikat ja työkalut, 2008 , s. 735.

Kirjallisuus

  • Alfred Aho, Monica Lam, Ravi Seti, Jeffrey Ullman. Kääntäjät : periaatteet, tekniikat ja työkalut = kääntäjät: periaatteet, tekniikat ja työkalut. – 2. painos. - M . : "Williams", 2008. - 1184 s. - 1500 kappaletta.  - ISBN 978-5-8459-1349-4 .
  • Steven S. Muchnick. Kehittynyt kääntäjän suunnittelu ja toteutus. – 5. painos. - San Francisco: Morgan Kaufmann Publishers , 1997. - s. 378-396. — 856 s. - ISBN 1-55860-320-4 .
  • John Cocke . "Global Common Subpression elimination." Proceedings of a Symposium on Compiler Construction , ACM SIGPLAN Notices 5(7), heinäkuu 1970, sivut 850-856.
  • Briggs, Preston, Cooper, Keith D. ja Simpson, L. Taylor. "Arvojen numerointi." Software-Practice and Experience , 27(6), kesäkuu 1997, sivut 701-724.