Network-Ullman-algoritmi | |
---|---|
Nimetty | Ravi Sethi [d] jaJeffrey Ullman |
tarkoitus | etsi lausekkeen optimaalinen käännösjärjestys |
Tietorakenne | kaavio |
Network-Ullman- algoritmi on algoritmi abstraktien syntaksipuiden kääntämiseksi konekoodiksi , joka käyttää mahdollisimman vähän rekistereitä . Algoritmi on nimetty kehittäjiensä Ravi Seti ja Jeffrey Ullmanin mukaan.
Luodessaan koodia aritmeettisille lausekkeille kääntäjän on päätettävä, mikä on paras tapa kääntää lauseke käytettyjen käskyjen sekä tietyn alipuun arvioimiseen tarvittavien rekisterien lukumäärän suhteen. Varsinkin jos vapaita rekistereitä on vähän, suoritusjärjestys voi olla tärkeä generoidun koodin pituuden kannalta, koska erilainen arviointijärjestys voi johtaa enemmän tai vähemmän väliarvoihin, jotka häätyvät muistiin ja sitten palautettu. Network-Ullman-algoritmilla (tunnetaan myös nimellä Network-Ullmann-numerointi ) on ominaisuus tuottaa koodia, joka vaatii vähimmäismäärän käskyjä sekä vähimmäismäärän muistiviittauksia (olettaen, että ainakin operaatiot ovat kommutatiivisia ja assosiatiivisia , mutta jakelulakia , eli sitä ei noudateta). Huomaa, että algoritmi onnistuu, vaikka lausekkeessa ei olisi kommutatiivisuutta eikä assosiaatiota , joten aritmeettisia muunnoksia ei voida soveltaa. Algoritmi ei myöskään käytä yleistä osalausekkeen ilmaisua tai yleisten suunnattujen asyklisten graafien käyttöä puiden sijasta.
Yksinkertainen verkko-Ullmann-algoritmi toimii seuraavasti ( lataus/tallennus arkkitehtuurille ):
Aritmeettisen lausekkeen abstrakti syntaksipuu näyttää tältä:
= / \ a* / \ / \ ++ / \ / \ /\d3 + * / \ / \ bcfgAlgoritmin suorittamiseksi meidän tarvitsee vain tarkistaa aritmeettinen lauseke ts. meidän tarvitsee vain tarkastella '='-kohteen oikeaa alipuuta:
* / \ / \ ++ / \ / \ /\d3 + * / \ / \ bcfgAloitamme nyt puukävelyn määrittämällä kunkin alipuun arvioimiseen tarvittavan määrän rekistereitä (huomaa, että lausekkeen viimeinen termi on vakio):
* 2 / \ / \ + 2 + 1 / \ / \ / d 1 3 0 + 1 * 1 / \ / \ b 1 c 0 f 1 g 0Tästä puusta näet, että tarvitsemme 2 rekisteriä '*':n vasemman alipuun laskemiseen, mutta tarvitsemme vain yhden rekisterin oikean alipuun laskemiseen. Solmut 'c' ja 'g' eivät tarvitse rekistereitä seuraavista syistä: Jos T on puun lehti, T arvioitavien rekisterien määrä on joko 1 tai 0 riippuen siitä, onko T vasemmassa vai oikeassa alipuussa. (koska toiminnot, kuten lisääminen R1, A, voivat käsitellä A:n oikean komponentin suoraan ilman rekisteröintiä). Siksi meidän pitäisi aloittaa suorittamalla vasen alipuu, koska voimme päätyä tilanteeseen, jossa meillä on vain kaksi rekisteriä arvioimaan koko lauseke. Jos laskemme ensin oikean alipuun (joka vaatii vain yhden rekisterin), meidän olisi tallennettava oikean alipuun tulos samalla kun lasketaan vasenta alipuuta (joka vaatii edelleen 2 rekisteriä), joten tarvitaan 3 rekisteriä. Vasemman alipuun arviointi vaatii kaksi rekisteriä, mutta tulos voidaan tallentaa yhteen rekisteriin, ja koska oikean alipuun arviointi vaatii yhden rekisterin, lauseke voidaan arvioida vain kahdella rekisterillä.
Network-Ullman-algoritmin parannetussa versiossa aritmeettiset lausekkeet muunnetaan ensin käytettävien operaattoreiden aritmeettisten ominaisuuksien avulla.