Princip překladu programuJan Skýpala
Dva články Flex a Bison (v příštím čísle) souvisí s tvorbou překladače, a tak si
nastiňme alespoň základy této problematiky. Jak je známo, počítač neumí pracovat se slovy, ale pouze s čísly. Navíc
většinou disponuje jen omezeným množstvím operací, které je schopen s těmito
čísly provést. Lidem však pamatovaní si čísel dělá problémy (málokdo si je
schopen zapamatovat více čísel než datum narození sebe a nejbližších, číslo
občanky, rodné číslo a telefon domů a do práce). A tak se v komunikaci s
počítačem používají různé jazyky, které jsou pak přeloženy do počítači
srozumitelné podoby. Mezi takové jazyky patří jednak všechny programovací jazyky
(Céčko, Basic, ARexx...), ale i speciální jazyky například pro přípravu
dokumentů (LaTeX, HTML, AmigaGuide...) a i třeba shellovské skripty jsou
jazykem.
Program, který zpracovává nějaký jazyk se pak nazývá překladačem. To, co pak na
základě vstupního programu provede, dělí překladače na dvě kategorie. Bud může
vygenerovat ekvivalentní program v jiném jazyce (nejčastěji assembleru -
překladače céčka, ale i třeba v nějakém pseudokódu překladače jazyka Java) a
nebo může vykonávat akce požadované programem (např. ARexx nebo Shell). První
kategorie se pak opět nazývá překladače, kdežto druhá interprety.
Jak se dá odtušit, obě dvě kategorie mají společnou část, ve které na základě
analýzy vstupujícího programu musí zjistit, co program provádí. Tato část se
nazývá analytická. Druhá část, kterou se tyto kategorie liší, se pak nazývá buď
syntetická (na základě analýzy je vytvářen nový program) nebo interpretační
(program je vykonáván). Dále se zaměřme na společnou, tj. analytickou část.
V dřevních dobách vznikalo velké množství programovacích jazyků a každý psal
analytické části jak uměl. Postupem doby se pochopitelně přišlo na to, že
některé postupy jsou vhodnější než jiné, celý problém byl zastřešen teorií,
která se dnes učí na vysokých školách. Problém struktury vstupu byl nazván
Formálními jazyky a gramatikami a rozděluje nám vstupující jazyky do několika
tříd a podle nich potom uvádí nejvhodnější metody na implementaci jejich
zpracování.
Bylo zjištěno, že analytickou část je vhodné rozdělit do tří menších částí.
První, tzv. lexikální analýza čte přímo vstupující text a rozpoznává v něm
základní jednotky, tj. například číslice, operátory, klíčová slova, jména
proměnných apod. Syntaktická analýza zpracovává tzv. první interní formu, to je
výstup lexikální analýzy a v té rozpoznává ucelené bloky (např. výrazy,
podmínky, smyčky apod.). Syntaktická analýza toho již zvládne docela hodně,
odhalí i mnoho chyb v programu, ale ještě nedokáže zajistit vše. Mezi tyto
činnosti patří například typová kontrola (aby se třeba s integerovou proměnnou
nemohlo pracovat jako s polem). Tuto poslední část zajišťuje takzvaná sémantická
analýza, která k jednotlivým prvkům druhé interní formy již jen připojuje
atributy o jejich vlastnostech (např. k proměnné právě její typ).
Postupem času se přišlo na to, že první a druhá část analýzy jsou snadno
mechanicky zpracovatelné pro téměř jakýkoliv vstup - téměř nezáleží na tom, jak
vypadá zápis vstupujícího programu. A tak vzniklo mnoho nástrojů pro
automatizaci těchto procesů. Takže vznikly nové jazyky pro popis vstupujícího
jazyka a ty jsou potom novými překladači přeloženy do nějakého programovacího
jazyka (nejčastěji céčka). Nejznámějším programem, který umí generovat rutiny
pro lexikální analýzu, je program lex, resp. jeho volně šířitelná varianta flex
z GNU distribuce. Program yacc (yet another compiler compiler = ještě jeden
překladač překladače) je zase nejznámějším programem pro automatické vytváření
rutin pro syntaktickou analýzu. Jeho nová a vylepšená varianta z GNU distribuce
se jmenuje bison. Vytlačiť článok
Pozn.: články boli naskenované ako text a preto obsahujú aj zopár chýb. Taktiež neručíme za zdrojové kódy (Asm, C, Arexx, AmigaGuide, Html) a odkazy na web. Dúfame, že napriek tomu vám táto databáza dobre poslúži.
Žiadna časť nesmie byť reprodukovaná alebo inak šírená bez písomného povolenia vydavatela © ATLANTIDA Publishing
none
|