konpiladorea etiketadun mezuak erakusten. Erakutsi mezu guztiak
konpiladorea etiketadun mezuak erakusten. Erakutsi mezu guztiak

2025(e)ko martxoaren 28(a), ostirala

Konpiladorea eta estekatzailea






Aurrekariak

Dakigunez ordenadore baten funtzionamendua programa batek gidatzen du. Baina, defini dezagun programa bat zer den informatikaren arloan:

Programa: Ordenagailu bati programazio-lengoaia batean idatzita ematen zaion agindu-segida, lan jakin bat egiteko behar diren oinarrizko eragiketak ordenagailuak exkutatzeko moduan zehatz-mehatz azaltzen dituena. 

Baina ez dugu ahaztu behar ordenagailua makina digitala dela eta exekuta dezakeen programa berari dagokion makina-kodean idatzirik eman behar zaiola.

Makina-kode: makina-kodea edo makina-programa ordenadoreak ulertzen duen agindu-multzoa da. Ordenagailuaren PUZak (prozesatzeko unitate zentralak) zuzenean, itzulpenik gabe, exekuta dezakeen agindu-multzoa. Agindu horiek sistema bitarrean adierazten dira eta bakoitzak eragiketa aritmetiko edo logiko bat adierazten du. Ordenagailu batetik bestera alda daiteke. 

Modu beretsuan, ez dugu ahaztu behar guk goi-mailako lengoaiaren bat erabiliko dugula programa idazteko eta horregatik gure programa "itzuli" beharko dela ordenadoreak exekuta dezan. Hori dela eta, guk idatzitako programari iturburu-programa esaten zaio, hauxe da bere definizioa.

Iturburu-programa: iturburu-programa edo iturburu-kodea goi-mailako lengoaian idatzitako sententzia eta aginduen multzoa da. Ordenagailuak exekutatu ahal izateko konpiladore, mihiztatzaile edo interpretatzaileen bidez makina-lengoaiara bihurtu behar dena, hots, iturburu-programa itzuli beharra dago ordenadoreak exekuta dezan.  

Eskematikoki:

Adibidean ikusten denez, iturburu-programa C lengoaian idatzita dago eta itzultzailea GNU GCC Compiler
konpiladorea litzateke. Baina eskema honek balio du ere edozein goi-mailako programazio-lengoaiarako.

Iturburu-programa itzuli beharra dagoela eta, goi-mailako lengoaian bi motatakoak izan daitezke: Interpretatuak eta Konpilatuak. Goi-mailako lengoaia interpretatuetan interpretatzaile bat aplikatzen zaio programari makina-kodea lortzeko. Goi-mailako lengoaia konpilatuetan programaren itzultzaile lana konpiladoreak egingo du.

Interpretatzaile: Goi-mailako lengoaia itzultzeko programa orokorra da, aginduak irakurri ahala aztertu eta exekutatzen dituena. Goi-mailako lengoaia interpretatuen adibideak: Python, PHP, Perl, MATLAB, Ruby, JavaScript, ... 

Konpiladore: Goi-mailako lengoaian idatzitako programa oso bat hartu eta itzuli edo konpilatzen duen programa da. Goi-mailako lengoaia konpilatuen adibideak: Pascal, C, C++, ... 

Informatikaren arloan konpilatzea iturburu-programa bat itzultzea da, ordenadore baten makina-kodera itzultzea alegia. Konpilatze prozesuak fase desberdinak ditu eta horiekin ez da programa exekutagarria lortzen, konpilatzeari beste estekatzea gehitu behar baitzaio.

Konpilatzearen faseak ondoko irudian erakusten dira:

Non bost fase hauek desberdintzen diren:

  1. Analisi lexikala: Lexikoaren analisia, hitzen analisia, lehenengo fasea da; hemen iturburu-programa (.c luzapena edo .h luzapena duen kodea) ezkerretik eskuinera irakurtzen da eta osagai lexikoetan (tokenak) biltzen da, esanahi bat duten karaktere-sekuentziak direnak. Gainera, zuriune guztiak, lerro zuriak, iruzkinak eta beharrezkoa ez den gainerako informazioa iturburu-programatik ezabatzen da. Lengoaiaren sinboloak (hitz gakoak, eragileak, etab.) behar bezala idatzi direla ere egiaztatzen da. Adibidez, fase honetan aurkitzen dira ";" baten falta, edo ">=" ordez "=>" idatzi dela, edo aldagai baten etiketa okerra, edo etiketa bera bikoiztuta dagoela
  2. Analisi sintaktikoa: Fase honetan, tokenak edo osagai lexikoak hierarkikoki biltzen dira gramatika-esaldietan, eta horiek konpiladoreak erabiltzen ditu bere irteera sintetizatzeko. Aurreko fasetik lortutakoa sintaktikoki zuzena den egiaztatzen da (lengoaiaren gramatikaren araberakoa da). Oro har, iturburu-programaren esaldi gramatikalak analisi sintaktikoko zuhaitz baten bidez adierazten dira. Adibidez, fase honetan parekatzen dira adierazpen desberdinen () parentesi bikoteak edo {} giltz bikoteak
  3. Analisi semantikoa: Analisi semantikoaren faseak iturburu-programa berrikusten du akats semantikoak aurkitzen saiatzeko, eta datu-motei buruzko informazioa biltzen du kodea sortzeko ondorengo faserako. Analisi semantikoaren zeregin garrantzitsu bat datu-motak egiaztatzea da. Hemen, konpiladoreak operadore bakoitzak iturburu-lengoaiaren espezifikazioagatik baimendutako operandoak dituen egiaztatuko du. Adibidez, string datu-motako aldagai bati zenbaki erreal ezingo zaio esleitu, edo % operadore aritmetikoa ezin zaio karaktere-kate bati aplikatu
  4. Kodearen sortzea: Sintesi-fasea honetan iturburu-programaren baliokidea den objektu-kodea sortzean datza. Iturburu-programak analisi-akatsik ez duenean bakarrik sortzen da objektu-kodea; horrek ez du esan nahi programa behar bezala exekutatuko denik, programa batek kontzeptu-akatsak edo gaizki kalkulatutako esamoldeak izan baititzake
  5. Kodearen optimizatzea: Kodea optimizatzeko fasea bitarteko kodea hobetzean datza, exekutatzeko makina-kode azkarragoa izan dadin. Alde handia dago konpiladoreek exekutatzen duten kode-optimizazioaren kopuruan. Optimizazio handia egiten dutenetan, "Konpiladore optimizatzaileak" deituak, konpiladorearen denboraren zati esanguratsu bat fase honetan luzatzen da. Hala ere, optimizazio sinple batzuk nabarmen hobetzen dute objektu-programa gauzatzeko denbora, konpilazioa gehiegi atzeratu gabe

Objektu-kodea eta objektu-programa aipatu dira goian, izan ere konpilatzearen emaitza .o luzapena, edo .obj luzapena duen fitxategi bat izango da eta fitxategi horri objektu-programa esaten zaio. Objektu-programaren fitxategi hau, makina-kodean idatzita egon arren ezin da exekutatu programa-liburutegien kodea falta zaiolako. Linker edo estekatzaile delako programak objektu-kodetik abiatuta .exe luzapeneko programa-exekutagarria lortuko du.



Estekatu aditzaren esanahia lotu edo elkartu da. Esan bezala, linker edo estekatzaile delako programak .obj (edo .o luzapena) objektu-kodetik abiatuta .exe luzapeneko programa-exekutagarria lortuko du, objektu-kodeari falta zaizkion programa-liburutegiak gehituz. Baina, programa-liburutegiaren eta estekatzailearen definizioak eman ditzagun.

Programa-liburutegi: Programatzaileen eskueran dauden prozedura edo programa prekonpilatuen multzoa. 

Iturburu-programa konpilatu ondoen lortzen den objektu-kodeari aurredefinituriko prozedura eta funtzioak falta zaizkio. Prozedura eta funtzio horiek programa-liburutegietan bildurik daude makina-kodean itzulirik. Estekatzaile delako programak objektu-kodea eta programa-liburutegiak lotu/elkartu egiten egiten ditu. 

Estekatzaile: Independenteki idatzi eta independenteki konpilatu programa edo moduluak elkarrekin lotu eta programa exekutagarri koherente bat eratzen duen programa. 

Eskema honetan bi urratseko prozesua erakusten da Pascal lengoaiarako, non iturburu-kodearen luzapena .pas den eta objektu-kodearen luzapenak .ow edo.ppw diren:

Irudi honetan ere Pascal lengoaiaren kasua erakusten da, baina funtsean C lengoaian berdina da.

Baina non aurkitzen dira .ow eta .ppw luzapeneko prekonpilatutako moduluak? Dev-Pas konpiladorearen kasuan, irudi honek adierazten digu modulu horiek estekatzaileak non bilatuko dituen; konpiladorea C:\Dev-Pas karpetan instalatu bada, unitate prekonpilatuak C:\Dev-Pas\units\rtl karpetan kokatuko dira:

Aurrekonpilatutako moduluen kokapena diskoan Pascal konpiladore baten kasuan

Unitateen eta liburutegien direktorio horiek Dev-Pas konpilazio-ingurunea instalatzean ezartzen dira, behar izanez gero Options > Compiler options > Directories bidea jarraituz alda ditzakegu:

Liburutegien direktorioak Dev-Pas konpilazio-ingurunereako

C eta C++ lengoaiekin lan egiteko, MinGW konpiladorearen kasuan, aurrekonpilatutako moduluak lib liburutegiko karpetan daude.

 

2024(e)ko abenduaren 1(a), igandea

Iturburu-programatik programa exekutagarrira

C programa lortzeko, hurrengo irudian adierazten diren hiru urratsak bete behar dira:


  1. Editzea: Programaren kodea testu-fitxategi batean A.c (edo gehiagotan, B.c) idatziko dugu editore bat erabiliz. Idatzitako kode horri iturburu-programa edo iturburu-kode esaten zaio, guretzat irakurgarria da baina makinak digitalak (ordenadoreak) ez du ulertzen. iturburu-programa itzuli beharra dago makina-kodea lortzeko.
  2. Konpilatzea: Konpiladorea programak itzultzaile lanak betetzen ditu eta kargatzen zaion iturburu-programari dagokion makina-kodea ematen du, A.c iturburu-programatik A.o objektu-programa (edo A.obj objektu-programa) emango du konpiladoeak. Makina-kodea ez da irakurgarria guretzat kode bitarrean dagoelako baina ordenadoreak uler dezake.
  3. Estekatzea: Ordenadoeak objektu-programak uler ditzake baina ezin ditu exekutatu zenbait zati falta zaizkielako, adibidez D.lib liburutegietan gordetzen diren funtzioak falta zaizkio. Estekatzaile (edo linker, edo muntatzaile) programak elkartu egiten ditu konpiladoreak emaniko objektu-programak eta liburutegietako gainerako moduluak. Emaitza, bilatzen dugun A.exe programa exekutagarria da.

Esan bezala, urratsak hiru dira, nahiz eta azken biak (konpilatzea eta estekatzea) elkarrekin burutzen diren bata bestearen ostean eta gehienetan urrats bakar bat dela iruditzen zaigun. C programa bat konpilatzean, GCC konpiladore programak azken bi lanak jarraian burutzen ditu: kodea konpilatu eta liburutegiekin lotu.




Hurrengo bideoan erakusten da nola instalatu MinGW (Minimalist GNU for Windows) konpiladorea:

 

Dena den, gomendatzen da biak aldi berean instalatzea. Hau da, Code::Blocks ingurunearen instalazioa artikuluan azaltzen den bezala, Code::Blocks programazio-ingurunea eta berarekin batera MinGW (Minimalist GNU for Windows) konpiladorea elkarrekin instalatzea.

 

Editatu > Konpilatu > Exekutatu

Code::Blocks programazio-ingurunean C proiektu bat prestatzeko eman beharreko urratsak hauek dira labur-labur:

File > New > Project... > Console application > C > Project title: > GNU GCC Compiler

Konpiladore baten lana itzultzailearena da, hots, guk idatzitako programa (goimailako lengoaian idatzitakoa) makinak ezagutzen duen lengoaiara (behemailako legoaiara) itzultzea. Urratsak hiru dira eta bakoitzeko irudi bana erakusten da jarraian. Lehen irudian editatze lana adierazten da, eta hurrengo bietan konpilatzea eta exekutatzea (exekutatu eta egikaratu aditz baliokideak dira).


KaixoMundua delako proiektuaren main.c textu-fitxategia editatu programa idazteko


Eskematikoki:

Adibidean ikusten denez, iturburu-programa C lengoaian idatzita dago eta itzultzailea GNU GCC Compiler
konpiladorea litzateke. Baina eskema honek balio du ere edozein goi-mailako programazio-lengoaiarako.
KaixoMundua delako proiektua ongi konpilatzean dagokion mezua agertuko da beheko leihoan
eta kodeak akatsik ez badauka
KaixoMundua.exe programa exekutagarria sortuko da

KaixoMundua.cbp proiektuari dagokion KaixoMundua.exe programa exekutagarria bin\Debug\ karpetan sortuko du Code::Blocks programazio-inguruneak.




KaixoMundua delako proiektuaren KaixoMundua.exe programa exekutatzeko ingurunetik egin
daiteke edo programa exekutagarria kokatuta dagoen karpetara joanda bertatik exekuta daiteke

Esan bezala, KaixoMundua.exe programa exekutagarria exekutatzeko Code::Blocks programazio-ingurunea barrutik egingo dugu gehienetan. Baina KaixoMundua.cbp proiektuaren bin\Debug\ karpetara joanda, bertatik exekuta daiteke ere KaixoMundua.exe programa.




Adibidez: sinuaren kurba marraztu

Beraz, ariketa bati aurre egiteko lehenik zer eskatzen diguten ariketaren enuntziatua ulertu behar dugu (0 urratsa izango litzateke). Ondoren programazio-lana letorke (gorago aipatu ditugun 1 eta 2 urratsak) eta bukaeran lortutako programa exekutatzea (gorago aipatu den 3 urratsa). Grafikoki honelaxe adieraz daiteke:


Code::Blocks ingurunearen instalazioa


Hurrengo bideoan erakusten da nola instalatu Code::Blocks programazio-ingurunea eta berarekin batera MinGW (Minimalist GNU for Windows) konpiladorea:

Ikusi ere Iturburu-programatik programa exekutagarrira artikulua non MinGW (Minimalist GNU for Windows) konpiladorea instalatzeko argibideak ematen diren.



Makina digitalek ondoko eskemaz deskriba daitezke. Makina digitalaren barneko zirkuituei eta gainerako osagai fisikoei hardwarea esaten zaie, hardwarearekin kontaktuan dagoen programei sistemaren softwarea esaten zaio eta erabiltzailerekin kontaktuan dauden programei aplikazio esaten zaie. Hona hemen adibideak eta eskema:

  • Hardwarea: ordenadorea, inprimagailua, sagua, teklatua, ...
  • Sistemaren softwarea: hardware-kontrolatzaileak (edo driver), sistema eragileak (Windows, Linux, Mac OS, Android, iOS, ...)
  • Aplikazioak: Firefox, Spotify, MS-Word, Code::Blocks, MinGW, WhatsApp, ...