Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
Kompilátor je rozhodujúci softvér, ktorý pôsobí ako prekladateľ medzi programovacími jazykmi na vysokej úrovni človeka (Rovnako ako Python, Java, C ++ atď.) A strojový stroj s nízkou úrovňou (binárny kód), že procesor počítača môže priamo porozumieť a vykonať.
V podstate je úlohou kompilátora:
1. Prekladajte zdrojový kód na vysokej úrovni do strojového kódu: Toto je primárna funkcia. Kompilátor vezme zdrojový kód napísaný programátorom a prevádza ho na sériu pokynov, ktoré môže CPU počítača vykonať.
2. Vykonajte detekciu chýb: Počas procesu kompilácie kompilátor analyzuje zdrojový kód pre chyby syntaxe, sémantické chyby a ďalšie porušenia pravidiel programovacieho jazyka. Označuje tieto chyby a poskytuje programátorovi informatívne správy, čo im umožňuje opraviť kód pred vykonaním.
3. Optimalizovať kód (voliteľné, ale bežné): Mnoho kompilátorov obsahuje optimalizačné funkcie na zlepšenie efektívnosti vygenerovaného strojového kódu. Táto optimalizácia môže zahŕňať:
* Zníženie veľkosti kódu: Zníženie spustiteľného súboru.
* Zlepšenie rýchlosti vykonávania: Vytváranie programu funguje rýchlejšie pomocou efektívnejších algoritmov alebo inštruktážnych sekvencií.
* Optimalizácia využitia pamäte: Zníženie množstva pamäte, ktorú program potrebuje.
4. Link Externé knižnice: Jazyky na vysokej úrovni sa často spoliehajú na externé knižnice (vopred napísané zbierky funkcií), aby poskytovali funkčnosť. Kompilátor zvyčajne pracuje s linkerom na vyriešenie odkazov na tieto knižnice a na zahrnutie potrebného kódu do konečného spustiteľného súboru.
Prečo sú kompilátory potrebné?
* strojový kód je nečitateľný a je ťažké napísať: Písanie priamo v strojovom kóde je mimoriadne zložité a únavné. Jazyky na vysokej úrovni ponúkajú abstrakciu a umožňujú programátorom vyjadriť logiku prirodzenejším a zrozumiteľnejším spôsobom.
* Prenosnosť: Jazyky na vysokej úrovni sú často navrhnuté tak, aby boli relatívne nezávislé od platformy. Kompilátory umožňujú zostaviť rovnaký zdrojový kód pre rôzne operačné systémy (Windows, MacOS, Linux) a architektúry CPU (x86, ARM), hoci niekedy sú potrebné úpravy.
Proces kompilácie je zvyčajne rozdelený do niekoľkých rôznych fáz, z ktorých každá vykonáva konkrétnu úlohu:
1. Lexikálna analýza (skenovanie):
- Zdrojový kód sa číta znak podľa znaku.
- Kód je rozdelený do prúdu tokenov , ktoré sú základnými stavebnými blokmi, ako sú kľúčové slová, identifikátory (premenné názvy), operátori a konštanty.
- Rozvoj a komentáre sa často odstraňujú.
Príklad (python):
`` `Python
x =5 + y
`` `
generované tokeny:
* `Identifikátor" (x)
* `Priradenie_operator` (=)
* `Integer_literal` (5)
* `Plus_operator` (+)
* `Identifikátor" (y)
2. Analýza syntaxe (analýza):
- Tokeny sú usporiadané do hierarchickej štruktúry nazývanej Parse Tree (alebo abstraktný strom syntaxe, AST) Na základe gramatiky programovacieho jazyka.
- Parse Tree predstavuje syntaktickú štruktúru programu.
- Kontroluje, či sú tokeny usporiadané podľa gramatických pravidiel jazyka. Tu sa detegujú chyby syntaxe (napr. Chýbajúce bodkočiarky v C ++).
Príklad (Parse Tree): Parse strom pre `x =5 + y` by predstavoval, že priradenie je operácia najvyššej úrovne, s premennou` x` vľavo a výrazom `5 + y` napravo.
3. Sémantická analýza:
- Kompilátor analyzuje význam (sémantika) kódu.
- vykonáva sa kontrola typu, aby sa zabezpečilo, že operácie sa vykonávajú na kompatibilných typoch údajov (napr. Pridanie reťazca do celého čísla by bolo sémantickou chybou).
- Presvedčené deklarácie sa skontrolujú, aby sa zabezpečilo, že premenné sú pred použitím správne definované.
- Pravidlá rozsahu sa presadzujú na určenie viditeľnosti a životnosti premenných.
- Sémantické chyby sa detegujú (napr. Použitie nerozdelenej premennej).
4. Generovanie medziproduktu (voliteľné):
- Kompilátor môže vygenerovať stredné znázornenie (IR) kódu.
- IR je reprezentácia nezávislá od jazyka, ktorá zjednodušuje následnú fázu optimalizácie a generovania kódu.
- Bežné IRS obsahujú formulár s tromi adresou a statickým jedným priradením (SSA) formulára.
Príklad (kód s tromi address):
`` `
T1 =5 + y
x =t1
`` `
5. Optimalizácia kódu:
- Kompilátor sa pokúša vylepšiť medziprodukt (alebo pôvodný strom analýzy), aby vytvoril efektívnejší strojový kód.
- Optimalizačné techniky zahŕňajú:
* konštantné skladanie: Hodnotenie konštantných výrazov v čase kompilácie.
* Eliminácia mŕtveho kódu: Odstránenie kódu, ktorý nemá žiadny vplyv na výstup programu.
* slučka rozvoj: Rozširovanie slučiek na zníženie režijných nákladov slučky.
* Pridelenie registra: Priradenie premenných registrom CPU na zlepšenie rýchlosti prístupu.
6. Generovanie kódu:
- Kompilátor prekladá optimalizovaný medziprodukt (alebo Parse Tree) do strojového kódu špecifického pre cieľovú architektúru.
- Zahŕňa to výber vhodných pokynov CPU na vykonanie operácií zastúpených v IR.
- Adresy pamäte sú priradené premenným.
- Vygenerovaný strojový kód je zvyčajne vo forme jazyka montáže, ktorý potom zostavuje binárny kód.
7. Prepojenie (linker):
- Linker kombinuje vygenerovaný strojový kód s všetkými potrebnými knižnicami (vopred kompilované funkcie a údaje) na vytvorenie konečného spustiteľného súboru.
- Určuje referencie medzi rôznymi súbormi objektov (súbory kompilovaného zdrojového kódu).
Zjednodušený príklad (C ++ na zostavu):
Povedzme, že máte nasledujúci kód C ++:
`` C ++
int main () {
int x =5;
int y =10;
int z =x + y;
návrat 0;
}
`` `
Zjednodušený proces kompilácie môže vygenerovať nasledujúci (veľmi základný) kód zostavy (pre architektúru x86):
`` `Zostava
sekcia .data
; V tomto príklade žiadna sekcia údajov
sekcia .text
globálny _start
_start:
; x =5
Mov Eax, 5; Presuňte hodnotu 5 do registra EAX (použité pre x)
; y =10
Mov Ebx, 10; Presuňte hodnotu 10 do registra EBX (použité pre y)
; z =x + y
Pridať EAX, EBX; Pridajte hodnotu v EBX do EAX (EAX teraz obsahuje x + y)
; návrat 0
Mov Eax, 0; Nastavte návratovú hodnotu na 0
Mov Ebx, 0; Stavový kód výstupu
MOV ECX, EAX; Vložte EAX do ECX
Mov Edx, Ebx; Vložte EBX do EDX
MOV ESI, ECX; Dajte ECX do ESI
MOV EDI, EDX; Vložte Edx do EDI
MOV ESP, ESI; Vložte ESI do esp
MOV EBP, EDI; Vložte EDI do EBP
Mov al, 60
syscall
`` `
kľúčové cesty:
* Kompilátory sú nevyhnutné na preklenutie priepasti medzi programovacími jazykmi priateľskými k človeku a strojovým kódom na nízkej úrovni, ktoré počítače chápu.
* Proces kompilácie zahŕňa niekoľko fáz, z ktorých každá je zodpovedná za konkrétnu úlohu:lexikálnu analýzu, syntaxovú analýzu, sémantickú analýzu, generovanie stredných kódov (voliteľné), optimalizácia kódu, generovanie kódu a prepojenie.
* Používaním kompilátorov môžu programátori písať kód produktívnejším a udržiavateľnejším spôsobom a zároveň dosahovať efektívne vykonávanie na rôznych hardvérových platformách.