================================================================================ Charakterizujte deklarativní programování popisujeme co se má řešit a né jak se to má řešit Charakterizujte aplikativní programovací jazyky výpočet je popsán prostřednictvím výrazů Popište rozdíl prologovského příkazu consult a reconsult consult(A) : Nacteni klauzuli do databaze ze souboru A (.ARI) reconsult(A) : Nacteni klauzuli ze souboru A a prepsani db Vysvětlete sémantiku prologovského predikátu is A is B : Prirazovaci prikaz - B je aritm. vyraz; A := B; operator is vrací true Popište účinek prologovského predikátu řezu [X | Y] - X je první prvek tohoto seznamu, Y je seznam se zbytkem Vysvětlete, jak je v Prologu prováděn proces unifikace. porovná-li se volná proměnná s konstantou, naváže se na tuto konstantu; porovná-li se volná proměnná s termem, naváže se na tento term; porovnají-li se dvě volné (neinstalované) proměnné, stanou se synonymy; porovnají-li se termy, které nejsou volnými proměnnými, musí být pro úspěšné porovnání stejné; Popište způsob vyhodnocení dotazu v prologovském programu 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. Popište syntax a semantiku lispovského příkazu COND (COND (test1 forma11 forma12 ...) (test2 forma21 forma22 ...) (testN formaN1 formaN2 ...) ) Sémantika COND: if test1 then {forma11; forma12 ...} else if test2 then {forma21; forma22 ...} else if testN then {formaN1; formaN2 ...} else NIL; Hodnotou je hodnota poslední vyhodnocené formy nebo nil K jakému účelu slouží v Lispu funkce QUOTE (QUOTE a) zabrání vyhodnocení a Uveďte příklady funkcionálů v jazyce Lisp. Funkce, jejichž argumentem je funkce nebo vrací funkci jako svoji hodnotu. např: FUNCALL, APPLY, MAPCAR,... Popište obecný tvar lambda výrazu Lispu Specifikuje nepojmenovanou funkci. Obecný tvar: (LAMBDA seznam_proměnných forma) Př: ( (LAMBDA (X Y) (CONS X (LIST Y) ) ) 1 2) Objasněte schopnosti funkcionálního programu umožnit paralelní výpočet bez nutnosti zavádění speciálních konstrukcí pro paralelní zpracování. Popište elementární funkce Lispu. ================================================================================ Jmenujte a objasněte význam základních vlastností charakterizujících obj. orientované programování 1. Zapouzdřenost - data a procedury jsou společně umístěny ve struktuře zvané objekt komunikace zasíláním zpráv třída = šablona pro objekty obsah popisu třídy: jméno třídy, deklaraci lokálních a globálních proměnných, metody použitelné objekty při reagování na zprávy obsah zprávy: adresát, selektor (jméno metody = procedury) 2. Polymorfismus (tatáž zpráva může mít různé významy) 3. Dědičnost (Třídy mohou dědit data a operace od nadřazených tříd) Jak rozdělujeme obj.or. programovací jazyky. Uveďte příklady z jednotlivých skupin. 1. Hybridní (Turbo Pascal, C++, Java, Object Pascal, ADA95) Rozšíření imperativních a funkcionálních jazyků. 2. OO jazyky s typovým systémem (Simula, Eiffel) Objektově orientované principy sdružují s řídícími strukturami a s typovým systémem imperativních jazyků 3. Čisté OO jazyky (SMALLTALK) Bez typového systému. Zcela odlišné‚ od imperativních jazyků. Uveďte rozdíly mezi typem a třídou, proměnnou a objektem, podprogramem a metodou Metodou je procedura nebo funkce sdružená s třídou Objasněte význam pascalského identifikátoru Self dovoluje odkazovat na proměnné a metody vlastní třídy, např: procedure Lokalita.Init(); var X:integer; begin X := 5; Self.X := 10; {priradi do promenne X ve tride Lokalita} end; Vysvětlete význam a způsob použití konstruktoru v Pascalu ukazatel z CIR na TVM naplní speciální metoda - konstruktor Co je obsahem Class Instance Record Jaké‚ jsou výhody a jaké jsou nevýhody virtuálních metod? Zdůvodněte. zpomalují program (musí se vytvořit TVM a pak přistupovat přes ukazatele), výhody jsou jasné - polymorfismus Vysvětlete rozdíl mezi brzkou vazbou a opožděnou vazbou v OOP. Popište rozdíl mezi statickými a virtuálními metodami Metody jsou implicitně statické = brzká vazba - již při překladu je vytvořena vazba na tuto metodu Metody, které jsou označeny virtual = pozdní vazba - vazby jsou vytvořeny až při běhu programu v konstruktoru (TVM) Virtuální metody implementují polymorfismus (tatáž zpráva může mít různé významy) virtuální metodu použij tehdy, když je možné‚ že potomek P objektu O překryje tuto metodu jinou metodou a je potřebné, aby tato nová metoda byla přístupná jektu O. K čemu slouží a co je obsahem tabulky virtuálních metod obsahuje: údaj o velikosti objektu této třídy, pro každou virtuální metodu ukazatel na kód metody. slouží k realizaci polymorfismu ukazatel z CIR na TVM naplní speciální metoda - konstruktor Zapište obecný tvar objektového typu v Pascalu type Lokalita = object X,Y: integer; procedure Init(Xn,Yn:integer); function CtiX: integer; function CtiY: integer; end; K jakému účelu slouží destruktor? speciální metoda pro uvolnění dynamicky vytvořených objektů Jak řeší C++ problémy s násobnou dědičností? předek1 předek2 . . . . . . metoda A metoda A potomek . . . metoda A Řešení: -plným jménem (jméno předka :: ) -virtual předek1, virtual předek2 Zapište obecný tvar objektového typu v Javě [public|final|abstract] class JménoTřídy { proměnné třídy, mohou být i objektového typu metody třídy } Objasněte účel modifikátorů public, final, abstrakt v definici tříd jazyka Java public - veřejná final - třída, ze které už nejde vytvořit potomka abstrakt - určená pro vytváření potomků Popište odlišnost proměnných třídy a proměnných instance v jazyce Java -proměnné třídy - static -proměnné instance - mohou být private|public|protected Popište odlišnost final a abstract metod v jazyce Java -final metoda nemůže být překryta v potomkovi -abstract metoda musí být překryta v potomkovi Objasněte pojmy kompozice tříd a dědění tříd kromě dědění lze ze stávajících tříd vytvářet nové třídy kompozicí - proměnná může být objektového typu rozlišení: kompozice "má komponentu" dědičnost "je případem" class adresa { public string mesto, ulice; public int cislodomu; ... } class osoba { public string jmeno; public adresa bydliste; ... } Charakterizujte vizuální programování Uveďte nejvýznamnější rozdíly mezi objektovými vlastnostmi Pascalu, C++ a Javy Pascal: C++: private/public/protected, může být více konstruktorů, násobná dědičnost Java: metody jsou implicitně polymorfní, pouze jednoduchá dědičnost, garbage collector ================================================================================ Jaké jsou globální požadavky na programovací jazyk -spolehlivost (vyjímky, kontrola typů) -přenositelnost -dobre definovana syntaxe a semantika -citelnost,jednoduchost zapisu Které‚ vlastnosti jazyka jsou důležité pro bezpečnost jazyka vyjímky, kontrola typů Které‚ vlastnosti jazyka jsou důležité pro přenositelnost programu. Jaký je důvod možné nejednoznačnosti vyhodnocení výrazu f(x,z)* x v jakem poradi se vyhodnocuje -jazyky nedefinují pořadí vyhodnocování operandů Vysvětlete pojmy strukturální a jmenná ekvivalence typů 2 typy jsou kompatibilní jestliže se stejně jmenujou -||- mají stejnou strukturu packal: type type1 = array [1..10] of integer; 1) type2 = array [1..10] of integer; 2) type3 = type2; 3) 1) and 2) - not compatible 2) and 3) - compatible Jaké problémy mohou vznikat při konverzi real na integer a integer na real zaokrouhlení/useknutí, ztráta přesnosti Vysvětlete podstatu statického a dynamického rozsahu platnosti proměnných (scope of variables) (vazba typu na proměnnou) statické - známé ještě před spuštěním a během spouštění zůstává nezměněná dynamického - vytvářejí/mění se behěm spouštění Storage binding for variables -static -heap dynamic -stack dynamic Co to je "dangling pointer", uveďte příklad new(P1); P2 := P1; dispose(P1); now is P2 dangling pointer Jaké jsou přednosti a nevýhody použití ukazatelů efektivní práce s množstvím dat/snadná chyba Jaké‚ jsou zásady a prostředky strukturovaného programování? Uveďte charakteristické‚ vlastnosti modulárního programování. Jaký typový systém používá jazyk Pascal a jaký jazyk C? Pascal - silný typový systém, C - slabý Charakterizujte silný typový systém přísná kontrola datových typů při přiřazovnání/porovnávání/... Jaké vlastnosti má statické pole, pevné pole umístěné v zásobníku, a dynamické pole v zásobníku a na haldě. - Static - subscript ranges are constants, storage is allocated before run-time (Fortran77) - Fixed stack-dynamic - static subscript ranges, allocation is done at declaration elaboration time (Pascal procedure's arrays, arrays of C functions without the static specification) - Stack-dynamic - subscript ranges are dynamic, storage allocation is done during run-time. They remain unchanged during the lifetime of the array (ADA) - Heap-dynamic - subscript ranges and storage allocation are dynamic and can change during the array's lifetime. Co to jsou řezy a výřezy polí MAT(1:3,2) MAT(2:3,1:3) CUBE(1:3,1:3,2:3) Proč je pascalské řešení variantních záznamů nebezpečnou konstrukcí? ??? type R = record ... case RV : boolean of /*discriminated union*/ false : (i : integer); true : (ch : char) end; var V : R; ... V.RV := false; V.i := 2; V.RV := true; write(V.ch); Proč je řešení variantních záznamů Ady bezpečnou konstrukcí? Always allows type checking ==> perfectly safe Charakterizujte anonymní typy, případně uveďte příklad Proč ve starších verzích jazyka Fortran může docházet k přepisování konstant? Zdůvodněte, proč Pascal nemůže používat čistič paměti Jaké jsou možné způsoby a důsledky umisťování lokálních proměnných do paměti Local variables storage - Static + efficient (no indirect access, no run-time overhead) - inability to support recursion pre 90Fortrans, static declared locals in C and C++ - Stack dynamic + enables recursion + sharing of memory (today not too much important) - cost of allocation and deallocation - can not be history sensitive (retain data of locals between calls - E.g. pseudo-random numbers generation) Charakterizujte způsob volání parametrů "výsledkem" (by result) formal parameter acts as a local variable, but before return its value is passed to the actual parameter (out mode). Uveďte příklad, ve kterém volání parametrů odkazem způsobí, že dvě proměnné se stanou synonymy void fun(int *a, int *b){ ... } ... /* called */ fun(&c, &c); /* a,b shall be aliases in fun */ Vysvětlete způsob mělké vazby procedurálního parametru s prostředím Vysvětlete způsob hluboké vazby procedurálního parametru s prostředím procedure SUB1; var x : integer; procedure SUB2; begin write('x=', x); end; procedure SUB3; var x : integer; begin x := 3; SUB4(SUB2); end; procedure SUB4(SUBX); var x : integer; begin x := 4; SUBX end; begin x := 1; SUB3 end; 1) Shallow binding - the environment of the call statement (SUB4) is the valid -prints 4 2) Deep binding - the environment of the definition of the passed subprogram is the valid (SUB1) - prints 1 3) Ad hoc binding - the environment of the call statement that passed the subprogram as a parameter is valid (SUB3)- prints 3 Vysvětlete rozdíl mezi rozsahem viditelnosti a rozsahem existence proměnných programu Jaké podmínky musí být splněny při přetěžování podprogramů Overloaded subprograms must differ in - number or - order or - types of its parameters or - in returned type if it is a function Diskutujte odlišnosti modulů v jazycích Pascal, Ada, C++ a Java Vysvětlete rozdíl mezi ad hoc polymorfismem, parametrickým polymorfismem a polymorfismem v OOP. Diskutujte účel generických podprogramů a jejich základní charakteristiky v jazycích C++ a Ada Uveďte vlastnosti abstraktních datových typů a prostředky k jejich implementaci v jazycích C++, Java a Ada ================================================================================ Definujte pojem výjimečná situace a charakterizujte jejich jednotlivé druhy Výjimečná situace je neobvyklou událostí (chybovou či nechybovou), která je detekovatelná hardwarem či softwarem a vyžaduje speciální zpracování. Druhy výjimek: -vestavěné -uživatelské (definované uživatelem) Výjimka vzniká, nastane-li s ní asociovaná událost. Popište mechanismus šíření výjimek vyjimky.doc/2 Popište prostředky a mechanismus zpracování výjimek v jazyce C++ try { //programový text, ve kterém vzniká výjimka } catch (formalní parametr) { //příkazy ovladače } ... catch (formalní parametr) { --příkazy ovladače } -neošetřené výjimky se propagují do místa volání funkce, ve které výjimka vznikla. Propagace může pokračovat až do funkce main. Pokud ani tam není ovladač nalezen, program je ukončen. -všechny výjimky jsou uživatelské -výjimky jsou vyvolávány pouze explicitně příkazem throw [výraz]; //[ ] jsou metasymbol #include void Ftest(int fi) { cout << "jsem v Ftest:"<< fi << "\n"; if (fi) throw fi; } int main() { cout << "start\n"; try { cout << "jsem v try \n"; Ftest(0); Ftest(1); Ftest(2); } catch (int i) { cout << "zachycena hodnota:" << i << "\n"; } cout << "konec"; return 0; } Diskutujte odlišnosti zpracování výjimek v jazycích Java a C++ -všechny výjimky jsou objekty tříd, které jsou potomky třídy Throwable finally Objasněte význam klauzule finally jazyka Java -pro možnost provést "úklid" bez ohledu co se stane v příkazech konstrukce try, je zavedena klauzule finally tvaru: finally { příkazy úklidu } uvádí se za klauzulemi catch a její příkazy se provedou bez ohledu zda výjimka v throw vznikla/nevznikla, byla/nebyla ošetřena některým catch, či bude propagována. Uveďte výjimečné situace implicitně zavedené v jazyce Ada Předdefinované: CONSTRAINT _ERROR NUMERIC_ERROR STORAGE_ERROR TASKING_ERROR PROGRAM_ERROR Syntax: … begin příkazy exception when výjimka1 => příkazy when výjimka2 => příkazy … when výjimkaN => příkazy end; Popište rozdíl v použití přkazu raise; a raise jméno; jazyka Ada STACK_OVERFLOW : exception; if TOP = STACK_SIZE then raise STACK_OVERFLOW; Popište způsob deklarace a vyvolání uživatelem zavedené výjimky v jazyce ADA ================================================================================ Popište rozdíl mezi fyzickým a logickým paralelismem 1.Fyzický paralelismus (více procesorů pro více procesů) 2.Logický paralelismus (time-sharing jednoho procesoru, v programu je více procesů) 3.Kvaziparalelismus (korutiny) Popište funkci korutin paralelni.doc/2 Speciální druh podprogramů - volající a volaný nejsou v relaci "master slave". Jsou si rovni (symetričtí). Mají více vstupních bodů. Zachovávají svůj stav mezi aktivacemi. V daném okamžiku je prováděna jen jedna Popište rozdíl mezi komunikujícími a soutěžícími procesy. Uveďte slovní příklad komunikující (např. producent a konzument) soutěžící (např. o sdílený prostředek) Komunikující (konkurující?) prg. - jeden čeká na druhého, spolupracují Soutěžící - každěj celá to svý, čeká se na druhé jen při požadavku na sdílený zdroj (data) Charakterizujte pojmy vlákno, úkol, podprogram, korutina Vlákno (thread) výpočtu v programu je sekvence míst programu, kterými výpočet prochází. Úkol (task) je programová jednotka (část programu), která může být prováděna paralelně s ostatními částmi programu. Každý úkol může představovat jedno vlákno. Co to jsou kritické sekce programu a jakým způsobem je lze realizovat v jazyce ADA Části programu, které pracují ve vzájemném vyloučení se nazývají kritickými sekcemi. Nakreslete diagram přechodů mezi jednotlivými stavy úkolů Popište význam a princip semaforu a jeho možnou programovou realizaci. - jako fronta na latrine datová struktura obsahující čítač a frontu pro ukládání deskriptorů úkolů. Má dvě operace - zaber a uvolni (P a V). Je použitelný jak pro soutěžící, tak pro spolupracující úkoly. P a V jsou atomické operace P(semafor) /* binární*/ if semafor = 1 then semafor := 0 else pozastav volající proces a dej ho do fronty na semafor V(semafor) /* binární*/ if fronta na semafor je prázdná then semafor := 1 else vyber prvého z fronty a aktivuj ho slouží k synchronizaci paral. Procesů, vetsinou jako prom, pokud ma jen hodnoty 1,0, pak je binární operace zaber, uvolni Popište význam a princip monitoru 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ě. (Ada95, Java) - řídí přístup ke společným datům, povolí přístup jenom jednomu procesu Popište mechanismus rendezvous task ČIŠNÍK is task HOST1 is entry PIVO (X: in INTEGER); end HOST1; entry PLATIT; task body HOST1 is end ČIŠNÍK ; ČIŠNÍK.PIVO(2); task body ČIŠNÍK is --pije pivo --lokalni deklarace ČIŠNÍK.PLATIT; begin loop end HOST1; --blouma u pultu accept PIVO (X: in INTEGER) do --donese pivo end PIVO; --sbira sklenice akcept PLATIT do --inkasuje end PLATIT; end loop; end ČIŠNÍK ; dva procesy se musí domluvit…dát si schůzku:-)..např. když chce A komunikovat s B, tak mu to dá najevo a čeká, dokud B není schopen přijímat jeho komunikaci Popište syntax a sémantiku příkazu select jazyka ADA. Popište způsob použití a účel příkazu terminate v jazyce Ada Př. Sdílená proměnná realizovaná úkolem: task SDILENA is entry PUT(X: in INTEGER); entry GET(X: out INTEGER); end SDILENA; task body SDILENA is V: INTEGER; begin loop select --dovoli alternativni provedeni accept PUT(X: in INTEGER) do V := X; end PUT; or accept GET(X: out INTEGER) do X := V; end GET; or terminate; --umozni ukolu skoncit aniz projde koncovym end end select; end loop; end SDILENA; umožní ukončení úkolu,pokud je výpočet někde v příkazu select Kdy dochází v programu jazyka Ada k aktivaci úkolu? Kdy dojde v Java programu ke spuštění vlákna? Kdy dochází ke spuštění úkolu a) v ADE - když výpočet úkolu, který zpracovává jejich deklarace dosáhne begin za deklarační částí. b) v JAVE - asi když se zavolá run a start Jaké metody poskytuje třída Thread Javy pro práci s paralelními aktivitami a jaká je jejich funkce? Java threads Paralelně proveditelné jednotky jsou objekty s metodou run, jejíž kód může být prováděn souběžně s jinými takovými metodami a s metodou main. Jak definovat třídy, jejichž objekty mohou mít paralelně prováděné metody 1. jako podtřídy třídy Thread 2. zděděním rozhraní runnable od rodiče a jeho implementací Každé vlákno je instancí třídy java.lang.Thread nebo jejího potomka Thread má metody: " 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 " sleep(milisec) zablokování vlákna na daný čas. interval stavy vláken: " nové " připravené " běžící " blokované " mrtvé Jaké jsou prostředky Javy, pro práci s kritickými sekcemi, popište jejich funkci. " metody s označením synchronized Uveďte příklad paralelismu na úrovni příkazů programovacího jazyka High Performance Fortran REAL DIMENSION (1000, 1000) :: A, B INTEGER I, J DO I = 2, N DO J = 1, I - 1 A(I, J) = A(I, J) / A(I, I) END DO END DO FORALL (I = 2 : N, J = 1 : N, J .LT. I ) A(I, J) = A(I, J) / A(I, I) FORALL představuje zobecněný přiřazovací příkaz (a ne smyčku) FORALL lze použít, pokud je zaručeno, že výsledek seriového i paralelního zpracování budou identické. ================================================================================ otazky ke zkousce zpichnul jsem to za den => ~kvalita~ vylepseni jsou vitane maco