Co je překladač kódu a co dělá?

A překladač je program to překládá lidsky čitelné zdrojový kód do počítačově spustitelného strojového kódu. Aby to bylo úspěšně provedeno, musí lidsky čitelný kód vyhovovat syntax pravidla libovolného programovacího jazyka, ve kterém je napsána. Kompilátor je pouze program a nemůže opravit váš kód za vás. Pokud uděláte chybu, musíte opravit syntaxi, nebo se nebude kompilovat.

Co se stane, když kompilujete kód?

Složitost kompilátoru závisí na syntaxi jazyka a kolik abstrakce ten programovací jazyk poskytuje. Kompilátor C je mnohem jednodušší než kompilátor pro C ++ nebo C #.

Lexikální analýza

Při kompilaci kompilátor nejprve načte proud znaků ze souboru zdrojového kódu a vygeneruje tok lexikálních tokenů. Například kód C ++:

int C = (A * B) +10;

mohou být analyzovány jako tyto tokeny:

  • zadejte "int"
  • proměnná "C"
  • rovná se
  • levá lopatka
  • proměnná "A"
  • krát
  • proměnná "B"
  • pravé rameno
  • Plus
  • doslovný "10"

Syntaktická analýza

Lexikální výstup jde do syntaktické analyzátorové části kompilátoru, která používá gramatická pravidla k rozhodnutí, zda je vstup platný nebo ne. Pokud není

instagram viewer
proměnné A a B byly dříve deklarovány a byly v rozsahu, kompilátor by mohl říci:

  • „A“: nehlášený identifikátor.

Pokud byly deklarovány, ale nebyly inicializovány. kompilátor vydá varování:

  • lokální proměnná 'A' použitá bez inicializace.

Nikdy byste neměli ignorovat varování kompilátoru. Mohou váš kód rozbít divným a nečekaným způsobem. Vždy opravte varování kompilátoru.

Jeden průchod nebo dva?

Některé programovací jazyky jsou psány, takže kompilátor může přečíst zdrojový kód pouze jednou a vygenerovat strojový kód. Pascal je jeden takový jazyk. Mnoho kompilátory vyžadují alespoň dva průchody. Někdy je to kvůli předběžným prohlášením o funkce nebo třídy.

V C ++ může být třída deklarována, ale definována až později. Kompilátor není schopen zjistit, kolik paměti třída potřebuje, dokud nezkompiluje tělo třídy. Před vygenerováním správného strojového kódu musí znovu načíst zdrojový kód.

Generování strojového kódu

Za předpokladu, že kompilátor úspěšně dokončí lexikální a syntaktické analýzy, je poslední fází generování strojového kódu. Jedná se o komplikovaný proces, zejména u moderních procesorů.

Rychlost kompilovaného spustitelný kód by měl být co nejrychlejší a může se nesmírně lišit v závislosti na kvalitě generovaného kódu a na tom, jak velká optimalizace byla požadována.

Většina kompilátorů vám umožňuje určit míru optimalizace - obvykle známá pro rychlé ladění kompilací a úplnou optimalizaci vydaného kódu.

Generování kódu je náročné

Spisovatel kompilátoru čelí problémům při psaní generátoru kódu. Mnoho procesorů urychluje zpracování pomocí

  • Instrukční potrubí
  • Vnitřní mezipaměti.

Pokud jsou všechny pokyny v kódu smyčka může být držen v procesor mezipaměti, pak tato smyčka běží mnohem rychleji, než když musí CPU načíst instrukce z hlavní RAM. Mezipaměť CPU je blok paměti zabudovaný do čipu CPU, ke kterému se přistupuje mnohem rychleji než k datům v hlavní paměti RAM.

Mezipaměti a fronty

Většina procesorů má frontu předběžného načtení, kde CPU před provedením načte instrukce do mezipaměti. Pokud dojde k podmíněné větvi, musí CPU znovu načíst frontu. Kód by měl být generován, aby se toto minimalizovalo.

Mnoho procesorů má samostatné části pro:

  • Celá aritmetika (celá čísla)
  • Aritmetika s pohyblivou řádovou čárkou (zlomková čísla)

Tyto operace mohou často probíhat paralelně, aby se zvýšila rychlost.

Kompilátory obvykle generují strojový kód do objektových souborů, které jsou pak spojené společně pomocí linkeru.