Překladače 1. Překladače a programovací jazyky © Milan Keršlágerhttp:// Obsah: ● rozdělení a příklady programovacích jazyků ● preprocesor jazyka C, makra, podmíněný překlad ● kompilátory, interprety, hybridní překladače, JIT ● příklady překladačů
Překladač ● též kompilátor ● z anglického to compile – sestavit, zpracovat ● typicky vyšší programovací jazyk → strojový kód – ale obecně jakákoliv transformace vstupu na výstup – např. renderování HTML do grafické podoby – interpret příkazové řádky, interpret GUI,... ● dekompilátor ● opačný postup
Strojový kód ● posloupnost strojových instrukcí ● umístěny v operační paměti (RAM) ● číselný zápis → kód instrukce, operand(y) ● vykonávány procesorem (CPU) ● jazyk symbolických adres (JSA) ● tj. „assembly language“ ● mnemotechnické kódy pro strojové instrukce ● vytváří je výrobce CPU ● překladač do strojového kódu je assembler – tj. „sestavovač“
Programovací jazyk ● slouží k zápisu algoritmu ● matematicky: formální jazyk – množina konečných slov nad určitou abecedou – Ada Lovelace → první programátor (1815 – 1872) ● rozlišení dle míry abstrakce – nižší programovací jazyky (JSA, C) – vyšší programovací jazyky ● dle způsobu překladu a spuštění – kompilované (C, Pascal) – interpretované (Perl, Python, PHP) – kombinované (Java)
Jazyk C ● 1972 – přepis jádra Unixu z JSA do jazyka C ● název: (A – „assembler“), následník jazyka B ● dnes pokládán za nejnižší (vyšší) jazyk ● logika zápisu odpovídá strojovému kódu – nejsou řetězce, používají se ukazatele ● úsporný symbolický zápis ● do jeho příchodu se programovalo v JSA – „jádro OS lze zapsat pouze v JSA“ – malé části jádra jsou dodnes v JSA
Hello world v jazyce C # include int main(void) { printf("Hello, World!\n"); return 0; }
Pascal ● 1971 Niklaus Wirth ● určen pro výuku programování – „většinou je možný a správný jen jeden zápis“ ● 1981 – ISO norma ● různé varianty → Turbo Pascal (Borland) ● program HelloWorld(output); ● begin ● WriteLn('Hello, World!'); ● end.
Další jazyky ● COBOL (1960) ● zápis podobný angličtině ● snížila se přehlednost kódu ● BASIC ● populární v době 8bitových domácích počítačů ● nicméně dodnes Visual BASIC od Microsoftu ● Java, Smalltalk ● objektově orientované jazyky (90. léta) ● Logo, Karel, Baltík → pro děti
Rozdělení prog. jazyků ● procedurální (imperativní) ● strukturované (např. C, BASIC) ● objektově orientované (např. Smalltalk, Java) ● neprocedurální (deklarativní) ● funkcionální (např. Lisp, Haskell) ● logické (např. Prolog, Gödel)
Historie překladačů ● 1950 – něco jako kompilátor (pro jazyk A-0) ● 1957 – 1. kompletní kompilátor pro jazyk Fortran od IBM ● 1960 – 1. multiplatformní kompilátor pro jazyk Cobol ● 1962 – kompilátor přeložen jiným kompilátorem (Lisp) – problém: Co bylo dřív? Vejce nebo slepice? ● 1970 – self-hosting kompilátory (překládají samy sebe) ● 1970 – vznik jazyka Pascal (Niklaus Wirth) ● 1972 – vznik jazyka C (Dennis Ritchie)
Typy překladačů ● kompilátor ● již zmíněno dříve ● transformace programovací jazyk → strojový kód – uložen do spustitelného souboru (provede se jen 1x) – spustitelný soubor je pak spuštěn ● interpret ● jen provádění zdrojového kódu – nevzniká spustitelný soubor – interpretace znovu při každém spuštění kódu ● shelly, skriptovací jazyky, logické prog. jazyky
Kompilátor ● „tradiční zpracování“ ● lze se věnovat zdlouhavým optimalizacím – výsledný kód může být rychlejší ● při běhu v paměti není překladač – nižší nároky na operační paměť ● nevýhodou jsou větší projekty – kompletní přeložení trvá dlouho – musí se čekat na sestavení do cílového kódu
Interpret ● zdrojový kód pokaždé znovu interpretován ● pomalejší start, další běh již relativně rychlý ● zažité pravidlo narušuje Perl – skriptovací jazyk, velmi rychlý start i běh ● za běhu v paměti interpret i interpretovaný program – může být problém na méně výkonných zařízeních ● typicky snadná přenositelnost – různé platformy i interprety se chovají stejně
Hybridní překladače ● někde mezi překladačem a interpretem ● překladač generuje přenositelný mezikód – Java používá bytecode –.NET používá XML ● mezikód je interpretován na cílově platformě ● JIT – mezikód je nejprve přeložen do strojového kódu CPU – řeší problém s rychlostí interpretace – brzdí se start programu
Překladač GCC ● GCC ● 1987 GNU: volně šiřitelná sada překladačů – původně jen C, později i Pascal, Ada, Fortran, C++,... ● dnes pod Free Software Foundation ● DJGPP ● 1989: port GCC pro DOS, 32bitový extender ● MinGW ● 1998: port GCC pro Windows ● odvozeno od Cygwin (POSIX pro Windows)