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] .
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ä:
Molemmat optimoinnit perustuvat tietovirta-analyysiin, jonka aikana määritetään lausekkeen saatavuus ohjelman jokaisessa kohdassa.
Optimointisovellus perustuu käytettävissä olevien lausekkeiden analyysiin . Lauseke x + yon käytettävissä jossain vaiheessa pohjelmaa, jos: [2]
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 .
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ä.