On ollut assembler decompiler - ohjelmistoja, mutta kuvitellaanpa jotain paljon vaikeampaa: c decompiler, josta voinen käyttää nimitystä c käänteiskääntäjä. Keksikää parempi nimi.
Miten kova haaste tietojenkäsittelyteorialle ja ohjelmistotekniikalle tms. on tehdä ohjelmisto, joka kääntää käynnistettävää binääriä jollain tavalla ymmärrettäväksi c kieleksi?
Eli käänteiskääntäjän pitäisi koota konekieli sopivan kokoisiksi olioiksi ja luokiksi yms.
Rakenne on lähes takuulla eri kuin alkuperäisessä, ja nimet..., niin miten antaa kuvaavia nimiä muuttujille ym., miten yhdistää merkitykset kaikkeen? Se on sitten ihan oma taitonsa. Standardin (std) nimiavaruuden sanat voi asetella ilman varsinaista ymmärrystä, mutta ohjelmoijan keksimät ohjelmistokohtaiset merkitykset vaativat pähkäilyä.
Miten kova haaste tietojenkäsittelyteorialle ja ohjelmistotekniikalle tms. on tehdä ohjelmisto, joka kääntää käynnistettävää binääriä jollain tavalla ymmärrettäväksi c kieleksi?
Eli käänteiskääntäjän pitäisi koota konekieli sopivan kokoisiksi olioiksi ja luokiksi yms.
Rakenne on lähes takuulla eri kuin alkuperäisessä, ja nimet..., niin miten antaa kuvaavia nimiä muuttujille ym., miten yhdistää merkitykset kaikkeen? Se on sitten ihan oma taitonsa. Standardin (std) nimiavaruuden sanat voi asetella ilman varsinaista ymmärrystä, mutta ohjelmoijan keksimät ohjelmistokohtaiset merkitykset vaativat pähkäilyä.
Vastaukset 3
Vanhimmat
jo se että monilla korkean tason kielillä tehty
ohjelma voi binääritasolle käännöksen jälkeen
olla täsmälleen samanlainen.
Ja vaikka Decompilerille kerrottaisiinkin että
mille sorsakielelle yritetään tulkata niin
vaikeaa, vaikeaa on.
Useimmat kääntäjät vielä optimoivat koodia omilla
säännöillään ja laittavat omia alirutiineitaan
väliin niin että koodaajan aivoitukset menevät kyllä ihan uusiksi.
Mutta luulisin nykyisten decompilerien olevan pelkkiä mekaanisia kääntäjiä, enkä usko niillä olevan mitään varsinaisia päättelytaitoja. Perustuu kai siihen että jo kääntäjät tuottavat binäärikoodia yksinkertaisin menetelmin...?
Mutta olisi melkoinen saavutus jos jokin ohjelma käännettäisiin toimintansa perusteella oliokoodiksi. Esimerkkinä 3d-animaatio purettaisiin kappaleiksi, jotka olisi olioita.
"Eli käänteiskääntäjän pitäisi koota konekieli sopivan kokoisiksi olioiksi ja luokiksi yms.
"
Jospa sopivat oliot ja luokat muodostaisivat virtuaalikoneen, joka simuloisi sitä assemblerin suositusta yksi yhteen. Silloin decompilointi olisi triviaali tehtävä. Pitäisi vain tehdä siitä C -kielen syntaksin mukaisia kutsuja näiden luokkien metodeihin.
Tosin tuloksena olevaa ohjelmaa olisi tasan yhtä vaikea ymmärtää kuin sitä alkuperäistä konekieltä. Hyöty olisi siis nolla.
Ehkä haluat vähän tarketaan noita vaatimuksiasi...
Asiaan väljästi liittyen, koodia on joskus mahdollista generoida automaatisesti tiettyjen tietojen pohjalta:
http://lambda-the-ultimate.org/node/1178
Tämä ei onnistu ihan noin vain C :n kanssa kuitenkaan.