Lankide:Aitor Jaio/Proba orria

Hemen nire zatia hasten da, hau sarrera da.


Konpilazioa egiterako momentuan, datu egiturak konpiladorearen toki desberdinetan gorde egiten dira gero errazago erabiltzeko. Horrela, optimizazioak egiterako orduan zailtasun gutxiago egongo direlako eta horrela prozesua hobetu.

Hemen egondako atal batzuk kendu ditut nireak ez direlako


Oinarrizko datuen egitura aldatu

Konpilatzaileak oso elkarrekintza sendoak ditu, erabilitako algoritmoen faseen eta honek jasaten dituen datuen egituren artean. Beraz, konpilatzailearen idazleak ahal duen heinean, inplementatutako algoritmoak modurik eraginkorrenean idazten ditu.

Osagai lexiko edo tokenak aldatu

Lexiko aztergailu batek tokenen ezaugarriak batzen dituenean, normalean tokena modu sinboliko batean irudikatzen du, hau da, iturburu lengoaian idatzitako token taldea irudikatuz zerrendatutako datuen itxuradun balio baten bezala. Batzuetan, beharrezkoa izaten da karaktere kate berdina edo katearen informazio deribatua mantentzea. Besteak beste; izena, identifikazio token bati elkartua, edo zenbakizko token baten zenbakia. Hizkuntza gehienetan lexiko analizatzaileak token bat sortzea bakarrik behar du. Kasu honetan, aldagai global sinple bat erabil daiteke tokenaren informazioa mantentzeko. Beste kasu batzuetan (adibiderik esanguratsuena FORTRAN da), beharrezkoa izan daiteke tokenen matrize bat erabiltzea.

Zuhaitz sintaktikoa aldatu

Sintaxi-analizatzaileak zuhaitz sintaktiko bat sortzen badu, normalean egitura estandar bat eratzen da. Zuhaitz osoa gorde daiteke aldagai sinple baten bezala, jatorrizko adabegirekin erlazionaturik. Egiturako adabegi bakoitza, informazioa gordetzeko erregistro bat da. Informazioa, bai sintagma aztergailuarekin bai ondoren aztergailu semantikoarekin lortu egiten da. Esate baterako, adierazpen baten datuak, zuhaitz sintaktikoaren adabegiaren adierazpen bezala kontserba daitezke.

Noizean behin, memorian tokia aurrezteko, eremu honek era dinamiko batean ezartzen dira edo beste datu egitura batzuetan gorde egiten dira. Hala nola, ikurren taulak, esleipena egitea eta desegitea ahalbidetzen du. Egia esan, zuhaitz sintaktikoko adabegi batek ezaugarri desberdinak behar izan dezake gorde ahal izateko; hizkuntza egituraren irudikapenaren arabera. Kasu honetan, zuhaitz sintaktikoko adabegietako bakoitza irudikaturik egon daiteke erregistro aldakor batekin.

Ikurren taula aldatu

Datu egitura hauek, informazioa identifikadoreei erlazionatuta mantentzen dituzte: funtzioak, aldagaiak, konstanteak eta datu-mota. Ikurren taulak, konpiladorearen faseen gehiengoarekin elkar eragina du. Besteak beste, lexiko, sintagma edo semantika aztertzaileek identifikatzaileak sar dezakete taularen barnean. Semantika analizatzaileak, datu-motak eta informazioa gainera dezake. Azkenik, optimizazio eta kode sorkuntza faseek ikurren taulako informazioa erabil dezakete, aukeraketa egokiak eginez objektu kodean.

Ikurren taulak sarrera eskaerak maiztasun handiz izango dituenez; txertatze, ezabatze eta sarrera eragiketak eraginkorrak izan behar dira. Ahal izanez gero, eragiketak denbora konstanteak izatea hobea izango da. Gainera, helburu horiek dituzten datu-egitura estandar bat dispertsio edo kalkulu-helbide taula da, nahiz eta zenbait zuhaitz egitura ere erabil daitekeen. Batzuetan, taula ugarietan eta zerrenda edo pila batean mantendu egiten dira.

Literalen taula aldatu

Literalen taulan, konstanteak eta programarentzako erabilitako kateak gorde egiten dira. Horretaz gain, bilaketa eta txertaketa azkarra izatea garrantzitsua da. Gainera, literalen taulak, ezabaketak galarazi egin behar ditu bere datuak programa guztian erabiltzen direlako. Halaber, literalen taula garrantzitsua da programak memorian izango duen tokia murriztea ahalbidetzen duelako, honi esker, konstanteak eta kateak berrerabil daitezkeelako. Bestalde, garrantzitsua da ere, kode sorgailuak helbide sinbolikoak literalentzako sor dezan eta datu definizioak objektu kodearen fitxategian sartzeko.

Bitarteko kodea aldatu

Barne kodea, testu kateen konponketa behin behineko testu fitxategi edo lotutako egitura zerrenda bezala mantendu daiteke; barne kode motaren (hiru norabidedun kodea edo P kodea) eta egindako optimizazio moten arabera. Gainera, optimizazio konplexuak burutzen dituzten konpiladoreetan, arreta berezia jarri beharra dago berrantolaketa erraz bat baimentzen duten irudikapenen aukeretan.

Bitarteko kodeen sorkuntza aldatu

Konpiladore batzuek bitarteko iturburu programaren irudikapen bat sortzen dute, azterketa sintaktiko eta semantikoa egin ondoren. Sortutako bitarteko iturburu programa, makina abstraktu batentzako programa bezala kontsidera daiteke. Beraz, programak bi propietate garrantzitsu izan behar ditu: produzitzeko erraza eta helburu programara itzulerraza izan behar da.

Bitarteko irudipenak, forma desberdinak izan ditzake. Forma horretako bat, hiru noranzko kodea da. Hori, memoriako toki bakoitza erregistro bezala jarduten duen makina baten hizkuntza mihiztatzailearen bezalakoa da. Kodea aginduen segidan oinarritzen da. Agindu bakoitzak gehienez hiru eragingai izanik. Hasierako datua beste kode batzuk erabiliz molda daiteke bukaerako datua lortzeko. Horrela, iturburu programa (1) hiru noranzkodun kode bezala aurki daiteke.

temp1 := entreal(60)
temp2 := id3 * temp1     ===> (2)
temp3 := id2 + temp2
id1 := temp3

Bitarteko irudikapen honek propietate ezberdinak ditu. Lehengoa, hiru noranzkoko instrukzio bakoitzak, esleipenaz gain, eragile bat du. Beraz, konpiladoreak aginduak exekutatzeko ordena aukeratu behar du. Kasu honetan, biderketak lehentasuna izango du batuketarekiko. Bigarrena, konpiladoreak behin behineko izen batekin gorde beharko du instrukzio bakoitzean lortutako balio desberdinak. Azkena, agindu batzuek hiru operadore baino gutxiago dituzte, adibidez lehenengo eta azken aginduek.

Kodearen optimizazioa aldatu

Kodearen optimizazio faseak, bitarteko kodearen hobekuntza du helburu. Horrela, makinak bizkorrago exekutatuko duen kodea lortuz. Kasu batzuetan, optimizazio batzuk garrantzirik gabekoak izaten dira, hau da, bitarteko kodea sinplea izaten denez, optimizazioak ez du eragin esanguratsurik kodearen exekuzioan. Lehenago aipatutako adibidean, bitarteko kodea (2) algoritmo natural batek sortua da. Azterketa semantikoaren ondoren zuhaitzaren irudikapena egiteko, instrukzio bat eragile bakoitzeko erabiltzen du. Orokorrean, kalkulu berak egiteko beste modu bat dago, bi instrukzio erabiliz.

temp1 := id3 * 60.0  ===> (3)
id1 := id2 + temp1

Algoritmo erraz honek ez du ezer txarrik, duen arazoa kodearen optimizazio fasean konpon daitekeelako. Hots, konpiladoreak bakarrik ondoriozta dezake 60a zenbaki osotik naturalera bihurketa egitea konpilazio momentuan. Beraz, "entreal( )" agindua ken daiteke. Gainera, temp3 aldagaia, bere balorea id3 baloreari transmititzeko bakarrik erabiltzen da. Ondorioz, temp3 balorea id3 baloreagatik alda daiteke. Hortaz, (2)ren azken proposamena ez da beharrezkoa eta (3)ren kodea lortu egiten da.

Konpiladoreen artean, aldakuntza asko daude optimizatzen duten kode kantitatearen arabera. Hau da, optimizazio asko egiten dituzten konpiladoreak daude, "optimizazio konpiladore" izenekoak. Horiek, konpilatzailearen denbora gehiena fase honetan xahutzen dute. Bestalde, optimizazio sinpleak daude, non, programaren exekuzio denbora hobetu egiten duten.

Behin behineko fitxategiak aldatu

Hasieran konputagailuek ez zuten memoria nahikoa programa oso bat gordetzeko konpilatzen zen bitartean. Arazo hori konpontzeko, behin behineko fitxategiak sortu ziren. Horrela, behin behineko fitxategiak erabiliz bihurketa gauzatzeko bitarteko pausoetan, produktuak mantenduz. Hau da, iturri programaren bihurketan informazio baliagarria mantenduz.

Ikus, gainera aldatu