- Kompilimi transformon kodin burim në kod të ekzekutueshëm të makinës.
- Një përpilues kryen analiza leksikore, sintaksore dhe semantike.
- Ka AOT, JIT, ndër-përpilues dhe transpilues.
- Kodi i përpiluar është më i shpejtë se kodi i interpretuar.
Nëse keni guxuar të hyni në botën e programimit, me siguri e keni dëgjuar termin " kompilim ". Ky koncept është themelor për zhvillimin e softuerëve, pasi përcakton procesin me anë të të cilit kodi burimor i shkruar në një gjuhë programimi transformohet në një format që një kompjuter mund ta ekzekutojë.
Të kuptuarit se çfarë do të thotë të përpilosh dhe si funksionon një përpilues është thelbësor për çdo programues që dëshiron të optimizojë kodin e tij dhe të kuptojë më mirë se si funksionojnë gjuhët e programimit. Më poshtë shpjegojmë në detaje se çfarë përfshin ky proces, llojet e përpiluesve që ekzistojnë dhe ndryshimet kryesore midis kodit të përpiluar dhe të interpretuar.
Çfarë është përpilimi?
Kompilimi është procesi i përkthimit të kodit burimor nga një gjuhë e nivelit të lartë (si C++, Java ose Rust) në kod binar ose kod makine, të cilin procesori i kompjuterit mund ta ekzekutojë drejtpërdrejt.
Kodi burimor është shkruar në një gjuhë që njerëzit mund ta lexojnë dhe kuptojnë, por kompjuterët mund të interpretojnë vetëm kodin binar. Prandaj, kërkohet një program specifik i quajtur kompilues për të konvertuar kodin burimor në kod të ekzekutueshëm. Nëse dëshironi të mësoni më shumë rreth kësaj teme, mund të konsultoheni me udhëzuesin tonë mbi konceptet dhe ndryshimet midis kompiluesve dhe interpretuesve.
Çfarë është një përpilues dhe si funksionon?
Një kompilues është një program i specializuar në transformimin e kodit burimor në kod objekti ose kod ekzekutues. Ky proces konvertimi përbëhet nga disa faza:
1. Parapërpunimi
Përpara kompilimit, kodi burim kalon në një fazë të parapërpunimit, ku makrot zgjerohen, përfshihen skedarët e nevojshëm dhe bëhen modifikime të tjera përpara se të gjenerohet kodi që është përpiluar në të vërtetë.
2. Analiza leksikore
Kompiluesi skanon kodin burimor dhe e ndan atë në tokena , të cilat janë njësitë më të vogla të kuptimit në gjuhën e programimit, siç janë fjalët kyçe, identifikuesit dhe operatorët.
3. Analiza sintaksore
Në këtë fazë, struktura e kodit verifikohet të jetë e saktë sipas gramatikës së gjuhës së programimit. Nëse ka gabime sintaksore, përpiluesi do t'i zbulojë ato dhe do t'i tregojë programuesit se ku janë në mënyrë që të korrigjohen.
4. Analiza semantike
Kompiluesi kontrollon nëse operacionet dhe shprehjet në kod kanë kuptim logjik. Ai verifikon nëse variablat dhe funksionet janë të përcaktuara mirë dhe nëse kryhen operacione të vlefshme. Kjo është thelbësore për t'u siguruar që kodi juaj kompilohet pa probleme.
5. Gjenerimi i ndërmjetëm i kodit
Pas verifikimit të sintaksës dhe semantikës së kodit, kompiluesi gjeneron kod të ndërmjetëm , një përfaqësim të thjeshtuar që mund të optimizohet para përkthimit përfundimtar në kodin e makinës.
6. Optimizimi i kodit
Në këtë fazë, kompiluesi përmirëson kodin e gjeneruar për ta bërë atë më efikas dhe për të zvogëluar konsumin e memories dhe kohën e përpunimit.
7. Gjenerimi i kodit të makinës
Së fundmi, kodi i ndërmjetëm shndërrohet në udhëzime të kodit të makinës specifike për arkitekturën e procesorit të kompjuterit. Kjo pjesë e procesit është thelbësore për të siguruar që programi do të funksionojë siç duhet në harduer.
8. Lidhja
Kodi i objektit i gjeneruar kombinohet me biblioteka dhe module të tjera të nevojshme për të prodhuar skedarin përfundimtar të ekzekutueshëm. Mënyra se si menaxhohen këto biblioteka është interesante dhe për këtë, një kompilues i specializuar mund të jetë i dobishëm, si ato që mund të gjeni në seksionin tonë mbi kompiluesit për gjuhën C.
Llojet e kompajlerëve
Ekzistojnë lloje të ndryshme të përpiluesve në varësi të funksionimit dhe qëllimit të tyre:
- Kompiluesit AOT (Ahead-Of-Time).: Ata përpilojnë të gjithë kodin përpara se ta ekzekutojnë atë. Shembuj: GCC, Clang.
- Kompiluesit JIT (Just-In-Time).: Ata përpilojnë kodin gjatë ekzekutimit për të përmirësuar performancën. Shembuj: JVM për Java, V8 për JavaScript. Për një kuptim më të thellë të këtij lloji, ne sugjerojmë udhëzuesin tonë mbi Përpiluesit Just-In-Time.
- Përpiluesit e kryqëzuar: Ata gjenerojnë kod të ekzekutueshëm për një platformë të ndryshme nga ajo që po ekzekutojnë. Nëse jeni të interesuar, mund të lexoni rreth Përpiluesit e kryqëzuar në detaje.
- Transpilatorë: Ata e transformojnë kodin nga një gjuhë e nivelit të lartë në një tjetër, si TypeScript në JavaScript.
Kodi i përpiluar kundrejt kodit të interpretuar
Një nga ndryshimet kryesore në ekzekutimin e programit është nëse kodi kompilohet apo interpretohet :
- Kodi i përpiluar: Përkthehet plotësisht përpara se të vrapojë dhe zakonisht është më i shpejtë. Shembull: C, C++.
- Kodi i interpretuar: Përkthehet rresht pas rreshti në kohën e ekzekutimit, duke lehtësuar transportueshmërinë, por duke ulur performancën. Shembull: Python, JavaScript.
Shembull praktik përpilimi
Supozoni se shkruani një program në C:
#përfshi int main() { printf("Përshëndetje, botë!\n"); kthimi 0; }
Për të përpiluar këtë kod me GCC në një terminal, do të ekzekutoni:
program gcc.c -o program
Gjatë gjithë artikullit ne kemi eksploruar në thellësi procesin e përpilimit, nga përkufizimi i tij deri te rëndësia e tij në zhvillimin e softuerit. Ndërsa gjuhët e interpretuara ofrojnë fleksibilitet, gjuhët e përpiluara dallohen për efikasitetin e tyre. Të kuptuarit se si funksionon një përpilues dhe fazat e procesit është çelësi për të përmirësuar aftësitë tona si programues.