VII. Programovací jazyky a objektové programování. Programovací jazyky – charakteristika,syntaxe, sémantika. Objektové programování – vlastnosti objektů, principy návrhu. Flashcards
Program
Program je zápis algoritmu v programovacím jazyku.
Programovací jazyk
Programovací jazyk je soubor pravidel pro zápis algoritmu.
- programovací jazyk á svoji syntaxi (souhrn pravidel) a sémantiku (množina slov a pravidla, která jim přiřazují význam.
Zdrojový text programu
Zdrojový text programu - algoritmus zapsaný v programovacím jazyku
Strojový kód
Strojový kód - instrukce pro daný stroj.
Instrukce – příkaz, kterému rozumí CPU (procesor)
Instrukční sada – soubor instrukcí daného procesoru
Podle míry abstrakce dělíme programovací jazyky do dvou skupin:
Podle míry abstrakce dělíme programovací jazyky do dvou skupin:
- Nižší – závislé na HW (na procesoru) - např. assembler
- Vyšší – nezávislé na HW
Členění programovacích jazyků dle způsobu překladu:
Členění dle způsobu překladu:
- Kompilované
- Interpretované
Kompilace
Při kompilaci dochází k převodu programu zapsaného v programovacím jazyce do strojového kódu. Program je kompilátorem příslušného programovacího jazyka zkompilován pouze tehdy, pokud neobsahuje žádné syntaktické chyby. Kompilací vzniklý soubor ještě není přímo spustitelný, ale musí být sestaven do spustitelného tvaru pomocí spojovače (linkeru). Linker spojí dohromady moduly a knihovní soubory podle závislostí, řeší globální proměnné a relativní adresaci. Výsledkem linkování je spustitelný program (v případě OS Windows soubor s příponou EXE)
Používané techniky optimalizace – odstranění mrtvého kódu, vkládání těl metod, rozbalení smyček, odstranění shodných podvýrazů.
Interpretace
U interpretace je zdrojový je zdrojový kód čten řádek po řádku a ihned vykováván. Výhodou je pružnost a možnost přepínání mezi vývojovým prostředím a běžícím programem. Vykonávání programu je ale pomalejší, protože na rozdíl od kompilace zde není možnost optimalizace kódu.
Formy interpretace:
- Čistá interpretace
- Překlad do pseudokódu a jeho interpretace (např. Java)
- JIT (Just in time) interpretace – před interpretací je program kompilován a optimalizován
Chyby v programech
Chyby v programech
- Syntaktické
- Chyby při zpracování
- Sémantické (logické) chyby
Proces odstraňování chyb v programu se nazývá ladění (debugging). Prostředek pro procházení programu po jednotlivých příkazech a možností výpisu hodnoty proměnných se nazývá debuger.
Assembler
Assembler
- Nízkoúrovňový – binární zápis instrukcí
- Adresy se označily symbolickými jmény
- Vznik v 50. letech – druhá generace
- „assembler“ (z anglického Assembly Language)
- Assembler je technicky překladač jazyka symbolických adres
- Symbolická reprezentace strojových instrukcí
Vyšší programovací jazyky
Vyšší programovací jazyky
- Procedurální – strukturované – Fortran, Algol, Cobol, Basic, PL/1, dbase, clipper, FoxPro…
- Neprocedurální (deklarativní) – SQL
- Funkcionální – LISP, APL, Haskell, Erlang
- Objektově orientované – SmallTalk, C++, Java
- Logické – Prolog, Absys, Planner
- Značkové – HTML, XML (1996)
- Skriptovací – JavaScript, PHP, Lua, Perl, Python…
Poznámka
Deklarativní programovací jazyky jsou založeny na popisu cíle – přesný algoritmus je záležitostí překladače. Příkladem je databázový dotazovací jazyk SQL – příkazem SQL říkáme databázovému stroji, co chceme dělat (např. načíst data za určitých podmínek), ale neříkáme mu, jak má tento příkaz provést.
Funkcionální jazyky zacházejí s výpočtem jako s vyhodnocením funkcí, aplikace je složena z funkcí, masivní využití rekurzí. Funkcionální jazyky jsou nejčistší implementací lambda kalkulu. Využití v umělé inteligenci, AUTOCAD (AutoLisp), unixový editor Emacs atd.
CASE sensitivita
CASE sensitivita – je-li programovací jazyk case sensitivní, znamená to, že rozlišuje velká a malá písmena v názvech proměnných, příkazů, funkcí…
Základní prvky programu
Základní prvky programu
- Proměnná
- Přiřazení
- Cyklus
- Podmínky pro větvení
Proměnná
Proměnná = úložiště informace – má vyhrazené místo v paměti, proměnná má typ a hodnotu.
Příklad deklarace proměnné z jazyka C:
int i; // deklaruji proměnnou i typu integer (celé číslo bez desetin)
i = 5; // do proměnné i ukládám hodnotu 5
Ukázka v jazyce Basic (textová proměnná):
Dimension Txt as string
Txt = „Ahoj“
Ukázka v jazyce C:
Char *Txt;
Malloc(Txt,10);
Strcpy(Txt, „Ahoj“);
Porovnání
if ( Hodnota == 0)
{ // příkazy pokud podmínka platí
Vysledek = TRUE;
}
Else
{
// příkazy pokud podmínka neplatí
Vysledek = FALSE;
}
Cyklus
Cyklus
V příkladu výše je uveden tzv. zdánlivě nekonečný cyklus. Cyklus probíhá, dokud platí podmínka (porovnání ve „while“, dokud má proměnná „cyklus“ hodnotu true, pokud se vyhodnotí podmínka v if jako pravda, nastaví se proměnná cyklus na hodnotu „false“ a tím je cyklus ukončen. Zdánlivě nekonečný je z toho důvodu, že pokud by podmínka v konstrukci if nebyla nikdy splněna, cyklus by běžel do nekonečna).
Jiným typem cyklu je for cyklus, skládá se z: inicializátor, podmínka, přírůstek, tělo cyklu.
For ($i=1, $<10; $i++)
{
// proveď příkaz(y) = tělo cyklu
}
Rekurze
Rekurze je opakované, vnořené volání stejné funkce.
Typy:
a) Přímá – podprogram volá sám sebe
b) Nepřímá – vzájemné volání podprogramů vytvoří kruh
Příklad
Výpočet faktoriálu N! = N * (N – 1)!
Př. 5! = 5*4*3*2*1 = 120
Sub Faktorial(N)
(
if N = 0 then
Vysledek = 1
else
Vysledek = N * Faktorial(N – 1)
endif
)
Frameworky
Frameworky
SW poskytující prostředí a základní funkcionalitu. Příklad: NET, COCOA (framework pro počítače Apple), Oracle Application Development Framework, Eclipse, PHP Zend, Nette,…
CASE nástroje
CASE = Computer Aided Software Engineering
- Nástroj k vývoji, modernizaci a údržbě SW
- Kombinace SW nástrojů a strukturovaných metodologií
Účel: modelování, generování zdrojových kódů, reverse engineering (zpětné inženýrství – získání zdrojového kódu z aplikace)
Komponenty CASE nástrojů:
Komponenty CASE nástrojů:
- Grafické ovládací prostředí
- Repository – centrální databáze objektů, proměnných…
- Podpora normalizace dat
- Verifikace konzistentní dat
- Nástroj pro návrh
- Textový editor pro popis objektů
- Generátor zdrojových kódů
- Import/export dat
Typy CASE nástrojů:
Typy CASE nástrojů:
- Upper CASE – globální analýza, plánování
- Middle CASE – detailní analýza, návrh IS
- Lower CASE – fyzická (programová) realizace
I-CASE (integrovaný CASE) – podporuje všechny životní cykly projektu – včetně generování SW, tvorbu a údržbu dokumentace atd.
Přínosy použití CASE:
Přínosy použití CASE
- Eliminace neproduktivního času projektantů
- Zvýšení kvality SW
- Urychlení procesu vývoje
- Jednodušší provádění změn
Syntaxe
Syntaxe
V informatice je syntaxe programovacího jazyka soubor pravidel, která definují kombinaci symbolů, které jsou považovány za správně strukturovaný dokument nebo fragment v tomto jazyce. To platí jak pro programovací jazyky, kde dokument představuje zdrojový kód, tak pro značkovací jazyky, kde dokument představuje data. Syntaxe jazyka definuje jeho povrchovou formu. Textové programovací jazyky jsou založeny na posloupnosti znaků, zatímco vizuální programovací jazyky jsou založeny na prostorovém uspořádání a spojení mezi symboly (které mohou být textové nebo grafické). Dokumenty, které jsou syntaktický neplatné, obsahují syntaktickou chybu.
Syntaxe – forma – je protikladem k sémantice – významu. Při zpracování programovacích jazyků, sémantické zpracování obvykle přichází po syntaktickém zpracování, ale v některých případech je sémantické zpracování nezbytné pro dokončení syntaktické analýzy, a ty jsou prováděny společně nebo současně. V překladači, front-end (přední část) provádí syntaktickou analýzu, zatímco sémantickou analýzu provádí back-end (zadní část; a middle-end, pokud je tato fáze rozlišována)
Úrovně syntaxe
Úrovně syntaxe
Syntaxe programovacího jazyka je obvykle rozdělena do tří úrovní.
- Slova – lexikální úroveň; určuje, jak znaky vytváří tokeny
- Fráze – gramatická úroveň, stručně řečeno, určuje jak tokeny utváří fráze
- Kontext – určuje na které objekty nebo proměnné názvy odkazují, jestli jsou typy validní atd.
Rozdělení tímto způsobem přináší modularitu umožňující každé úrovni být popsána a zpracována samostatně a často nezávisle. Nejprve lexer převede lineární posloupnost znaků na lineární posloupnost tokenů, což je známo jako „lexikální analýza“ nebo „lexing“. Poté parser převede lineární posloupnost tokenů na hierarchický syntaktický strom, což je známo jako „syntaktická analýza“. Nakonec kontextová analýza překládá názvy a provádí typovou kontrolu.
Sémantika
Sémantika programovacích jazyků je v teorii programovacích jazyků obor zabývající se důsledným matematickým popisem významu programovacího jazyka. Zhodnocuje význam syntakticky platných řetězců v daném programovacím jazyce, včetně jejich výpočtu. V případě ohodnocování syntakticky neplatných řetězců, není výpočet proveden.
Sémantika popisuje procesy, které řídí počítač při vykonávání programu v daném programovacím jazyce. Například tím, že popisuje vztah mezi vstupem a výstupem programu, nebo popisem, jak program poběží na určité platformě, tedy vytvořením modelu výpočtu.
Statická sémantika
Statická sémantika
Statická sémantika je řešena při překladu programu, zde jsou definovány a deklarovány jednotlivá pravidla a prvky programovacího jazyka. V těchto prvcích je zahrnuta jazyková konstrukce, její typy parametrů, význam příkazů a další prvky. Statická sémantika dále kontroluje statické typy a práci s tabulkou definovaných programových symbolů.
- Staticky typované jazyky požadují uvedení do datového typu u každé deklarace. Zde nelze deklarovat proměnnou, funkci nebo objekt bez zadání datového typu.
- Všechny typové kontroly jsou prováděny staticky při překladu. Už při překladu má být každé proměnné přiřazen datový typ.
- Je možné daný datový typ přímo přetypovat. Přetypování především slouží k obcházení typových kontrol.
- Výhodou statického typování je lepší možnost odhalení datových chyb.
- Hlavní nevýhodou této metody je větší složitost programových konstrukcí, délka zdrojového kódu a tím i menší pružnost programovacího jazyka.
- K nejčastěji vyskytovaným běhovým chybám patří přetečení datového typu.
- Mezi nejznámější zástupce staticky typovaných jazyků patří Java, Ada a jazyk C.
Dynamická sémantika
Dynamická sémantika
Dynamická sémantika je řešena přímo za běhu programu. Dynamicky typované jazyky jsou významné v jednotlivých jazykových konstrukcích. Jaký úkon se má provést, když je v programu napsán daný příkaz nebo priorita operátorů. Dynamická sémantika je obzvlášť náročná u programovacích jazyků s rekurzivním voláním podprogramů, proto je nutné vést evidenci o volání téhož podprogramu. Z kterého se vytváří aktivační záznamy pro jednotlivá volání podprogramů a jejich následné ukládání do zásobníku.
- U dynamicky typovaných jazyků není vyžadováno uvádění datových typů v deklaracích, některé nevyžadují ani deklarace.
- Datový typ proměnné je vázáno na formu první hodnoty. Hodnota a datový typ nově vytvořené proměnné je dána výsledkem předchozího vyhodnoceného výrazu.
- Prakticky všechny typové kontroly (až na pár výjimek) probíhají dynamicky za běhu programu a zároveň probíhá automatické přetypování proměnných. Ze strany uživatele není problém kdykoliv měnit datový typ proměnné za běhu programu.
- Výhodou dynamického typování je kratší a jednodušší zdrojový kód, a tím i jeho lepší čitelnost.
- Naopak k nevýhodám patří možnost výskytu typových chyb za běhu programu.
- Mezi nejznámější zástupce dynamicky typovaných jazyků patří Python, SmallTalk, Prolog.