Procházet otázky :: SZZ na MFF UK

#

- Hlavní strana
- Okruhy
- Projít
- Stáhnout
- Co je potřeba
- Chci přispět
- Kredity

Hledat:

## Prohlížení státnicových textů

### Datové a řídící struktury vyšších programovacích jazyků a jejich implementace

Řízení toku

In computer science control flow (or alternatively, flow of control) refers to the order in which the individual statements, instructions or function calls of an imperative or functional program are executed or evaluated. Within an imperative programming language, a control flow statement is an instruction that when executed can cause a change in the subsequent control flow to differ from the natural sequential order in which the instructions are listed. For non-strict functional languages, functions and language constructs exist to achieve the same ends, but they are not necessarily called control flow statements.

The kinds of control flow statements available differ by language, but can be roughly categorized by their effect:

- continuation at a different statement (jump),
- executing a set of statements only if some condition is met (choice - if-then-else)
- executing a set of statements zero or more times, until some condition is met (loop), s podmínkou na začátku, na konci, uprostřed, nekonečné, s daným počtem opakování
- executing a set of distant statements, after which the flow of control may possibly return (subroutines, coroutines, and continuations),
- stopping the program, preventing any further execution (halt).

Interrupts and signals are low-level mechanisms that can alter the flow of control in a way similar to a subroutine, but are usually in response to some external stimulus or event rather than a control flow statement in the language.

Výjimky

Výjimky jsou speciálním příkazem řízení toku, vyskytujícím se v některých vyšších programovacích jazycích. Základní myšlenkou je, že program může na nějakém místě vyhodit výjimku (příkaz `throw`), což způsobí, že provádění programu se zastaví a buď pokračuje tam, kde je výjimka ošetřena (tzv. `catch` blok), nebo pokud takové místo není nalezeno, program skončí s chybou. Během hledání místa ošetření je datová hodnota výjimky uložena stranou a pak může být použita.

Při hledání místa ošetření výjimky (`try`-bloku, následovaného catch-blokem se správným datovým typem výjimky) se postupuje zpět po zásobníku volání funkcí, tato technika se nazývá stack unwinding (odvíjení zásobníku). V některých jazycích (Java) lze definovat i akci, která se provede v každém případě, i pokud nastane výjimka, ještě před odvíjením zásobníku - `finally` blok.

Volací konvence

Při volání procedur a funkcí je nejdůležitější zásobník. Ukládá se na něj

- kam se vrátit po volání
- argumenty funkce (v překladem definovaném pořadí - nutné mít ve všech modulech stejné; většinou se liší v závislosti na programovacím jazyku)
- návratová hodnota funkce
- ukazatel na sémanticky nadřazenou funkci (Pascal)

Dohromady všem těmto datům se někdy říká aktivační záznam procedury. Po skončení funkce je nutné zásobník opět uklidit (vymazat zbytečná uložená data, většinou jen zůstává návratová hodnota) a která část programu to dělá (volaná nebo volající procedura), závisí opět na překladači a konvenci jazyka.

Volací konvence dvou nejtypičtějších jazyků:

- Pascal
  uklízí volaná funkce, argumenty se ukládají na zásobník zleva doprava (nejlevejší nejdřív, tj. nejhlouběji)
- C
  uklízí funkce volající, argumenty se ukládají zprava doleva (tj. nejlevější je na vrcholu zásobníku. Je to kvůli funkcím s proměnným počtem parametrů. Volaná funkce musí podle prvního argumentu poznat, jaký je skutečný počet argumentů. Kdyby byl první argument někde hluboko v zásobníku, tak ví prd.)