Lankide:Asanz060/Proba orria

Wikipedia, Entziklopedia askea
Artikulu hau, osorik edo zatiren batean, wikipediako «Compilador» artikulutik itzulia izan da. Jatorrizko artikulu hori GFDL edo CC-BY-SA 3.0 lizentzien pean dago. Egileen zerrenda ikusteko, bisita ezazu jatorrizko artikuluaren historia orria.


Konpilazio-prozesua[aldatu | aldatu iturburu kodea]

Konpilazioa goi mailako programazio-lengoaia jakin bateko aginduak makina-lengoaiara itzultzen dituen prozesua da. Horretarako, programa exekutagarri bat sortu behar da, adibidez, .exe luzapeneko programa bat.

Normalean, programa exekutagarria sortzeko bi pauso jarraitu behar dira. Lehenengo pausoari konpilazio deritzo, eta fase honetan goi-mailako programazio-lengoaia batean idatzitako iturburu-kodea behe-mailako kodera itzultzen du (ez makina-lengoaiara). Bigarren pausoari kateatzea deritzo, eta fase honetan aurrekoan sortutako behe-mailako kode guztiak konpiladorearen liburutegietako funtzio guztiekin kateatzen dira, horrela, exekutagarria zuzenean sistema eragilearekin komunikatu ahal da. Pauso hau bukatzeko, kode guztia makina-kodera itzultzen da, eta modulu guztiz exekutagarria lortzen da.

Posible da programa batek programazio-lengoaia desberdinetan idatzitako zatiak izatea, adibidez: C, C++, Asm... Kasu honetan, zati horiek era independentean konpilatzen dira eta ondoren, kateatze fasean, zati guztiak kateatzen dira modulu exekutagarri bakarrean.

Prozesuaren etapak[aldatu | aldatu iturburu kodea]

Itzulpen prozesu honetan hainbat fase daude, eta bakoitzean eragiketa logiko batzuk gauzatzen dira.

Analisi-fasea[aldatu | aldatu iturburu kodea]

Konpilazio-prozesuaren lehenengo fasea analisi-fasea da. Analisi fase honek bere barruan hiru azpi-fase ditu, eta horietako bakoitzean analisi mota desberdin bat egiten da.

Analisi lexikoa[aldatu | aldatu iturburu kodea]

Lehen azpi-fasean analisi lexikoa egiten da. Bertan, iturburu-kodea irakurtzen da ezkerretik eskumara, eta irakurritakoa token izeneko osagai lexiko batzuetan taldekatzen da. Horretarako, konpiladoreak hiztegi moduan ezagutzen dituen karaktere-kate bakoitzarekin token bat osatzen du. Horrez gain, zuriuneak, lerro zuriak eta iruzkinak ezabatzen dira iturburu-kodetik. Bukatzeko, lengoaiaren sinbolo guztiak (hitz-gakoak, eragileak, etab.) era egokian idatzi direla konprobatzen da.

Adibidez, idatzitako iturburu-kodean "x = 12*(3+4)^2" espresioa agertzen bada, analisi lexikoaren prozesuan sortzen diren tokenak hurrengoak dira: x, =, 12, *, (, 3, +, 4, ), ^ eta 2.

Analisi lexikoaren helbururik garrantzitsuena hurrengo fasearentzat irakurterraza izango den egitura bat sortzea da. Fase honetan onargarria ez den edozein hitz aurkituz gero, konpiladoreak errore mezu bat sortuko du eta ez du hurrengo faseekin jarraituko.

Analisi sintaktikoa[aldatu | aldatu iturburu kodea]

Bigarren azpi-fasean analisi sintaktikoa gauzatzen da. Fase honetan aurretik sortutako tokenak irakurtzen dira, eta osagai lexiko hauek egitura hierarkiko bat jarraituz antolatzen dira, esaldi gramatikalak osatuz. Ondoren, talde bakoitzaren sintaktika egokia dela konprobatzen da, hau da, programazio-lengoaiaren gramatika betetzen duela. Orokorrean, programaren esaldi gramatikalak analisi sintaktikoaren zuhaitzaren bitartez adierazten dira.

Programa baten egitura hierarkikoa adierazteko, arau desberdinak definitzen dira. Adibidez, espresioen definiziorako hurrengo arauak jarrai daitezke:

  1. Edozein identifikatzaile espresioa da
  2. Edozein zenbaki espresioa da
  3. Espresioa1 eta Espresioa2 espresioak badira, orduan:
    • Espresioa1 + Espresioa2 ere espresioa da
    • Espresioa1 * Espresioa2 ere espresioa da
    • (Espresioa1) ere espresioa da

Analisi sintaktikoan zehar akatsen bat aurkituz gero, konpiladoreak errore mezu bat sortuko du eta ez du hurrengo faseekin jarraituko.

Analisi semantikoa[aldatu | aldatu iturburu kodea]

Analisi-etaparen azken azpi-fasean analisi semantikoa gauzatzen da. Fase honetan, iturburu-programa berrikusten da akats semantikoak detektatzeko asmoarekin. Akats semantikoaren adibide bat hurrengoa izan daiteke: deklaratutako aldagai baten mota eta ondoren aldagai horri esleitutako balioaren mota bat ez etortzea. Adibidez, int kontagailua=a espresioan "a" balioa karaktere bat da, eta int motak zenbaki oso bat espero du. Beraz, kasu honetan konpiladoreak akats semantiko bat dagoela adierazten du.

Akats semantikoak aurkitzeaz gain, konpiladoreak aldagai bakoitzaren motei buruzko informazioa biltzen du, ondorengo faseetan erabili ahal izateko. Analisi semantikoa egiterakoan, aurreko fasean gertatzen zen bezala, lortutako informazioa egitura hierarkiko baten bidez adierazten da. Egitura honi esker espresio desberdinen eragingaiak eta eragileak identifika daitezke.

Fase honetako atalik garrantzitsuenetariko bat moten egiaztapena da. Bertan, eragile bakoitzak baimendutako eragingaiak dituela egiaztatu behar da, iturburu-lengoaia bakoitzak duen espezifikazioen arabera. Adibidez, programazio-lengoaia batzuek definitzen dute matrize baten indize bezala ezin dela zenbaki erreal bat jarri, beraz, konpiladoreak semantika-akats bat adieraziko du hori gertatzen den bakoitzean. Programazio-lengoaia bakoitzak arau semantiko desberdinak izan ditzake.

Sintesi-fasea[aldatu | aldatu iturburu kodea]

Analisi-fasea bukatu denean, sintesi-fasea gauzatzen da. Bertan, iturburu-programaren baliokide izango den objektu-kode bat sortu behar da. Objektu-kodea sortzeko beharrezkoa da analisi-akatsik ez egotea, beraz, aurreko faseetako edozein puntutan akatsen bat aurkituz gero, sintesi-fasea ez da hasiko. Hala ere, analisi-akatsik ez egoteak ez du esan nahi programak ondo funtzionatuko duenik, izan ere, programak kontzeptu-erroreak edo txarto kalkulatutako espresioak izan ditzake.

Objektu-kodea normalean modulu desberdinetan banatutako eta makina-lengoaian edo mihiztadura-lengoaian idatzitako kodea izaten da. Kode horiek sortzeko, programak erabiltzen dituen aldagai bakoitzarentzat memoria-posizio bat aukeratu behar da.

Tarteko kodearen eraketa[aldatu | aldatu iturburu kodea]

Analisi sintaktikoa eta semantikoa egin ondoren, konpilatzaile batzuek tarteko kode bat eratzen dute. Kode honek ezaugarri garrantzitsu bi bete behar ditu: sortzeko erraza eta objektu-kodera itzultzeko erraza izan behar da.

Tarteko adierazpen honek forma desberdinak izan ditzake. Formarik erabilienetako bat "hiru norabideko kodea" izenekoa da, eta forma honetan memoria-posizio bakoitzak erregistro moduan egin dezake lan. Kodea agindu-sekuentzia batez osatzen da, eta bere ezaugarri orokorrak hurrengoak dira:

  • Agindu bakoitzak gehienez hiru eragile ditu.
  • Hiru norabideko agindu bakoitzak gehienez eragingai bakarra dauka, esleipenaz gain.
  • Itzultzaileak aldi baterako izen bat sortu behar du, agindu bakoitzak kalkulatutako balioak gordetzeko.
  • Hiru norabideko agindu batzuek hiru eragile baino gutxiago dituzte.

Kodea optimizatzea[aldatu | aldatu iturburu kodea]

Azken faseari kodearen optimizatzea deritzo. Fase honetan aurreko fasean sortutako tarteko kodea hobetzen da, makinak arinago exekuta dezan. Konpiladore desberdinek kodeen optimizazio-maila desberdinak gauzatzen dituzte. Optimizazio handia egiten duten konpiladoreei «konpiladore optimizatzaile» deitzen zaie, eta mota hauetako konpiladoreetan prozesu-denboraren zatirik handiena optimizazio fasean erabiltzen da. Hala ere, optimizazio sinpleagoak egiten dituzten konpilatzaileak ere badaude, objektu-programaren exekuzio-denbora nabarmenki gutxitzen dutenak baina konpilazioa asko atzeratzen ez dutenak.​

Kanpo loturak[aldatu | aldatu iturburu kodea]

http://libroweb.alfaomega.com.mx/book/477/free/ovas_statics/lec_adicionales/Compiladores.pdf