Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Kääntäjä käytännössä

HellCome [03.09.2005 10:44:41]

#

Tulipas tässä mieleeni, kun mm. Javassa ohjelma täytyy kääntää ennen kuin siitä on mitään iloa käytännössä. Mutta mitä kääntäjä käytännössä tekeekään? Lähdekoodit tuppaavat toisinaan olemaan kovin salaisia, mutta itse tuotos on julkinen. Tästäpä onkin tullut mieleeni, että voisiko itse ohjelman kääntää takaisin koodiksi, eli sisältääkö itse ohjelma koodia muodossa taikka toisessa?

Heikki [03.09.2005 14:54:53]

#

Kääntäjä on ohjelma, joka muuttaa ohjelmointikielellä tehdyn koodin prosessorin ymmärtämään binäärimuotoon. Tietokoneen prosessori ei siis tosiaan ymmärrä mitään print "Moi!" komentoa, vaan kääntäjä korvaa sen (useilla) prosessorin ymmärtämillä komennoilla.

Kääntäjän tuottama koodi on siis binääriä, ja siinä ei ole esimerkiksi kommentteja lainkaan. Periaatteessa jokainen ohjelma voidaan kääntää takaisin symboliselle konekielelle eli assemblylle, mutta tällöinkin on on tuloksena vain suuri kasa komentoja, joiden merkityksen ymmärtäminen on ihmiselle käytännössä mahdotonta.

Joillekkin kielille tosin on ihan kohtalaisia decomplimereja olemassa, esimerkisi VB3 on tälläinen. Uudemmillekkin VB:ille on käsittääkseni jonkinlaisia decomplimereja, mutta kaikissa näissä on sellainen ongelma että toimintavarmuus on huono ja mm. kommentit ja muuttujien nimet menetetään (niitä kun ei ole itse ajettavassa tiedostossa.

Sitten vielä lainaus Antin oppaasta:

Opas kirjoitti:

Ohjelma täytyy muuntaa mahdollisimman yksinkertaiselle tasolle, konekielelle, jotta tietokone pystyy sen suorittamaan. Kääntäjä (compiler) muuttaa koko ohjelman yhdellä kertaa konekieliseksi, jonka jälkeen alkuperäistä koodia ei enää tarvita ohjelman suorittamiseen. Käytännössä aina lopullinen ohjelma on käännetty, esimerkiksi Windowsin EXE-tiedostot. Tulkki (interpreter) taas muuttaa ohjelmakoodin rivejä konekieliseksi sitä mukaa, kun ohjelman suoritus edistyy.

Deewiant [03.09.2005 15:53:44]

#

Java on taas siinä mielessä erikoistapaus, että kääntäjä muuttaa koodin Java-virtuaalikoneen ymmärtämään muotoon, eikä konekieleksi.

Tästä syystä Javaakin varten on decompilereita, jotka tuottavat ihan Java-koodia.

Sami [03.09.2005 16:10:58]

#

Java taitaa jopa säästää käännetyssä tiedostossa tiedot alkuperäisistä muuttujanimistä, joten decompilerilla saa purettua jopa ihan hyvin luettavissa olevaa koodia, ellei koodia sitten ole ensin laitettu menemään obfuskaattorin läpi (vai mikä sen koodin epäselventäjän suomenkielinen termi nyt onkaan...)

FooBat [04.09.2005 14:39:28]

#

Kokeile kääntää joku java-ohjelma parametrilla -g ja sitten katso mitä kaikkea käännettyyn tavukoodiin tuli mukaan. 'javap -verbose Luokka'. Javan tavukoodiin tulee tosiaan mukaan muuttujien nimiä ja jopa alkuperäisen koodin rivinumeroita. Lisäksi java-kääntäjä ei juurikaan optimoi koodia, joten alkuperäinen tiedosto pystytään palauttamaan varsin hyvin.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta