Kääntäjäoptimointien luominen todisteista

Original page: http://www.cs.cornell.edu/~ross/publications/proofgen/

POPL 2010: [pdf] [bibtex] [pptx] [mp4]

Tekijät: Ross TateMichael SteppSorin Lerner

Tekninen raportti: [pdf] [bibtex]

Video: http://www.cs.cornell.edu/~ross/publications/proofgen/Tate-POPL10.mp4 

Abstrakti

Esittelemme automaattisen tekniikan kääntäjäoptimointien tuottamiseksi esimerkkeistä konkreettisista ohjelmista ennen ja jälkeen niiden parannusten. Tekniikkamme keskeinen tekninen käsitys on se, että todistus vastaavuudesta alkuperäisten ja muuttuneiden konkreettisten ohjelmien välillä ilmoittaa meille, mitkä ohjelmien osat ovat tärkeitä ja jotka voidaan hylätä. Tekniikkamme käyttää siksi näitä todisteita, jotka voidaan tuottaa kääntämisen validoinnilla tai todisteena suorittavilla kääntäjillä opas alkuperäisen ja muunnettujen ohjelmien yleistämiseksi yleisesti sovellettaviksi optimointisääntöiksi.

Esittelemme todistuksen yleistämistekniikkamme luokka-teoreettisen virallistamisen. Tämä abstraktio tekee meidän tekniikasta soveliaita omiin logiimme. Erityisesti osoitamme, miten tekniikkamme voidaan käyttää myös kyselyiden optimointiin relaatiotietokantoihin tai ohjelmoijien auttamiseksi virheiden korjaamiseen.

Lopuksi esitämme kokeellisesti, että tekniikkamme antaa ohjelmoijille mahdollisuuden kehittää kääntäjä sovelluskohtaisilla optimoinnilla antamalla konkreettisia esimerkkejä alkuperäisistä ohjelmista ja halutuista muunnetuista ohjelmista. Osoitamme myös, miten se mahdollistaa kääntäjän oppia tehokkaita suoritettavia optimointeja kalliista suoritettavista superoptimoijista.

Todisteiden yleistäminen

Merkittävä osa tätä paperia on meidän kehys todisteita yleistys. Samalla tavalla abstrakti tulkinta voidaan soveltaa erilaisiin abstraktioita tuottaa iteratiivinen ohjelma analysoi, meidän kehystä voidaan soveltaa erilaisiin logiikkaa tuottaa algoritmeja yleistäen. Esimerkiksi levittämällä meidän puitteet E-PEG, saamme algoritmi yleistäen todisteita vastaavuudesta betonin ohjelmia laajasti sovellettavissa ohjelmaan optimointeja. Olemme jo sovellettu myös puitteet tietokantoihin, Hindley-Milner tyypin päättely, sopimukset ja tyyppitarkistuksia rakentaa algoritmeja auttamista tietokantakyselyn optimointeja, tyyppi vikojen Hindleyn-Milner-pohjainen tyyppi päättelyyn, sopimus testaat ja tyyppi yleistys. Haluamme tässä yhteydessä olla helposti saatavilla, ja olisimme kiinnostuneita kuulemaan lisää sovelluksia. Olisimme mielellämme auttaa tutkijoita ratkaisemaan epätasaisesti koodaavat logiikan kategorisesti tai rakentamalla Pushout täydennetä, jotta he voivat hyödyntää meidän puitteet ratkaista omat ongelmansa. Ota rohkeasti yhteyttä neuvoa.

“Useimmat” yleiset todisteet: Useat kysymyksistä, jotka saatiin esityksemme jälkeen, liittyivät siihen, miten todiste voi olla “yleisin”. Tähän attribuuttiin on monia parametreja. Ensinnäkin todiste on avainasemassa. Konkreettisella optimoinnilla ei ehkä ole yleistä muotoa, mutta jokainen todistus on. Joidenkin todisteiden yleisin muoto voi kuitenkin olla yleisempi kuin joidenkin muiden todisteiden yleisin muoto. Usein tämä voi olla täydellinen onnettomuus; muina aikoina yksi todiste voi olla toisen todistuksen hieman parempi vaihtoehto. Esimerkiksi perinteisten puurakenteisten todisteiden peräkkäiset muodot tuottavat oikeastaan ​​yleisempiä yleistymisiä kuin todistuspuu. Paperissa esitellään useita tekniikoita todistusten parantamiseksi niin, että sillä on parempi yleistys. Toiseksi, yleistysprosessi tapahtuu kaikki logiikan sisällä. Jotkut logiikat ovat yleisempiä kuin muut, joten yleisempi logiikka tuottaa yleisempiä todisteita. Erityisesti aksiomien ja aksiomääräsekvenssien välinen ero tulee erittäin tärkeäksi todistuksessa yleistymisessä. Esimerkiksi ohjelmien ilmaisugraafeissa on silmukkatoimintoja, kuten “pass”, jotka kukin toimivat jossakin loop-indeksissä. Yksi logiikka voi nähdä tämän operaattorina: pass-1, pass-2 ja niin edelleen. Toinen logiikka voi nähdä tämän yhtenä operaattorina, jossa on loop-indeksiparametri: pass-i. Entisessä logiikassa yleistyneillä optimoinnilla on edelleen silmukan indeksivakiot, kun taas jälkimmäisessä logiikassa yleistyneet optimoinnit myös yleistyvät silmukka-indeksin. Sovelluksessamme käytämme jälkimmäistä logiikkaa, mutta paperissa keskustelemme entistä yleisemmästä logiikasta, jota olisimme voineet käyttää. Kolmanneksi axiom setillä on merkittävä vaikutus yleistymiseen. Jotkut aksiomit eivät yleistyvät hyvin. Harkitse esimerkkiä esityksestämme, jossa korvataan 8+8-8 kanssa 8 llä. Esityksessämme käytämme aksioomia, kuten x-x=0 ja x+0=x. Voisimme myös yksinkertaisesti käyttää jatkuvasti taittoa. Kuitenkin jatkuva taitto tuottaa huonoja yleistymiä. Niinpä toteutuksessamme vältämme jatkuvasti taivutusta niin paljon kuin mahdollista, vain sisällyttämällä se viimeiseen keinona olevaan axiomiimme. On olemassa useita tekijöitä, jotka vaikuttavat yleistymisprosessiin, mutta nämä kolme ovat tärkeimpiä. Kokemuksemme mukaan oli helppo suunnitella hyvä logiikka ja hyvä aksiomääritys, ja automaattisesti syntyneet todisteet olivat kaikki mitä toivoimme. Toivomme, että tämä todistettu yleistystekniikka ja sen sovellukset avaavat uusia mielenkiintoisia tutkimussuunnitelma todisteoriaa varten.

Luokka teoria

Jotkut ovat pyytäneet meiltä, ​​miksi me emme hyväksy lainkaan todistustekniikkaa, ja miksi käytimme luokkateoriaa abstraktina. Olemme kuitenkin itse asiassa suunnitelleet abstraktin algoritmin ensin käyttämällä kategoria-teoriaa ja sitten käytimme sitä selvittämään, miten ratkaista konkreettinen ongelma. Olemme juuttuneet konkreettisiin ongelmiin, joita yksityiskohdat ja muuttujat hälventävät, ja mahdolliset ratkaisut, joita voisimme ajatella, näyttivät mielivaltaisilta. Jotta voimme kuvitella ja yksinkertaistaa, päätimme lausua kysymyksemme kategorisesti. Tämä johti lähteiden ja nielujen kaavioon, joten käytimme vain työntöjä ja vetoketjuja liimaamaan asioita yhteen. Suurin haaste oli saada aikaan pushout-täydennykset sen sijaan, että käytettäisiin olemassa olevaa vakiokäsitystä. Kategorinen muotoilu oli helppo määritellä ja syy. Sen jälkeen käytettiin abstrakteja prosesseja, kuten työntöjä, konkreettisilla algoritmeilla, kuten yhdistyksellä, jotta saisimme lopullisen toteutuksen vahvalla yleisturvakkeella.

Olemme tosiasiassa löytäneet tämän abstraktioprosessin luokkaan perustuvan teorian, kun joudumme olemaan hedelmällisiä. Paitsi että se ratkaisee konkreettisen ongelmamme, mutta päädymme paremmin käsitykseen omasta ongelmallistamme ja abstraktista ratkaisusta, joka voidaan helposti sovittaa muihin sovelluksiin. Niinpä kokemuksemme mukaan kategorioiden teoria voi olla hyödyllinen varsinaisten algoritmien rakentamisessa, sen lisäksi, että se on käyttökelpoinen puitteet virallistamiseksi. Olisimme kiinnostuneita tietämään muista vastaavista, positiivisista tai negatiivisista kokemuksista.