Maturski, seminarski i diplomski radovi iz informatike.
Nova procesorska ahitektura predstavlja značajan finansijski rizik i za proizvođače hardware-a i software-a, tako da postoji zajednički interes za jednostavan prenos koda sa jednog procesora na drugi. Binarno prevođenje pruža riješenje za automatsko konvertovanje izvršnog koda za pokretanje na novoj arhitekturi bez rekompajliranja izvornog koda.
Današnji komercijalno najznačajniji mikroprocesori ostaju čvrstvo vezani za naslijeđeni set instrukcija (ISA – Instruction Set Architecture), pri čemu su neki stari preko 10 godina. Pored opštepoznatih nedostataka ovih ISA, proizvođači se teško odlučuju na razvoj radikalno novih, zbog rizika od gubitka komercijalne prednosti postojeće software-ske baze njihovih proizvoda.
S druge strane, software-ski projektanti smatraju portiranje koda na novu arhitekturu teškim i vremenski zahtjevnim. Ako arhitektura ne uspije da oduzme dovljno tržišta za sebe, oni bi (kao i projektanti harware-a) izgubili značajnu investiciju.
Oba ova faktora su se vremenom urotila da zaustave inovacije u dizajnu procesora. Oni također otežavaju novim takmičarima da se pojave. Binarno prevođenje – skup tehnika koje direktno prevode već kompajlirani kod – mogli bi prekinuti gušenje inovacija od strane starih ISA i njihove software-ske baze.
MOGUĆNOSTI ZA NOVU ISA
Razvoj nove ISA je skup, posebno jer često zahtjeva rekompajliranje nekoliko operativnih sistema i brojne aplikacije. Moderni jezici ne definišu semantiku dovoljno strogo da bi se rekompajliranje napravilo transparentnim. S druge strane, semantika binarnog koda je obično dobro definisana, omogućavajući automatsko i transparentno prevođenje. Projektanti su radili na binarnom prevođenju već mnogo godina, ali tek porastom procesorske moći u posljednje vrijeme, postalo je moguće da se prevođenje u potpunosti upotrijebi.
Portirajući naslijeđeni kod iz naslijeđene ISA na novu arhitekturu može se
• Omogućiti posebni mod rada procesora za izvršavanje naslijeđenog koda na novom procesoru
• Rekompajlirati program u novi instrukcijski set
• Koristiti razne software-ske metode za interpretiranje i prevođenje aplikacije
Fokusirat ćemo se na treću klasu, software-ske metode, koje prevode kod tokom njegovog izvršavanja (runtime) ili offline. Postoje više različitih načina prevođenja. Npr.:
• Hewlet-Packard-ov dinamički prevodilac, Aries, pojednostavljuje tranziciju aplikacija sa HP-ove Precision Architecture na IA-64;
• IBM-ovi odjeli za istraživanje imaju BOA koja prevodi naslijeđeni PowerPC kod u cijelosti, a ne samo aplikacioni kod;
• Transmeta je ponudila slično riješenje, za drugu platformu, u vidu novih procesora (Crusoe) i pripadajućeg Code Morphing software-a za prevođenje i izvršavanje x86 koda, uključujući i Windows-a na potpuno drugačijem hardware-u;
• Programi u Javi se tipično prevode u Java bytecode, kako bi se binarna distribucija aplikacije napisane u Javi mogla portirati na bilo koju platformu, za koju postoji JVM (Java Virtual Machine).
• JIT (Just-in-Time) kompajler omogućava kompajliranje skupa bytecode instrukcija u kod ciljne platforme upravo prije izvršenja. JIT može drastično povećati performance Java programa;
• UQBT, dijelo Univerziteta u Queensland-u, je sistem binarnog prevođenja koji – umjesto prevođenja između dva konkretna seta instrukcija – omogućava generalizaciju binarnog prevođenja i rad između virtualno bilo koje dvije arhitekture.
TRI TIPA PREVOĐENJA
Sistemi za software-ski bazirano binarno prevođenje mogu se klasifikovati na emulatore, dinamičke i statičke prevodioce. Emulator interpretira instrukcije programa u toku izvršavanja. Sistem ne pamti interpretirane instrukcije, niti ih kešira. Emulatori su relativno jednostavni za napraviti, i sa malo napora se mogu napraviti dobro kompatibilnim sa naslijeđenom arhitekturom.
Dinamički prevodioci, s druge strane, prevode između naslijeđene i ciljne ISA, keširaju dijelove koda za daljnju upotrebu. Java JIT (just-in-time) kompajleri su praktično najpoznatiji prevodioci u ovoj klasi.
Statički prevodioci prevode programe offline i mogu primjeniti mnogo temeljitije optimizacije koda u odnosu na dinamičke prevodioce. Statički prevodioci mogu upotrijebiti izvršne profile dobijene tokom testnog pokretanja programa.
Svi ovi pristupi imaju ograničenja: I emulacija i dinamičko prevođenje troše vrijeme tokom izvršenja, dok statičko prevođenje kao posebana alat zahtjeva dodatni napor od strane korisnika. Dosta rada na ovom polju na ovom području vezano je za inovativna hibridna riješenja koja kombiniraju najbolje od svih pristupa.
OPTIMIZACIJA U TOKU IZVRŠENJA
Da bi binarno prevođenje služilo kao upotrebljiva alternativa izvršavanju naslijeđene ISA, performanse prevodenog ciljnog koda trebao bi biti uporediv sa performansama naslijeđene arhitekture. Izvršni kod iz naslijeđene arhitekture ima taj luksuz da je proizveden koristeći proces kompajliranje i optimiziranja.
Binarno prevođenje nema u rukama izvorni kod u jeziku visokog nivoa, te naravno radi isključivo sa izvršnim kodom. Ne poznajući semantiku izvornog koda u potpunosti, binarni prevodioc ne može upotrijebiti brojne optimizacije koje koristi kompajler.
Profiliranje
Prilično čest pristup unaprijeđenju performansi binarnog prevođenja su optimizacije vođene profilima. Profili izvršavanja mogu biti generirani efikasno. Oni se dalje koriste pri vođenju optimizacije tokom procesa prevođenja i tokom kasnijeg podešavanja prevedenog bloka.
Sistemi za statičko prevođenje mogu spojiti više profila u jedan. Sistemi za dinamičko prevođenje mogu ponovo prevesti predeveni kod, periodično, u skladu sa promjenama u profilima.
Dinamička optimizacija
Ponekad dinamički prevodioc formira prevedeni kod kao dio izvršne niti, što znači da se zastoji u izvršenju mogu desiti tokom prevođenja. Dinamički prevodioci često koriste informacije o ponašanju programa da bi se optimiziralo izvršenje.
Neke od optimizacijskih tehnika koje se koriste su:
• remapiranje ISA, da bi se riješio problem preklapanja registara, koji postoje u naslijeđenoj ISA, i njihovo remapiranje u registre ciljne ISA;
• preuređivanje osnovnog bloka, kako bi izvršenje na ciljnoj platformi bilo koliko j moguće sekvencijalnije, tj. da se uslovni skokovi predvide, što poboljšava brzinu dobavljanja instrukcija i performanse keša;
• bojenje memorije, kako bi se poboljšalo mapiranje prevedene slike u hijarhijsku strukturu memorije ciljne arhitekture; i
• specijalizacija koda, koja klonira procedure u zavisnosti od vrijednosti parametara
Bilo koja od optimizacija, razmatrana od strane binarnog prevodioca, može biti korištena akko osigura korektnost prevođenja. Korektnost i performanse su vrlo često oprečne strane.
IZAZOVI NASLIJEĐENOG
Pošto su sve mašine – naslijeđene i nove – Turing mašine, bilo koje računanje obavljeno na jednoj, može biti emulirano na drugoj mašini. Binarno prevođenje ima za cilj nešto više od pukog efikasnog emuliranja naslijeđene arhitekture. Binarno prevođenje se trudi emulirati naslijeđenu arhitekturu tako efikasno da se kod izvršava barem onliko brzo na novoj arhitekturi, kao i na naslijeđenim mašinama.
Dostizanje ovog cilja zahtijeva pažljiv dizajn u mnogi područjima. Izvršavanje naslijeđene arhitekture efikasno je težak zadatak, pošto arhitekture nisu nikad striktne.
Memorija
Broj registara na novoj mašini bi trebao biti barem jednak broju na naslijeđenoj mašini. Ako nova mašina ima ima manje registara, tada će se vrijednosti nekih naslijeđenih registara morati čuvati u memoriji, što će u mnogo ćemo poskupiti dobavljanje i smještanje vrijednosti u njih.
Stanja sistema, smještena u registrima posebne namjene, moraju biti podržana u novoj arhitekturi. Npr., ako naslijeđena arhitektura ima posebne registre za segmentaciju, oni bi trebali biti preslikani na ciljnu arhitekturu. Također se mora voditi briga o registrima zastavica, koji čuvaju kodove uslova. Jedan od jednostavnijih pristupa je da ih nova arhitektura postavlja na isti način kao i naslijeđena. Alternativno, prevodioc može koristiti kombinaciju eliminacije redundantnih zastavica zajedno sa pametnim izračunavanjem zastavica.
Memorijski mapirani U/I predstavljaju problem karakterističan za sve prevodioce sistema. Reference na lokacije U/I mogu imati popratne efekte kao što su slanje paketa u mrežu ili aktiviranje alarma, i moraju biti odrađeni onim redoslijedom kojim su keširani.
Arhitektura
Mnoge arhitekture sadrže instrukcije koji moraju biti izvršavane nedjeljivo u odnosu na memoriju; što znači da drugi procesor ne može pristupiti memoriji dok se instrukcija ne izvrši. Replikacija ove semantike na drugu arhitekturu je vrlo često komplikovana.
Zabrana prekida predstavlja problem sličan nedjeljivosti. Neke arhitekture, kao što je IBM S/390, imaju kompleksne instrukcije koje traže više ciklusa za izvršenje i moraju se izvršiti u potpunosti ili nikako. Nova arhitektura može unaprijed izvršiti prevedene takve instrukcije bez popratnog efekta koji će garantovati izvršenje u realnom primjeru.