Klin se klinom izbija
U nekim slučajevima ne može da se dokaže da neka naredba neće izazvati prekid (bilo zbog toga što ta naredba zaista izaziva prekid pod nekim okolnostima, ili zato što kompajler nije dovoljno "pametan" da izvede dokaz), a nije moguće ili nije profitabilno da se veštački ubacuju naredbe koje će izazvati prekid umesto nje. U tom slučaju se i dalje mogu vršiti optimizacije koje premeštaju kod preko te naredbe, naravno uz dodatne komplikacije. Čitavo telo metoda koji se optimizuje se obavije try konstrukcijom, a svi prekidi koji nastanu unutar metoda se "hvataju" specijalnim kodom (exception handler) koji je generisao kompajler. U taj kod je ugrađeno znanje o svim optimizacijama koje su izvršene unutar metoda i svim naredbama koje su "preskočene", iako mogu da izazovu prekid. Ovaj specijalni kod zatim ispituje generisani prekid, utvrđuje da li je izazvan od strane naredbe koja je "preskočena" prilikom optimizacije i u tom slučaju izvrši potrebne modifikacije u stanju sistema, dovede program u korektno stanje (ono stanje u kojem bi bio da nije bilo nikakvih optimizacija) i prosledi prekid dalje na obradu od strane korisnika. Tako smo iskoristili sam mehanizam prekida da rešimo problem koji je na prvom mestu i bio izazvan postojanjem tog mehanizma. Klin se klinom izbija...
Slika 4 |
public void runTest() {
Integer a = new Integer(10);
...
x = a.intValue(); // [1]
...
}
|
Ova tehnika se isplati samo ako programer koristi mehanizam prekida za obradu vanrednih situacija, tj. ako se prekidi u programu dešavaju vrlo retko. Tada optimizovani program radi brže od originalnog, prekidi se retko dešavaju, pa se retko dolazi u situaciju da mora da se izvrši (skupa) rekonstrukcija stanja programa... svi su srećni i zadovoljni! Ako je program napisan tako da obilato koristi prekide, može se desiti da se optimizovana varijanta izvršava sporije od originala, ali će se i dalje izvršavati korektno tj. korisnik neće moći da primeti razliku (osim u brzini) između izvršavanja optimizovanog i neoptimizovanog programa.
Slične tehnike se primenjuju prilikom debagovanja optimizovanih programa. U nekim specifičnim situacijama (programi koji vrše real-time obradu, programi koji su suviše veliki ili se suviše dugo izvršavaju da bi se mogli debagovati neoptimizovani) neophodno je koristiti optimizovanu verziju programa prilikom debagovanja. Kada korisnik specificira tačku u kojoj program treba da se zaustavi (breakpoint), debager se susreće sa problemom: neke naredbe su, kao posledica optimizacije premeštene ispred ili iza tačke u kojoj je program zaustavljen, imajući kao posledicu to da neke promenljive u programu imaju nekorektnu (različitu od one koju bi imale u slučaju da je neoptimizovan program zaustavljen u istoj tački) vrednost.
Debager, znajući koje su optimizacije izvršene na datom programu, rekonstruiše korektno stanja programa i prijavljuje korisniku vrednosti promenljivih koje bi one imale da program nije optimizovan. Postoji ipak jedna bitna razlika između debagovanja optimizovanih programa i rekonstrukcije stanja programa koristeći mehanizam prekida. Debager je alatka - ako nije u stanju da odredi korektnu vrednost promenljive, on će to saopštiti korisniku, a korisnik će, uz manje ili veće probleme, nastaviti debagovanje. U našem slučaju kompajler vrši izmene na samom programu i mora da obezbedi mehanizam rekonstrukcije korektnih vrednosti za sve promenljive, inače ne sme primenjivati optimizacije koje bi dovele do nekorektnog stanja. Ovo čini stvari mnogo komplikovanijim i interesantnijim, praveći jako zgodnu oblast za istraživanja.
Sve u svemu, umereno korisna osobina programskih jezika kao što je mehanizam prekida može ozbiljno da zagorča život autorima kompajlera. Ovi potonji, budući jedna dosta bistra grupacija ljudi, brzo pronalaze rešenja koja prevazilaze nastale probleme, što dalje inspiriše tvorce programskih jezika da komplikuju stvari, i tako u nedogled. A sve to za dobrobit programera, što lakše pisanje programa, naklonost korisnika i, naročito, njihova platežna sredstva u obliku zelenih novčanica, kreditnih kartica i čekova. Dobrobit nauke? A da, i to...
|