Charakterizujte procedurální programování
Charakterizujte objektově orientované programování
Charakterizujte funkcionální programování
Charakterizujte deklarativní programování
Charakterizujte aplikativní programování
Charakterizujte logické programování
Charakterizujte souběžné programování
Charakterizujte vizuální programování
Jaké jsou globální kritéria na programovací jazyk
Hlediska ovlivňující spolehlivost prog. jazyka
Hlediska ovlivňující efektivitu prog. jazyka
Hlediska ovlivňující čitelnost a vyjadřovací schopnost prog. jazyka
Definujte pojmy syntax, sémantika programovacího jazyka
Definujte pojem úplnost jazyka v Turingově smyslu
§ Zapište syntaktickým diagramem tvar příkazu
Objasněte pojmy statická a dynamická sémantika
Jaké druhy chyb v programu rozlišujeme
§ Jaké druhy chyb a ve které fázi je schopen nalézt překladač
§ Zjistěte možné urychlení výpočtu při zadaných údajích o úsecích a jejich urychlení
§ Popište rozdíl mezi fyzickým paralelismem, logickým paralelismem a kvaziparalelismem
§ Jaké specifické problémy vznikají v paralelně prováděných výpočtech, popište je
Popište principy možných způsobů komunikace procesů
V jakých stavech se může nacházet proces a jaké jsou důvody přechodů mezi stavy
Popište princip synchronizace pomocí předávání zpráv
Zjistěte možné urychlení výpočtu při zadaných údajích o úsecích a jejich urychlení
Charakterizujte kritické sekce programu, uveďte příklad
Definujte v Javě třídu, jejíž objekty mohou obsahovat paralelně prováděné metody
Jmenujte základní metody a) třídy Thread, b) rozhraní Runnable
Proč Java zavádí možnost odvozovat objekty s vlákny implementací rozhranní Runnable
Jakým způsobem lze v Javě ovlivnit prioritu provádění vlákna. Uveďte příklad
V jakých stavech se může nacházet vlákno Javy
Zapište příkaz, který zjistí zda vlákno v1 běží
Zapište příkaz, pozastavující vlákno v2 dokud neskončí činnost vlákno v1
Jakým příkazem a jakým mechanismem dává vlákno najevo, že čeká na skončení vlákna vl
Vysvětlete způsob chování synchronized metod Javy
Jaký je rozdíl v efektu příkazu Javy yield( ), sleep(200) a wait(200)
Popište účel a způsob použití příkazu notify() a notifyAll()
Popište efekt metody Javy interrupt()
Jaký je tvar a účinek synchronized příkazu Javy
Popište metody suspend, resume a stop Javy. Proč nejsou doporučované?
Jaký je rozdíl mezi uživatelskými a démon vlákny?
Zapište konstrukci a)zjišťující, je-li vlákno démonem, b)určující, že má být démonem
Zapište konstrukci, která začlení vlákno do skupiny vláken
Jaké jsou důvody, pro využívání synchronizačních prostředků z balíku conccurent?
§ Popište základní prostředky třídy ReentrantLock z z balíku conccurent.
§ Popište základní prostředky třídy CyclicBarrier z balíku conccurent
§ Popište základní prostředky třídy CounDouwnLatch z balíku conccurent
Charakterizujte SIMD a MIMD architekturu
Uveďte charakteristické vlastnosti skriptovacích jazyků
Jmenujte oblasti použití skriptovacích jazyků
§ Jaké datové typy označuje Python jako sekvence, uveďte příklady zaváděných operací
§ Jednoduché příklady na příkazy Pythonu se seznamy
§ Jednoduché příklady na příkazy Pythonu s množinami
Jednoduché příklady na příkazy Pythonu s n-ticemi
Jednoduché příklady na příkazy Pythonu se slovníky
Popište hlavní odlišnosti OOP v Javě a Pythonu
Jak řeší Python problém násobné dědičnosti
Charakterizujte perzistentní objekty a možnost jejich vytváření
K čemu slouží a jak funguje destruktor Pythonu
Charakterizujte událostmi řízené programování
Jak lze s využitím Tkinter implementovat čekací smyčku
Jmenujte alespoň 6 grafických prvků Tkinter
Jaké vlastnosti má well-formed XML dokument
Charakterizujte relační databázi
Co to je a k čemu slouží primární klíč
Jakou konstrukcí umožní modul pyodbc provádět SQL příkazy
Co je to databázový kurzor, k čemu slouží
Popište sémantiku metod fetchone, fetchmany, fetchall
Popište sémantiku metody commit
Vysvětlete využití INNER JOIN fráze v příkazu SELECT
Definujte slovně termy jazyka Prolog
Objasněte pojem anonymní proměnná Prologu a její vlastnosti
Popište princip rezoluce Prologu
Popište princip unifikace Prologu
Popište způsob plnění cílů v Prologu
Jak probíhá návrat při nesplnění cíle v Prologu
Vysvětlete mechanismus působení predikátu řezu
Popište Church-Roserovu vlastnost výrazů
Popište základní cyklus vyhodnocování lipovského programu
Jaké jsou elementární funkce Lispu a jejich sémantika
Popište sémantiku lispovské funkce COND
Popište tvar a účinek lispovské funkce DEFUN
Definujte tvar a využití lambda výrazů
Co to jsou funkcionály, popište některý
Objasněte rozdíl mezi „klíčovými slovy „ a „předdefinovanými slovy“
Objasněte rozdíl mezi dobou existence a rozsahem platnosti proměnné
Uveďte příčiny vzniku synonym (alias) v programech
Popište princip statické a dynamické vazby jména proměnné s typem
Popište princip výhody a nevýhody statické a dynamické vazby proměnné s adresou
Popišre rozdíl mezi statickým a dynamickým rozsahem platnosti proměnné
Definujte pojem silný typový systém programovacího jazyka
Definujte pojmy strukturální a jmenná kompatibilita typů
Definujte pojmy „literál“ a „manifestová konstanta“
Jaké rozlišujeme druhy konstant podle doby jejich určení. Popište je
Jaké typy označujeme jako ordinální
Popište jaké typy označujeme jako uniony
Uveďte, jakým způsobem vzniká dangling pointer
Uveďte, jakým způsobem vzniká ztracená proměnná z haldy
Popište pojmy precedence, asociativita a arita operátorů ve výrazech
Jaká jsou pozitiva a negativa příkazů skoku
Které vlastnosti jsou důležité pro příkazy cyklů v programovacích jazycích
Jmenujte kriteria, dle kterých lze hodnotit vlastnosti podprogramů programovacích jazyků
K čemu slouží a co obsahují aktivační záznamy podprogramů a funkcí
Objasněte rozdíl mezi statickou a dynamickou vazbou metod s místem jejich volání
Uveďte jakou vazbu metod implicitně užívá Java, Obj.Pascal, C++, Python
jako kucharka
popisuje vypocet pomoci poslounosti prikazu a urcuje presny postup, jak danou
ulohu resit
sada promennych, která v zavislosti na vyhodnoceni podminek meni svuj stav
strukturovane
modularni
znovupouzitelnost
program je mnozina objektu
objekty maji stav, jmeno, chovani
predavaji si zpravy
zapouzdrenost, dedicnost, polymorfismus
vypocet rizen vyhodnocovanim matematickych funkci
LISP, Erlang, Haskell
Výpočtem funkcionálního programu je posloupnost vzájemně ekvivalentních výrazů, které se postupně zjednodušují. Výsledkem výpočtu je výraz v normální formě, tedy dále nezjednodušitelný. Program je chápán jako jedna funkce obsahující vstupní parametry mající jediný výstup. Tato funkce pak může být dále rozložitelná na podfunkce.
popis cile, algoritmus stanovi az interpret, programator se jim nezabyva
casto nemoznost siroke optimalizace programu takovym zpusobem, kterym
potrebujeme
rekurze, vyssi naroky na programatora
funkcionalni(Lisp)
logicke(Prolog)
programovani ohranicenimi
základem
je funkce, ta se aplikuje na argumenty a spočte se jednoznačný výsledek
matematicka logika v programovani
programator jen definuje logicke formule
generator je zodpovedny za vyreseni problemu
AI, zpracovani prirozene reci, expertni systemy
prolog
program je navrzen jako kolekce interagujicich procesu
jeden procesor x vice procesoru, sdilena pamet x predavani zprav,
specifikuje program interaktivne pomoci grafickych prvku (ikon, formularu).
Spolehlivost
Efektivita - prekladu, vypoctu
Strojova nezavislost
Citelnost a vyjadrovaci schopnosti
Syntax a semantika
Uplnost v turingove smyslu
typovovani - typovane (definuji mnozinu typu dat, na ktere je operace
aplikovatelna). Netypovane (vsechny operace nad jakymikoliv daty - ASEMBLER)
staticke/dynamicke typovani - staticke (vsechny vyrazy maji urceny typ pred
spustenim programu). dynamicke (az pri behu programu)
slabe x silne typovani. Slabe (lze s jednim typem pracovat jako s typem jinym.
Retezec x cislo). Silne (zakazuje s jednim typem pracovat jako s typem jinym =>
chyba).
Ef. Překladu, Ef. výpočtu
jednoduchost (c++, ++c; x+=1; ...)
ortogonalita (mala mnozina primitivnich konstrukci, ktere se daji skladat do
vetsich celku)
strukturovane prikazy
citelnost x citelnost zapisu
syntax - forma ci struktura vyrazu, prikazu a programovych jednotek
semantika - vyznam vyrazu, prikazu,..
obsahuje takovou mnozinu opreaci, ze jim lze popsat libovolny algoritmus.
Co je potřebné pro Turingovu úplnost?
číselná aritmetika
číselné proměnné spolu se sekvenčně prováděnými příkazy
cykly while
přiřazení
<program> → <seznam deklaraci> ; <prikazy>
<seznam deklaraci> → <deklarace> | <deklarace>;<seznam deklaraci>
//svislítko znamená nebo
<deklarace> → <spec. typu> <sez. promennych>

semantika studuje a popisuje vyznam vyrazu/programu.
staticka semantika - v dobe prekladu
dynamicka - v dobe behu
x += y; x := x+y; let x = x+y (jina syntax, stejna semantika)
lexikalni (napr. nedovoleny znak)
syntakticke (chyba ve strukture)
staticke semantiky - chyba v typech, nedefinovana promenna
dynamicke semantiky - deleni nulou, neodhalitelne pri prekladu
logicke
Při
překladu:
lexikální a syntaktické chyby
Před
výpočtem:
chyby statické sémantiky
Překladač nemůže při překladu nalézt chyby v dynamické sémantice. Ty se projeví
až při výpočtu
Žádný
překladač nemůže hlásit logické chyby
Amdahluv
zakon urcuje urychleni vypoctu pri uziti vice procesoru

Pk .. %
instrukci, ktery lze urychlit
Sk .. %
multiplikator urychleni
n ..
pocet ruznych useku programu
k ..
index useku
Př.
úseky:
Procent
instrukcí, které lze urychlit:
P1 =
11 %, P2 = 48%, P3 = 23%, P4 = 18%
Multiplikátory urychlení:
S1 =1;
S2 = 1,6; S3 = 20; S4 = 5
Urychlení je: 1 / (0,11/1 + 0,48/1,6 + 0,23/20 + 0,18/5) ≈ 2,19
Fyzický paralelismus
(má více procesorů pro více procesů)
Logický paralelismus
(time-sharing jednoho procesoru, v programu je více procesů)
Kvaziparalelismus(
kvazi=zdánlivě, př. korutiny v některých jazycích)
Korutiny
– speciální druh podprogramů, kdy volající a volaný jsou si rovni (symetrie),
mají více vstupních bodů a zachovávají svůj stav mezi aktivacemi.
rychlostní závislost
uvíznutí
(vzájemné neuvolnění prostředků pro jiného)
vyhladovění
(obdržení příliš krátkého času k zajištění progresu)
livelock
(obdoba uvíznutí, ale nejsou blokovány čekáním, zaměstnávají se navzájem
(afteryou - afteryou efekt)
Přes sdílenou paměť (Java, C#) - musí se zamykat přístup k paměti
Předáváním zpráv (Occam, Ada) - vyžaduje potvrzení o přijetí zprávy
1. Stav probihajici (running) - procesu je pridelen procesor a prave se provadi prislusne programy.
2. Stav cekajici (waiting) - proces ceka na urcitou udalost, napr. dokonceni I/O operace.
3. Stav pripraven (ready) - proces je pripraven k vykonani a ceka pouze na prideleni procesoru.
Tyto 3 hlavni procesy nestaci pro uplny popis pohybu ulohy v OS. Pro uplnost uvedme min. jeste dalsi 3:
4. Stav predana (submit) - uzivatel predal svou ulohu systemu a ten na ni musi reagovat. Stav mirne archaicky, spocivajici napr. ve vlozeni sady dernych stitku do ctecky.
5. Stav prijata (hold) - uloha je na disku pocitace ve vnitrni reprezentaci. Ocekava prideleni prostredku.
6. Stav ukoncena (complete) - vypocet ulohy skoncil a vsechny pridelene prostredky jsou uvolneny k dalsimu pouziti.
obdobná funkce jako klíč od WC nebo návěštidlo železnice (jen jeden může do sdíleného místa).
Semafor = datová struktura obsahující čítač a frontu pro ukládání
deskriptorů/úkolů/procesů/vláken. Má dvě atomické operace zaber a uvolni (P a
V). Je použitelný jak pro soutěžící, tak pro spolupracující úkoly.
P(semafor)
if semafor == 1 then semafor = 0
else pozastav volajici proces a dej ho do fronty na semafor
V(semafor)
if fronta na semafor je prazdna then semafor = 1
else vyber prveho z fronty a aktivuj ho
Monitor je modul (v OOP objekt), nad jehož daty mohou být prováděny pouze v něm definované operace.
Provádí-li jeden z procesů některou monitorovou operaci, musí se ostatní procesy postavit do fronty, pokud rovněž chtějí provést některou monitorovou operaci.
Ve frontě čekají, dokud se monitor neuvolní a přijde na ně řada.
Monitor -programový modul zapouzdřující data spolu s procedurami, které s
daty pracují. Procedury mají vlastnost, že vždy jen jeden úkol/vlákno může
provádět monitorovou proceduru, ostatní čekají ve frontě. (pro Javu to probereme
důkladněji)
proces předá zprávu druhému a druhý ji ale musí očekávat, Randes-vous v ADě, příklad hospoda číšník-host, číšník čeká na objednávku,…(Message Driven Bean)
Př. úseky:
Procent instrukcí, které lze urychlit:
P1 = 11 %, P2 = 48%, P3 = 23%, P4 = 18%
Multiplikátory urychlení:
S1 =1; S2 = 1,6; S3 = 20; S4 = 5
Urychlení je: 1 / (0,11/1 + 0,48/1,6 + 0,23/20 + 0,18/5) ≈ 2,19
Kritická sekce programu se vyskytuje tam, kde dvě a více vláken pracuje nad stejnými daty.
Příklad: Máme dvě metody set() a get() a dvě vlákna. Jedno vlákno nastavuje nějaké hodnoty v metodě set(), vlákno druhé získává hodnoty z metody get(). Pokud by druhé vlákno získávalo hodnoty právě ve chvíli, kdy vlákno první hodnoty zapisuje, získáme data, kde budou nějaké hodnoty nové (již přepsané) a nějaké staré (ještě nepřepsané). A to je špatně.
Řešení: Pomocí monitoru (v Javě to znamená použití synchronized metod nebo bloků).
public class Vlakno extends Thread {
public void run() {
//příkazy
}
}
Třída Thread má řadu metod např.:
run() - je vždy přepsána v potomku Thread, udává činnost vlákna
start() - spustí vlákno (tj. metodu run) a volající start pak pokračuje ve výpočtu. Metoda run není přímo spustitelná
yield() - odevzdání zbytku přiděleného času a zařazení do fronty na procesor
sleep(milisec) - zablokování vlákna na daný časový interval
isAlive() - běží-li, vrací true, jinak false
join()
getPriority()
setPriority()
a další cca 20
Rozhraní Runnable má jen metodu run( )
Když uživatelova vlákna nepřepisují ostatní metody (musí přepsat jen run), upřednostňuje se runnable.
Hodně tříd potřebuje dědit (rozšiřovat) jinou třídu.
Příklad:
public class Clock extends Applet implements Runnable {
...
}
Java neumožňuje vícenásobnou dědičnost => použít rozhraní Runnable
Třída Thread definuje několik metod, které mohou být předefinovány odvozenou třídou. Jediná metoda, která musí být předefinována je metoda run() a to je právě ta, kterou vyžaduje rozhraní Runnable. Je dobré třídy rozšiřovat (tedy používat dědičnost) jen za účelem jejich modifikace. Proto, když nemáme v úmyslu rozšiřovat nic jiného než metodu run() je vhodnější použít rozhraní. V zásadě je to ale jedno:)
A) Thread. Vytvoříme třídu MyThread která podědí od Thread. Překrejeme metodu run() vytvoříme instanci a spustíme metodou start()
B) Runnable Vytvoříme třídu MyThred která implementuje runnable Implementujeme metodu run() Vytvoříme instanci MyThread - MyThread my = new MyThread() Vytvoříme z ní vlákno Thread vlakno = new Thread(my) Spustíme metodou start().
Priorita vláken = pravděpodobnost častosti získání času procesoru
Vysoká priorita = hodně času procesoru
Nízká priorita = méně času procesoru
Implicitně je přidělena priorita potomkovi jako má nadřízený process
Změnit lze prioritu metodou setPriority
final void setPriority(int cislo)
kde cislo musí být v intervalu Min_Priority ≤ cislo ≤ Max_Priority 1 . . 10 (konstanty Thread)
Norm_Priority = 5
Zjištění aktuální priority provedeme metodou final int getPriority( )
stavy vláken:
nové (ještě nezačalo běžet)
připravené (nemá přidělený procesor)
běžící (má přidělený procesor)
blokované (čeká ve frontě na monitor)
čekající (provedlo volání např. Object.wait with no timeout,Thread.join with no timeout , či LockSupport.park)
časově_čekající (provedlo volání např. Thread.sleep, Object.wait with timeout, Thread.join with timeout, LockSupport.parkNanos, LockSupport.parkUntil)
mrtvé
if (v1.isAlive()) //vrací true, pokud vlákno není mrtvé, ale vlákno nemusí být právě prováděné
v2.yield(); // vlákno v2 předá řízení vláknu se stejnou prioritou (takže v1)
v1.join(); // dokud vlákno v1 nedoběhne, jiná vlákna nemohou běžet
v1.interupt(); //oznamuje v1, ze na nej cekame, predcasne ho probudi
uzamkne objekt pro který je volána, jiná vlákna pokoušející se použít synchr. metodu uzamčeného objektu musí čekat ve frontě, tím se zamezí interferenci vláken způsobující nekonzistentnosti paměti. Když proces opustí synchr. metodu, objekt se odemkn
Pokud je metoda synchronized tak předání řízení mezi vlákny nemůže nikdy nastat
uvnitř této metody. Je to ošetření tzv. kritických sekcí programu.
Kritická sekce programu se vyskytuje tam, kde dvě a více vláken pracuje nad stejnými daty.
yield() - vlákno se vzdává své činnosti a dobrovolně přenechává procesor vláknu se stejnou prioritou
sleep(200) - vlákno se uspí (převede do neběhuschopného stavu) na 200 ms, poté bude vlákno opět ve stavu běžícím
wait(200) - vlákno čeká (převede se do neběhuschopného stavu) 200 ms, může být probuzeno (převedeno do běžícího nebo běhuschopného stavu) metodami notify() nebo notifyAll()
pokud vlákno spí nebo čeká a je na něj zavolána metoda interrupt(), pak bude vyhozena výjimka InterruptedException
final void notify( ) - oživí vlákno z čela fronty čekajících na přístup k objektu
final void notifyAll( ) - oživí všechna vlákna nárokující si přístup k objektu, ta pak o přístup normálně soutěží (na základě priority nebo plánovacího algoritmu JVM)
Mohou být volány jen z vláken, které vlastní zámek (synchronized metod a příkazů), jsou děděny z třídy Object.
Metada interrupt() - metoda ze třídy Thread, přeruší běh vlákna.
Pokud je vlákno v neběhuschopném stavu (např. uspané) a je na něj zavolána metoda interrupt() je "násilně probuzeno" a bude vyhozena výjimka InterruptedException
Můžeme mít buď synchronized metody nebo synchronized bloky.
Tvar:
synchronized public void setHodnota(Object o) - hlavička synchronized metody
synchronized public void getHodnota() - hlavička synchronized metody
Účinek: ošetření tzv. kritických sekcí, pokud je metoda synchronized pak má monitor a vlákno nikdy nemůže předat řízení uvnitř této metody.
Synchronized bloky
Tvar:
synchronized(object) {
//příkazy
}
Účinek: monitor je nad určitým objektem (zde object).
final void suspend( ) - pozastavení vlákna, kterému zašleme suspend
final void resume ( ) - obnovení vlákna, kterému zašleme resume
final void stop( ) - ukončení vlákna, kterému zašleme stop
Důvod zavržení - nebezpečné konstrukce, které snadno způsobí deadlock, když se aplikují na objekt, který je právě v monitoru.
Lze je nahradit bezpečnějšími konstrukcemi s wait a notify.
Uživatelská vlákna - pokud program používá jen tato vlákna, nemůže skončit dříve, než jsou všechna vlákna ukončena
Démon vlákna - pokud je v programu démon vlákno, program skončí bez ohledu na to, jestli toto vlákno doběhlo nebo ne
if (vlakno.isDaemon()) //zjištění, jestli je vlákno démon
vlakno.setDaemon(true); // vlákno vlakno je nyní démon
V rámci skupin lze např. určovat vláknům maximální prioritu nebo vlákna hromadně přerušovat. Do skupiny lze vlákno přidat jen v okamžiku jeho vytváření (skupina se předá jako parametr konstruktoru), později již změna není možná.
ThreadGroup tg = new ThreadGroup("network server threads"); // vytvoření skupiny
Runnable r = new Runnable() {
public void run() {
...
}
};
Thread t1 = new Thread(tg, r); // přídání vlákna t1 do skupiny tg
Thread t2 = new Thread(tg, r); // přídání vlákna t2 do skupiny tg
Vestavěná primitiva Javy nestačí k pohodlné synchronizaci protože:
Neumožňují couvnout po pokusu o získání zámku, který je zabrán, po vypršení
času, po který je vlákno ochotno čekat na uvolnění zámku. Tj. nedovolují provést
alternativní činnost
Nelze změnit sémantiku uzamčení s ohledem např. na reentrantnost, čtení versus
psaní ochranu,
Neřízený přístup k synchronizaci, každá metoda může použít blok synchronized na
libovolný objekt synchronized ( referenceNaObjekt ) { // kritická sekce }
Nelze získat zámek v jedné metodě a uvolnit ho v jiné.
Konstruktory :
ReentrantLock( ) ReentrantLock(boolean fair) instance s férovým chováním při
true, nepředbíhá
Metody:
int
getHoldCount() kolikrát aktuální vlákno žádalo o zámek
int
getQueueLength() kolik vláken chce tento zámek
protected Thread getOwner() vrátí vlákno, které vlastní zámek, nebo null
boolean hasQueuedThread(Thread thread) ?čeká zadané vlákno na tento lock …
void
lock() zabrání zámku, není-li volný musí čekat void unlock() uvolnění zámku
boolean tryLock() zabrání je-li volný, jinak může dělat něco jiného
boolean tryLock(long timeout, TimeUnit unit) zabrání s timeoutem
Použití:
1.
RZRL používá lock a unlock k prostému uzamčení kritických sekcí
manipulujících s kontem. Což funguje jako dřívější příklad.
2.
RZL používá tryLock a umožňuje tím provádět náhradní činnost po dobu čekání
na zámek.
Popište základní prostředky třídy CyclicBarrier z balíku conccurent
Dovoluje
čekání množiny vláken na sebe navzájem před pokračováním výpočtu. Nazývá se
cyklická, protože může být znovu použita po uvolnění čekajících vláken.
Obvykle je použita, když úloha je rozdělena na podúlohy takové, že každá z nich
může být prováděna separátně.
Má dvě podoby:
CyclicBarrier(int účastníci) účastníci určují počet podúloh = vláken
CyclicBarrier(int účastníci, Runnable barierováAkce) akce se provede po
spojení všech vláken, ale před jejich další exekucí
Má
metody:
Metody:
await( ) čeká, až všechni účastníci vyvolají await na této bariéře
await(long timeout, TimeUnit unit) čeká, dokud buď všechny vyvolají await
nebo nastane specifikovaný timeout
getNumberWaiting( ) vrací počet čekajících na bariéru
getParties( ) vrací počet účastníků procházejících touto bariérou isBroken(
) vrací
Popište základní prostředky třídy CounDouwnLatch z balíku conccurent
Použití
třídy CountDownLatch
Synchronizační prostředek, který dovoluje vláknu/vláknům čekat až se dokončí
operace v jiných vláknech. Inicializuje se s zadaným čítačem, který je součástí
konstruktoru a funguje obdobně jako počet účastníků v CyclicBarrier
konstruktoru.
Určuje, kolikrát musí být vyvolána metoda countDown. Po dosažení zadaného počtu
jsou všechna vlákna čekající v důsledku vyvolání metody await uvolněna k
exekuci.
Metody:
void
await( ) způsobí čekání volajícího vlákna až do vynulování čítače
boolean await(long timeout, TimeUnit unit) čekání se ukončí i vyčerpáním
času.
void
countDown( ) dekrementuje čítač a při 0 uvolní všechna čekající vlákna.
long
getCount( ) vrací hodnotu čítače
String toString( ) vrací řetězec identifikující závoru a její stav (čítač).
SIMD - stejná instrukce běží současně na více procesorech na každém s jinými daty
MIMD - nezávislé pracující procesory, mohou být synchronizovány
Integrovaný překlad a výpočet
Nízká režie a snadné použití (např. impl.deklarace)
Zduřelá fukčnost ve specif. oblastech (např. řetězce a regul. výrazy)
Není důležitá efektivita provedení (často se spustí je 1x)
Nepřítomnost sekvence překlad-sestavení-zavedení
K vytváření aplikací z předpřipravených komponent
K řízení aplikací, které mají programovatelný interface
Ke psaní programů, je-li rychlost vývoje důležitější než efektivita výpočtu
Jsou nástrojem i pro neprofesionální programátory
Administrace systémů (sekvence shell příkazů ze souboru)
Vzdálené řízení aplikací (dávkové jazyky)
Sekvence
jsou uspořádané množiny prvků
Zahrnují
8bitové řetězce, unikódové řetězce, seznamy a n-tice
Všechny sekvence S sdílí společnou množinu funkcí:
•len(S) počet prvků
•max(S) největší prvek
•min(S) nejmenší prvek
•x
in S test přítomnosti x v S
•x
not in S test nepřítomnosti
•S1 + S2 konkatenace dvou sekvencí
•tuple(s) konverze členů S na n-tici
•list(S) konverze S na seznam
•S*n nová sekvence tvořená n kopiemi S
•S[i] i-tý prvek S, počítá se od 0
•S[i:j] část sekvence S začínající i-tým prvkem až do j-tého bez něj
Příklad:
t = tuple('100') t = ('1', '0', '0')
l = list('100') l = ['1', '0', '0']
append,připojuje
svůj argument na konec seznamu
>>>
seznam.append("neco")
- extend(L) přidá na konec prvky seznamu L
-
insert(i, x) vloží prvek i na pozici x (zkoušel jsem to na eryx.zcu.cz a
argumenty to akceptuje obráceně - tedy insert (x, i) vloží prvek i na pozici x)
-
remove(x) odstraní první výskyt prvku x v seznamu
-
pop(i) odstraní prvek na pozici i a vrátí jeho hodnotu
-
pop() odstraní poslední prvek a vrátí jeho hodnotu
-
count(x) vrátí počet prvků s hodnotou x
-
sort() seřadí prvky dle velikosti (modifikuje seznam), výsledek nevrací
-
reverse() obrátí pořadí prvků
Množiny
nepatří mezi sekvence protože nejsou uspořádané. Jsou ale založeny na seznamech,
prázdná množina je prázdný seznam
# Set
je v modulu sets, od verze 2.5 je součástí jazyka jako set
>>>
import sets
>>>
M=sets.Set() # Set provede převedení
seznamu na množinu
>>>
N=sets.Set(['a',2,3])
>>>
O=sets.Set([1,2,3,4])
>>>
U= N.union(O)
>>> U
Set(['a', 1, 2, 3, 4])
>>>
U.intersection(N)
Set(['a', 2, 3])
>>>
U.intersection(N) == N
True
>>>
sets.Set([2,3]).issubset(N)
True
>>>
U.issuperset(N)
True
>>> 2
in O
True
>>> a
= set('abracadabra') # vytvoří množinu z řetězce
>>>
'z' in a # test na existenci prvku
False
>>>
a # samotná množina
set(['a', 'r', 'b', 'c', 'd'])
>>>
.join(a) # převod zpět na řetězec
'arbcd'
>>> b
= set('alacazam') # vytvoří druhou množinu
>>> a
- b # písmena, která jsou v a, ale ne v b
set(['r', 'd', 'b'])
>>> a
| b # sloučení množin
set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
>>> a
& b # průnik množin
set(['a', 'c'])
>>> a
^ b # doplněk průniku množin
set(['r', 'd', 'b', 'm', 'z', 'l'])
>>>
a.add('z') # přidá nový prvek
>>>
a.update('wxy') # přidá několik nových prvků
>>> a
set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'x', 'z'])
>>>
a.remove('x') # odebere jeden prvek
>>> a
set(['a', 'c', 'b', 'd', 'r', 'w', 'y', 'z'])
N-tice Pythonu je posloupnost hodnot uzavřená do ( ), lze s ní nakládat jako s celkem.
Po vytvoření nelze n-tici měnit (oproti seznamům jsou „immutable―)
Na jejich prvky lze odkazovat indexem
>>> ntice = (1, 2, 3, 4, 5)
>>> print ntice[1]
2
>>> ntice1 = (1, 2, 3)
>>> ntice2 = ntice1 + (4,) # čárka způsobí, že se zápis chápe jako n-tice a ne jako číslo
>>> print ntice2
(1, 2, 3, 4)
>>> 2 in (1,2,3)
True
>>> len((1,2,3))
3
>>> max((1,2,3,4,5,(2,2)))
(2, 2)
>>> min((1,2,3,4,5))
1
>>> tel = {'jack': 4098, 'sape': 4139}
>>> tel['guido'] = 4127
>>> tel
{'sape': 4139, 'guido': 4127, 'jack': 4098}
>>> tel['jack']
4098
>>> del tel['sape']
>>> tel['irv'] = 4127
>>> tel
{'guido': 4127, 'irv': 4127, 'jack': 4098}
>>> tel.keys()
['guido', 'irv', 'jack']
>>> 'guido' in tel
True
python - všechny metody jsou public
python - lze provést vícenásobné dědění
python - není definováno rozhraní
python - jsou definovány destruktory
Řešení problému násobné dědičnosti:
Není-li atribut v potomkovi, hledá python atribut v rodiči1, následně v rodiči rodiče 1. Až prohledá všechny rodiče rodiče 1, začne teprve hledat atribut v rodiči2. Tzn. hledá atributy do hloubky a pak následně z leva do prava.
Provedení v kódu:
class Potomek(Matka, Otec):
def __init__(self):
Otec.__init__(self) # 1.
Matka.__init__(self) # 2.
def popis(self):
print self.oci, self.usi, self.ruce, self.nos, self.nohy
Objekty, které mohou být uloženy a znovu použity jiným programem, "žijí" nezávisle na programu
Příklad:
class A:
def __init__(self, x, y):
self.x = x
self.y = y
def save(self, fn):
f = open(fn, "w")
f.write(str(self.x) + '\n') # preved na retezec
f.write(str(self.y) + '\n')
return f # do stejneho souboru budou sve hodnoty
# pripisovat objekty odvozenych trid
def restore(self, fn):
f = open(fn)
self.x = int(f.readline()) # preved zpet na puvodni typ
self.y = int(f.readline())
return f
a = A(12, 15) # Vytvorime instance.
a.save('a.txt').close() # Ulozime instance.
newA = A(5, 6) # Obnovime instance.
newA.restore('a.txt').close()
print "A: ", newA.x, newA.y
volá se před smazáním instance třídy z paměti
slouží k provedení příkazů těsně před odstraněním objektu z paměti
class Point:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __del__(self):
class_name = self.__class__.__name__
print class_name, "destroyed"
• Program po spuštění čeká v nekonečné smyčce na výskyty událostí
• Při výskytu události provede odpovídající akci a nadále čeká ve smyčce
• Skončí až nastane konec indikující událost
Události může generovat OS (obvyklé u programů s GUI), nebo vnější čidla
top = Tk() #vytvoří widget (ovládací prvek) na nejvyšší úrovni
top.mainloop() #odstartuje provádění smyčky
Frame, Label, Button, ScrollBar, Canvas, RadioButton, CheckButton
• Jeden kořenový element
• Neprázdné elementy musí být ohraničeny startovací a ukončovací značkou (<ovoce>Jablko</ovoce>)
• Prázdné elementy mohou být označeny tagem„prázdný element“(<ovoce/> )
• Všechny hodnoty atributů musí být uzavřeny v uvozovkách –jednoduchých (') nebo dvojitých ("), ale jednoduchá uvozovka musí být uzavřena jednoduchou a dvojitá dvojitou. Opačný pár uvozovek může být použit uvnitř hodnot
• Elementy mohou být vnořeny, ale nemohou se překrývat; to znamená, že každý (ne kořenový) element musí být celý obsažen v jiném elementu
• Omezuje množinu přípustných dokumentů spadajících do daného typu nebo třídy
• DTD tak například vymezuje jazyky HTML a XHTML.
• Struktura třídy nebo typu dokumentu je v DTD popsána pomocí popisu jednotlivých elementů a atributů. Popisuje jak mohou být značky navzájem uspořádány a vnořeny. Vymezuje atributy pro každou značku a typ těchto atributů.
• Připojení ke XML: <!DOCTYPE kořen SYSTEM "soubor.dtd">
• DTD je poměrně starý a málo expresivní jazyk. Jeho další nevýhoda je, že DTD samotný není XML soubor.
• XML SchemaDefinition
• Popisuje strukturu XML dokumentu
• Definuje:
- místa v dokumentu, na kterých se mohou vyskytovat různé elementy
- Atributy
- které elementy jsou potomky jiných elementů
- pořadí elementů
- počty elementů
- zda element může být prázdný, nebo zda musí obsahovat text
- datové typy elementů a jejich atributů
- standardní hodnoty elementů a atributů
Relační databáze je založena na tabulkách, jejichž řádky obvykle chápeme jako záznamy a eventuelně některé sloupce v nich (tzv. cizí klíče) chápeme tak, že uchovávají informace o relacích mezi jednotlivými záznamy v matematickém slova smyslu.
Primární klíč je jednoznačný identifikátor záznamu, řádku tabulky. Primárním klíčem může být jediný sloupec či kombinace více sloupců tak, aby byla zaručena jeho jednoznačnost. Má dvě základní vlastnosti: jedinečnost v rámci tabulky a ne-NULL-ovou hodnotu.
výběr hodnot specifikovaných atributů
tvar: SELECT atributy FROM tabulka WHERE podminka
SELECT Jmeno, Prijmeni FROM Studenti WHERE Vek > 23
Tvar: INSERT INTO tabulka (atributy) VALUES (hodnoty)
Příklad:
INSERT INTO Studenti (Jmeno, Prijmeni, Vek, Skola, Prumer) VALUES (‘Jan’, ‘Novy’, 25, ‘FAV ZCU’, 3,1)
Tvar: DELETE FROM tabulka WHERE podminka
Příklad:
DELETE FROM Studenti WHERE Vek>39 and Prumer>3
Tvar: UPDATE tabulka SET atribut = hodnota, atd WHERE podminka
Příklad:
UPDATE Studenti SET Skola=‘VUT’, Vek= 12 WHERE Jmeno=‘Gustav’ and Prijmeni=‘Klaus’
import pyodbc
c = pyodbc.connect("DSN=Lide") #vytvori spojeni c se zdrojem dat (byl pojmenovan Lide)
cursor = c.cursor() #vytvori kurzor cursor
objekt kurzor dovoluje provádět operace na databázi (selekty, inserty, updaty, delety). V objektu kurzor jsou interně uloženy výsledky dotazu.
K výběru řádků výsledku dotazu v podobě objektu lze použít metody:
fetchone() - vrací n-tici = další řádek výsledku uloženého v kurzoru
fetchmany(n) - vrací n řádků, které jsou na řadě ve výsledku uloženém v kurzoru
fetchall() - vrací všechny řádky výsledku
zakončí transakci (zapíše změny do databáze)
spojení záznamů z více tabulek k získání jediné výsl. relace
term - Jednotná datová struktura, se kterou pracuje prog. jazyk Prolog
•struktura
•jednoduchý term
-proměnná
-konstanta
číslo
atom
• řetězce znaků začínající malým písmenem obsahující pouze písmena, číslice a podtržítko
• posloupnost znaků uzavřená v apostrofech (některé implementace používají uvozovky)
• atomy skládající se pouze ze speciálních znaků
Speciální typ proměnné. Značí se jako podtržítko a používá se v pravidlech. Její hodnota není podstatná a Prolog ji ve výsledcích nezobrazuje.
Příklad: predikát, zda X je dítě
je_dite(X) :- dite(X,_).
a :- a1, a2, … , an. b :- b1, b2, … , bm. Nechť bi ≡ a pak rezolucí je b :- b1, b2, … bi-1, a1, a2, … , an , bi+1 , … , bm.
Tzn. když se při plnění cílů z těla pravidla b narazí na zpracování cíle bi alias a, začnou se zpracovávat cíle těla pravidla a.
• porovná-li se volná proměnná s konstantou, naváže se na tuto konstantu,
• porovnají-li se dvě volné (neinstalované) proměnné, stanou se synonymy,
• porovná-li se volná proměnná s termem, naváže se na tento term,
• porovnají-li se termy, které nejsou volnými proměnnými, musí být pro úspěšné
porovnání stejné.
• Dotaz může být složen z několika cílů.
• Při konjunkci cílů jsou cíle plněny postupně zleva.
• Pro každý cíl je při jeho plnění prohledávána databáze od začátku.
• Při úspěšném porovnání klauzule s cílem je její místo v databázi označeno
ukazatelem. Každý z cílů má vlastní ukazatel.
• Při úspěšném porovnání cíle s hlavou pravidla, pokračuje výpočet plněním cílů
zadaných tělem pravidla.
• Cíl je splněn, je-li úspěšně porovnán s faktem databáze, nebo s hlavou
pravidla databáze a jsou splněny podcíle těla pravidla.
• Není-li během exekuce některý cíl splněn ani po prohlédnutí celé databáze, je
aktivován mechanismus návratu.
• Splněním jednotlivých cílů dotazu je splněn globální cíl a systém vypíše
hodnoty proměnných zadaných v dotazu.
• Zjistí-li se při výpočtu, že globální cíl nelze splnit, je výsledkem no.
• exekuce se vrací k předchozímu splněnému cíli, zruší se instalace proměnných a
pokouší se opětovně splnit tento cíl prohledáváním databáze dále od ukazatele
pro tento cíl,
• splní-li se opětovně tento cíl, pokračuje se plněním dalšího, (předtím
nesplněného) vpravo stojícího cíle,
• nesplní-li se předchozí cíl, vrací se výpočet opětovně zpět.
• Použijeme, když chceme zabránit hledání jiné alternativy
• Odřízne další provádění cílů z hlavy pravidla
• Je bezprostředně splnitelným cílem, který nelze opětovně při návratu splnit
• Projeví se pouze, když má přes něj dojít k návratu
• Změní mechanismus návratu tím, že znepřístupní ukazatele vlevo od něj ležících
cílů (přesune je na konec Db)
nemění stavový prostor programu
• Hodnota výsledku nezávisí na pořadí vyhodnocování (tzv.Church-Roserova vlastnost)
• Výraz lze vyhodnocovat paralelně , např ve výrazu (x*2+3)/(fce(y)*x) lze pak současně vyhodnococat dělence i dělitele. Pokud ale fce(y) bude mít vedlejší efekt a změní hodnotu x, nebude to čistý výraz a závorky paralelně vyhodnocovat nelze.
Hodnota výsledku nezávisí na pořadí vyhodnocování
Souhrný název pro data v Lispu (čísla, znaky, řetězce, symboly, seznamy)
Cyklus:
1. Výpis promptu
2. Uživatel zadá lispovský výraz (zápis fce)
3. Provede se vyhodnocení argumentů
4. Aplikuje funkci na vyhodnocené argumenty
5. Vypíše se výsledek (fční hodnota)
• CAR alias FIRST selektor - vyběr prvého prvku
• CDR alias REST selektor - výběr zbytku seznamu (čti kúdr)
• CONS konstruktor-vytvoří dvojici z agumentů
• ATOM test zda argument je atomický
• EQUAL test rovnosti argumentů
Větvení programu v LISPU
například výpočet absolutní hodnoty:
(cond((> x 0) x)
((= x 0) 0)
(t(-x)))
pokud x > 0 je vráceno x
pokud x == 0 je vrácena 0
V ostatních případech je vráceno -x
definování uživatelské funkce
(defun double (x) (* x 2))
následně lze funkce zavolat např:
(double 3)
• popisují bezejmenné fce
• jsou aplikovány na parametry
př.
((lambda (x) ( * x x)) 5)
((lambda (y) ((lambda (x) (+ (* x x) y )) 2 )) 3)
Funkce, jejichž argumentem je funkce nebo vrací funkci jako svoji hodnotu.
Klíčová slova - identifikátory, které tvoří slovní zásobu programovacího jazyka. Pro jiné účely, jako například název proměnné, je použít nelze.
Předdefinovaná slova - identifikátory speciálního významu, které lze předdefinovat (např vše z balíku java.lang–String, Object, System…)
doba existence (lifetime) - čas, po který je vázána na určité paměťové místo
rozsah platnosti (scope) - interval instrukcí, po který je možné získat hodnotu proměnné z paměti (proměnna je viditelná)
Aliasy - Synonyma jsou proměnné které spolu sdílí pamět, takže bych řekl že to budou třeba ukazatele v Javě... Bo nevim Jsou to :
Pointery
Referenční proměnné
Variantní záznamy (Pascal)
Uniony (C, C++)
Fortran (EQUIVALENCE)
Parametry podprogramů
Statická vazba(jména s typem / s adresou)
navázání se provede před dobou výpočtu a po celou exekuci se nemění
Vazba s typem určena buď explicitní deklarací nebo implicitní deklarací
Dynamická vazba(jména s typem / s adresou)
nastane během výpočtu nebo se může při exekuci měnit
–Dynamická vazba s typem
§ specifikována přiřazováním (např. Lisp)
§ výhoda –flexibilita (např. generické jednotky)
§ nevýhoda-vysoké náklady + obtížná detekce chyb při překladu
Dynamická vazba promenna s adresou - (nastane alokací z volné paměti, končí dealokací) doba existenceproměnné (lifetime) je čas, po který je vázána na určité paměťové místo. Rekl bych ze to bude Garbage Colector
Staticka - je to urceno predem. Priklad netusim
Statický (lexikální) rozsah platnosti
Určen programovým textem
K určení asociace jméno – proměnná je třeba nalézt deklaraci
Vyhledávání: nejprve lokální deklarace, pak globálnější rozsahová jednotka, pak ještě globálnější...
Uplatní se pokud jazyk dovolí vnořování prog.jednotek
Proměnné mohou být zakryty (slepé skvrny)
C++, ADA, Java dovolují i přístup k zakrytým proměnným (Třída.proměnná)
Prostředkem k vytváření rozsahových jednotek jsou bloky
Dynamický rozsah platnosti
Založen na posloupnosti volání programových jednotek (namísto hlediska statického tvaru programového textu,
řídí se průchodem výpočtu programem)
Proměnné jsou propojeny s deklaracemi řetězcem vyvolaných podprogramů
Programovací jazyk má silný typový systém, pokud typová kontrola odhalí veškeré typové chyby
Jmenné kompatibility – dvě proměnné jsou kompatibilních typů, pokud jsou uvedeny v téže deklaraci, nebo v deklaracích používajících stejného jména typu (ADA, Java)
Strukturální kompatibility – dvě proměnné jsou kompatibilní mají-li jejich typy identickou strukturu (Pascal a C)
Literál - konstanta, která nemá jméno
String s="cat"; // cat je literal
Manifestová konstanta - jméno pro literál
Konstanty(mají fixní hodnotu po dobu trvání jejich existence v programu, nemají atribut adresa = na jejich umístění nelze v programu odkazovat):
•Statické
-Určené v době překladu –př.Javy: static final int zero = 0;
-Určené v době zavádění programu
static final Date now = new Date();
•Dynamické konstanty:
-v C# konstanty definované readonly
-v Javě: každé non-static final přiřazení v konstruktoru.
-v C: #include <stdio.h>
Ordinální(zobrazitelné = přečíslitelné do integer)
-primitivní mimo float
-definované uživatelem (pro čitelnost a spolehlivost programu). Typy typu výčet (enum).
Uniony – typy, jejichž proměnné mohou obsahovat v různých okamžicích výpočtu hodnoty různých typů.
např. v jazyce C si vyžádáme paměť funkcí malloc. Zavoláme free(), ale pointer ukazuje na část paměti, která již byla uvolněna.
#include <stdlib.h>
{
char *cp = malloc ( A_CONST );
/* ... */
free ( cp ); /* cp je nyní dangling pointer, ukazuje na část paměti, která již byla uvolněna */
cp = NULL; /* nyní je problém vyřešen */
/* ... */
}
Vzniká, když je ukazateli přiřazena nová adresa dříve, než je uvolněna paměť, na kterou ukazuje.
precedence - pořadí vyhodnocování //nevím jistě
V aritmetice a algebře jsou používána různá pravidla, která určují pořadí, v jakém se vyhodnocují operace ve výrazu. Prorita, s jakou se vyhodnocuje daná operace se nazývá precedence. Precedence každé operace je otázkou vzájemné domluvy - konvence. Nelze ji nijak matematicky odvodit.
asociativita - směr vyhodnocování (zprava, zleva) // nevím jistě
Asociativita je v matematice, zejména v algebře, vlastnost binární operace, říkající, že nezáleží na tom, v jakém pořadí operace provádíme, pokud se jich vedle sebe vyskytne více (například násobíme nebo sčítáme tři (čtyři …) čísla).
arita - počet operandů pracující nad operátorem
Arita operace je rovna aritě kartézského součinu vstupu, tzn. obsahuje-li vstup n množin, pak říkáme, že operace je n-ární.
Pro n = 0 jde o operace nulární.
Pro n = 1 jde o operace unární.
Pro n = 2 se jedná o operace binární.
Pro n = 3 se jedná o ternární operaci.
Nevýhody
-znepřehledňuje program
-je nebezpečný
-znemožňuje formální verifikaci programu
Výhody
-snadno implementovatelný
-efektivně implementovatelný
•Jakého typu mohou být parametry a meze cyklu?
•Kolikrát se vyhodnocují meze a krok?
•Kdy je prováděna kontrola ukončení cyklu?
•Lze uvnitř cyklu přiřadit hodnotu parametru cyklu?
•Jaká je hodnota parametru po skončení cyklu?
•Je přípustné skočit do cyklu?
•Je přípustné vyskočit z cyklu?
•Způsob předávání parametrů?
•Možnost typové kontroly parametrů ?
•Jsou lokální proměnné umisťovány staticky nebo dynamicky?
•Jaké je platné prostředí pro předávané parametry, které jsou typu podprogram ?
•Je povoleno vnořování podprogramů ?
•Mohou být podprogramy přetíženy (různé podprogramy mají stejné jméno) ?
•Mohou být podprogramy generické ?
•Je dovolena separátní kompilace podprogramů ?
Jsou v nich uloženy lokální data podprogramů.
•Místo pro lokální proměnné
•Místo pro předávané parametry
•(Místo pro funkční hodnotu u funkcí)
•Návratová adresa
•Informace o uspořádání aktivačních záznamů
•Místo pro dočasné proměnné při vyhodnocování výrazů
Brzká vazba - statická
Volání metod objektů je zařízeno pevnou adresou vzniklou při překladu.
Pozdní vazba - dynamická
V místě volání metody se nesmí použít pevná adresa objektu, musí tam být pouze symbolický odkaz. Ten se naplní v okamžiku přiřazení konkrétního objektu, tedy až V DOBĚ BĚHU.
//teda aspoň si to myslím - Tifo
statická - java, c++
dynamická - python, obj. pascal
// taky jen myslím - Tifo