Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky
A kompilátor je špeciálny program, ktorý prekladá zdrojový kód napísaný v programovacom jazyku na vysokej úrovni (ako C ++, Java, Python, ale Python sa zvyčajne interpretuje) do strojového kódu alebo do iného jazyka na nižšej úrovni, ktorému počítač môže porozumieť a vykonať priamo. Myslite na to ako na sofistikovaného prekladateľa medzi jazykom, ktorý ľudia píšu a jazykové stroje „rozumejú“.
Fungovanie kompilátora:proces prekladu
Proces kompilácie zvyčajne zahŕňa niekoľko rôznych fáz, z ktorých každá vykonáva konkrétnu úlohu. Tu je zrútenie kľúčových fáz:
1. Lexikálna analýza (skenovanie):
* Účel: Číta znak zdrojového kódu podľa charakteru a zoskupuje ich do zmysluplných jednotiek s názvom *tokeny *.
* akcie:
* Odstraňuje medzeru a komentáre.
* Identifikuje kľúčové slová (napríklad `if`,` while`, `FOR '), identifikátory (premenné názvy), operátory (`+`,`, `*`, `/`), literály (čísla, reťazce) a oddeľovače (parentáže, semikolóny).
* Priraďuje každý token typ (napr. `Identifier`,` Integer_literal`, `kľúčové slovo").
* výstup: Prúd žetónov.
Príklad:
`` C ++
int x =10 + y; // Príklad C ++ kód
`` `
Bol by tokenizovaný ako niečo ako:
`` `
`` `
2. Analýza syntaxe (analýza):
* Účel: Kontroluje, či sa postupnosť tokenov vyhovuje gramatickým pravidlám (syntax) programovacieho jazyka.
* akcie:
* Používa tokeny na zostavenie stromu abstraktného syntaxe (AST). AST predstavuje hierarchickú štruktúru programu, ktorá ukazuje, ako súvisia tokeny.
* Identifikuje chyby syntaxe (napr. Chýbajúce bodkočiarne, nezhodné zátvorky).
* výstup: Abstraktný strom syntaxe (AST).
Príklad (pokračovanie zhora):
Týnokarunkcia by zostavila AST, ktorá predstavuje príkaz `int x =10 + y;` AST by ukázal, že `x` sa deklaruje ako celé číslo a inicializuje sa s výsledkom výrazu` 10 + y`.
3. Sémantická analýza:
* Účel: Kontrola významu (sémantiky) kódu a zaisťuje, že program je logicky konzistentný.
* akcie:
* Kontrola typu:Overuje, či sa operácie vykonávajú na kompatibilných typoch údajov (napr. Pridanie celého čísla do reťazca by bolo chyba).
* Rozlíšenie rozsahu:určuje význam identifikátorov na základe ich kontextu (napr. Ktorú premennú „X` sa označuje).
* Detekcia chýb:Identifikuje sémantické chyby (napr. Použitie nerozdelenej premennej, ktorá volá funkciu s nesprávnym počtom argumentov).
* Správa tabuľky symbolov:Tabuľka symbolov ukladá informácie o identifikátoroch (premenné, funkcie atď.) Používané v programe.
* výstup: Anotovaná AST (AST s ďalšími sémantickými informáciami) a tabuľka symbolov.
4.
* Účel: Prekladá anotovaný AST do stredného znázornenia (IR).
* akcie:
* IR je strojovo nezávislá reprezentácia programu, navrhnutá na ľahko optimalizáciu a preloženú do cieľového kódu. Bežné IRS zahŕňajú trojpriestorový kód a strojový kód zásobníka.
* Zjednodušuje kód a uľahčuje vykonávanie optimalizácií.
* výstup: Intermediate Code (IR).
Príklad (jednoduchý trojprstský kód):
Výraz `10 + y` môže byť preložený na:
`` `
T1 =10 + y // t1 je dočasná premenná
x =t1
`` `
5. Optimalizácia kódu:
* Účel: Zlepšuje účinnosť medziproduktu.
* akcie:
* Na zníženie veľkosti kódu, času vykonávania alebo oboch sa uplatňujú rôzne techniky optimalizácie.
* Bežné optimalizácie 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ý sa nikdy nevykonáva).
* Služba rozrušenie (rozširujúce sa slučky na zníženie režijných nákladov).
* Spoločná eliminácia podbytku (vyhýbanie sa redundantným výpočtom).
* výstup: Optimalizovaný medziprodukt.
6. Generovanie kódu:
* Účel: Prekladá optimalizovaný medziprodukt do cieľového strojového kódu (alebo montážneho jazyka).
* akcie:
* Vyberie príslušné pokyny pre stroj pre každé vyhlásenie IR.
* Prideľuje registre na ukladanie premenných a stredných hodnôt.
* Zaoberá sa prideľovaním pamäte.
* výstup: Strojový kód alebo jazyk montáže.
7. Zostava (voliteľné):
* Ak generátor kódu výstupuje na montážny jazyk, program zostavovača sa používa na prevod zostavovacieho kódu na strojový kód.
8. Prepojenie (voliteľné):
* Kombinuje viac súborov objektov (kompilovaný kód z rôznych zdrojových súborov) a knižnice do jedného spustiteľného súboru.
* Vyrieši externé referencie (odkazy na funkcie alebo premenné definované v iných súboroch).
Príklad zhrnutia:
Povedzme, že máte jednoduchý program C ++:
`` C ++
int main () {
int a =5;
int b =10;
int sum =a + b;
návrat 0;
}
`` `
Kompilátor prešiel nasledujúcim (zjednodušeným) procesom:
1. Lexikálna analýza: Identifikuje tokeny ako `int`,` main`, `=`, `5`,`+`atď.
2. Syntax analýza: Vytvorí AST, ktorá predstavuje štruktúru kódu (napr. Funkcia „hlavná“ obsahuje deklarácie a pridanú operáciu).
3. Sémantická analýza: Kontroluje, či sú premenné pred použitím deklarované, že `+` je platný pre celé čísla atď.
4. Vytvára stredne pokročilé zastúpenie, možno niečo ako:
`` `
A =5
B =10
súčet =a + b
návrat 0
`` `
5. Optimalizácia kódu: Môžu vykonať menšie optimalizácie (v tomto triviálnom prípade nie je možná veľa optimalizácie).
6. Generovanie kódu: Prekladá IR do pokynov strojového kódu špecifické pre cieľový procesor (napr. Pokyny na zostavenie X86).
Kľúčové výhody kompilácie:
* Rýchlosť: Zostavený kód všeobecne beží rýchlejšie ako interpretovaný kód, pretože preklad sa vykonáva iba raz, počas kompilácie, a nie zakaždým, keď sa program vykoná.
* Detekcia chýb: Kompilátory môžu počas kompilácie zistiť mnoho chýb pred spustením programu, čo pomáha zlepšovať spoľahlivosť kódu.
* Zabezpečenie: Zistením chýb v čase kompilácie môžu kompilátory pomôcť zabrániť určitým zraniteľnostiam zabezpečenia.
Kľúčové nevýhody kompilácie:
* závislosť od platformy: Zostavený kód je často špecifický pre platformu, čo znamená, že môže bežať iba na operačnom systéme a architektúre procesorov, pre ktorý bol zostavený.
* kompiilový čas: Proces kompilácie môže trvať značné množstvo času, najmä pre veľké programy.
* ladenie zložitosti: Ladenie kompilovaného kódu môže byť niekedy náročnejšie ako ladenie interpretovaného kódu, pretože pracujete skôr s strojovým kódom ako s pôvodným zdrojovým kódom.
Stručne povedané, kompilátor je rozhodujúcou súčasťou vývoja softvéru, ktorá je zodpovedná za transformáciu kódu na vysokej úrovni na formulár, ktorý môže počítač vykonať. Vykonáva niekoľko zložitých štádií na analýzu, optimalizáciu a generovanie strojového kódu, čo nám v konečnom dôsledku umožňuje spúšťať programy, ktoré píšeme.