liburutegi etiketadun mezuak erakusten. Erakutsi mezu guztiak
liburutegi etiketadun mezuak erakusten. Erakutsi mezu guztiak

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

Liburutegiak

ZER DAKIDAN:
Orain arte, edozein proiekturen kode guztia main.c fitxategian kokatu dut. Baina baliteke proiektu baten kodea iturburu-fitxategi desberdinetan banatzea.



ZER IKASIKO DUDAN:
Orain ikasiko dut proiektu baten kodea bi fitxategietan idazten: fitxategi bat kanpoko liburutegia izango da eta bestea liburutegi horren bezero-programa.







Aurrekariak

Dakigunez programa exekutagarria eskuratzeko iturburu-programaren itzulketa bat burutu behar da, eta horretarako konpiladorearen eta estekatzailearen beharra daukagu. Biak jarraian lan egiten dutelako (lehenik konpiladorea eta ondoren estakatailea) guretzat prozesu bakarra bezala agertzen zaigu. Eskematikoki:

Adibide honetan aritm.h kanpoko liburutegi bat sortuko dugu eta bezero-programak liburutegi horren erabilpena egingo du. Adibide honek kopuru osoak landuko ditu, oinarrizko eragiketa aritmetikoak burutuz. Baina main.c bezero-programatik hasiko gara, honek main() funtzio nagusia barneratzen du.



Programa bat idatziko dugu aritm.h liburutegia erabiliko duena, proiektu honi LiburutegiAdibidea.cbp deituko diogu eta bere funtzio nagusia main() izango da, ikusi Code::Blocks ingurunean main() funtzioa:


Ikusten denez, bezero-programa deitzen den main.c programaren main() funtzio nagusian fitxategi baten sartzea egiten da #include "aritm.h" konpilazio-jarraibideren bitartez. Ondorioz, aritm.h liburutegian garatu diren funtzioak edo definitu diren konstanteak libreki erabil ditzake main.c bezero-programak.

Hauxe da main() funtzio nagusiaren kodea, non ZatiduraEtaHondarra() funtzioa, Batu() funtzioa eta Kendu() funtzioa erabiltzen diren, nahiz eta haien kodea main() funtzio nagusian ez dauden:

/* LiburutegiAdibide.cbp proiektua*/

#include <stdio.h>   // liburutegi estandarra
#include "aritm.h"   // kanpoko liburutegia sartzeko

int main()
{
    int iEragigai1, iEragigai2, iBatura, iKendura, iZatidura, iHondarra;

    printf("\n\n");
    printf("%30s", "Lehen eragigaia eman: ");
    scanf("%d", &iEragigai1);

    do
    {
        printf("%30s", "Bigarren eragigaia eman: ");
        scanf("%d", &iEragigai2);
        if (iEragigai2 == 0)
        {
            printf("%30s\n", "Datua ezin daiteke 0 izan");
        }
    } while (iEragigai2 == 0);

    // Aritmetika funtzioak erabiltzen dira
    iBatura = Batu(iEragigai1, iEragigai2);      // "aritm.h" liburutegian garatuta
    iKendura = Kendu(iEragigai1, iEragigai2);    // "aritm.h" liburutegian garatuta
    ZatiduraEtaHondarra(iEragigai1, iEragigai2,
                        &iZatidura, &iHondarra); // "aritm.h" liburutegian garatuta

    printf("\n");
    printf("%15d + %d = %d\n", iEragigai1, iEragigai2, iBatura);
    printf("%15d - %d = %d\n", iEragigai1, iEragigai2, iKendura);
    printf("%15d / %d = %d\n", iEragigai1, iEragigai2, iZatidura);
    printf("%15d %% %d = %d\n", iEragigai1, iEragigai2, iHondarra);

    printf("\n\n");
    return 0;
}

Baina ikas dezagun #include konpilazio-direktibak edo jarraibideak behar duen sintaxia:  

                #include "aritm.h"
#include aurre-prozesadorearen jarraibideari fitxategia sartzea esaten zaio eta, dakigunez, bere sintaxia #include <FitxategiIzen> da, edo bestela beste sintaxi hau onargarria da ere #include "FitxategiIzen". Sintaxi bien arteko aldea honela adierazten da:
  • #include <FitxategiIzen> erabiltzean, sartu beharreko FitxategiIzen izeneko fitxategia konpiladoreak duen karpeta batean hasiko da bilatzen
  • #include "FitxategiIzen" erabiltzean, sartu beharreko FitxategiIzen izeneko fitxategia proiektuaren karpetan hasiko da bilatzen


#include "aritm.h" liburutegia honelaxe gehitzen da proiektura. zalpenak bost urrats ditu:  

1/5

Programazio-inguruneko menuan  File > New > File...  aukera hautatu ondoren C header fitxategi-mota aukeratu

2/5

Jarraian, liburutegiaren izena eta bidea zehaztuko dira

3/5

Hurrengo leiho honen bitartez liburutegia gehituko zaio proiektuari, proiektuari dagokion bidea zehaztu

4/5

Proiektuaren Headers karpetan egongo da liburutegia, konpilazio baldintzatuaren jarraibieak kendu

5/5

Liburutegiaren kodea idatzi, bertako funtzioak eta konstanteak eskuragarri dira bezero-programarentzat

Azken urratsa liburutegiaren kodea idaztea da. Dagokigun aritm.h liburutegiaren iturburu-kodea hauxe da, non ZatiduraEtaHondarra() funtzioa, Batu() funtzioa eta Kendu() funtzioa programatu diren, eta main() funtzio nagusiak erabil ditzakeen:  

/* "aritm.h" liburutegiaren kodea */

void ZatiduraEtaHondarra(int iZbk1,
                         int iZbk2,
                         int *iZati, // irteera
                         int *iHond) // irteera
{
    *iZati = iZbk1 / iZbk2;
    *iHond = iZbk1 % iZbk2;
}

int Batu(int iZbk1, int iZbk2)
{
    return iZbk1 + iZbk2;
}

int Kendu(int iZbk1, int iZbk2)
{
    return iZbk1 - iZbk2;
}


LiburutegiAdibidea.cbp proiektua konpilatzean, main.c bezero-programaren iturburu-kodea eta aritm.h liburutegiaren iturburu-kodea konpilatzen dira, haien objektu-programak estekatu egiten dira LiburutegiAdibidea.exe programa exekutagarria eskuratzeko.

Konpilatu/Estekatu ekintzen eskema:







  • LiburutegiAdibidea.cbp | main.c                [bezero-programa]
  • LiburutegiAdibidea.cbp | aritm.h               [kanpoko liburutegia]


 

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.