Sdílení dat mezi podprogramy

Podobné dokumenty
Struktura programu v době běhu

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

NPRG030 Programování I, 2015/16 1 / :25:32

Programování v C++ 2, 4. cvičení

dovolují dělení velkých úloh na menší = dekompozice

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

PODPROGRAMY PROCEDURY A FUNKCE

Maturitní otázky z předmětu PROGRAMOVÁNÍ

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Programovací jazyk Pascal

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Zpracování deklarací a přidělování paměti

Sada 1 - Základy programování

Více o konstruktorech a destruktorech

Základy objektové orientace I. Únor 2010

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Konstruktory a destruktory

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

ALGORITMIZACE A PROGRAMOVÁNÍ

Algoritmizace prostorových úloh

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

ADT/ADS = abstraktní datové typy / struktury

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Elementární datové typy

8 Třídy, objekty, metody, předávání argumentů metod

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Základní datové struktury

Úvod do programovacích jazyků (Java)

Výčtový typ strana 67

Úvod do programování

PB161 Programování v jazyce C++ Přednáška 7

10 Balíčky, grafické znázornění tříd, základy zapozdření

PB161 Programování v jazyce C++ Přednáška 7

Seminář Java II p.1/43

Pointery II. Jan Hnilica Počítačové modelování 17

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Odvozené a strukturované typy dat

Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Abstraktní datové typy: zásobník

Ukazka knihy z internetoveho knihkupectvi

14. Složitější konstrukce

O datových typech a jejich kontrole

7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programování v C++ 1, 5. cvičení

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

Algoritmizace prostorových úloh

NMIN102 Programování /2 Z, Zk

Šablony, kontejnery a iterátory

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

Datové abstrakce v programovacích jazycích

Sémantika Tabulka symbolů Intermediální kód Typová kontrola, přetypování Statická a dynamická sémantika. Sémantická analýza.

IRAE 07/08 Přednáška č. 1

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Jazyk PL/SQL Úvod, blok

Jazyk C++ II. Šablony a implementace

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

PREPROCESOR POKRAČOVÁNÍ

Programování v jazyce C a C++

Unity a Objekty (NMIN102) RNDr. Michal Žemlička, Ph.D.

Programování II. Návrh programu I 2018/19

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Funkce, intuitivní chápání složitosti

DUM 06 téma: Tvorba makra pomocí VBA

Objektové programování

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

PŘETĚŽOVÁNÍ OPERÁTORŮ

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Lineární datové struktury

Jazyk C++, některá rozšíření oproti C

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

Anotace. Pointery. Martin Pergel,

Šablony, kontejnery a iterátory

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Abstraktní třídy, polymorfní struktury

Objektově orientovaný přístup

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Programování II. Třídy a objekty (objektová orientovanost) 2018/19

Viditelnost (práva přístupu) Tomáš Pitner, upravil Marek Šabo

Název předmětu: Školní rok: Forma studia: Studijní obory: Ročník: Semestr: Typ předmětu: Rozsah a zakončení předmětu:

Abstraktní datové typy

Programování II. Polymorfismus

Programování v C++ 1, 6. cvičení

Příloha: Dodatečné informace, včetně přesného znění žádosti dodavatele o dodatečné informace

Inovace a zkvalitnění výuky prostřednictvím ICT Programování se strukturovanými údaji Programové jednotky

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Jazykové konstrukce pro paralelní výpočty

Generické programování

Dědění, polymorfismus

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

Transkript:

Sdílení dat mezi podprogramy Datové objekty mohou být mezi podprogramy sdíleny pomocí ne-lokálních referenčních prostředí, která jsou vytvářena na základě æ explicitních modifikací (formální parametry funkcí, explicitně sdílená prostředí) æ implicitních pravidel (statického a dynamického rozsahu, dědičnosti) Parametry a jejich předávání æ Formální parametr je lokální datový objekt volaného podprogramu. Seznam formálních parametrů ajejichtypů je obvykle součástí definice podprogramu. æ Skutečný parametr je datový objekt volajícího podprogramu, uvedený v příkazu pro aktivaci voláné funkce. Může to být lokální datový objekt, ne-lokální datový objekt, formální parametr, výraz,... Korespondence mezi lokálními a globálními parametry je obvykle uřcena pořadím zápisu (pozicí). ADA navíc umožňuje explicitní specifikaci: SUB(int X; char Y);. SUB(Y => B, X => 27); Metody předávání parametrů æ Volání jménem Sémantiku podprogramu lze definovat pomocí textové substituce skutečného parametru za formální parametr v těle podprogramu. Přenést je ovšem potřeba i referenční prostředí z jednoho podprogramu do druhého, nebot skutečný parametr může obsahovat proměnné. Extrémně náročná implementace. Kompilátor pro každý parametr P předávaný jménem vytvoří bezparametrickou funkci, která ho počítá (zvlášt pro každé volání!) Dochází k opakovanému vyhodnocování skutečného argumentu. 47

Pokud skutečný parametr obsahuje proměnné, které jsou definovány v podprogramu, je ťreba řešit nejednoznačnosti. Z teoretického hlediska jde o velmi silný a obecný mechanismus. æ Volání hodnotou Skutečný argument se nejprve v režii volajícího vyhodnotí. Tato hodnota je uložena do společné pamět ové oblasti, ke které má přístup rovněž volaný. Řízení je pak předáno podprogramu, který hodnoutu vyzvedne a přiřadí formálnímu parametru. V praxi se hodnoty skutečných parametrů předávají přes zásobník a jsou součástí aktivačního záznamu volajícího. Volaný k těmto hodnotám přistupuje přímo (na základě znalosti počátku svého aktivačního záznamu a velikosti a pořadí parametrů při kompilaci je možno určit, jak hluboko jsou jednotlivé hodnoty skutečným parametrů pod aktivačním záznamem volaného podprogramu. Zodpovědnost za odstranění formálních parametrů může mít jak volající (C), tak volaný (Pascal). První způsob umožňuje snadno předávat proměnlivý počet parametrů (printf). æ Volání odkazem Tento mechanismus je velmi podobný volání hodnotou; jediný rozdíl je v tom, že se nepředává r-hodnota, ale l-hodnota (ukazatel). Obvykle jsou kladena jistá omezení na ťrídu datových objektů, jejichž l-hodnotu lze tímto způsobem předat. Jazyk C interně implementuje pouze volání hodnotou. Volání odkazem však lze snadno simulovat pomocí operací &,*. æ Volání hodnotou-výsledkem Hodnoty parametrů se volanému podprogramu předají hodnotou. Po dokončení běhu podprogramu se modifikované hodnoty formálních parametrů zpětně okopírují do skutečných parametrů. Platí podobná omezení na ťrídu skutečných parametrů, které lze tímto způsobem předat, jako v případě volání odkazem. 48

Za normálních okolností má volání hodnotou-výsledkem stejnou sémantiku, jako volání odkazem. Implementační rozdíl spočívá v tom, že volající musí navíc zajistit zpětné okopírovaní hodnot formálních parametrů po té, kdy volaný podprogram doběhne. æ Volání výsledkem Používásepropředávání hodnot z podprogramu pomocí parametrů. Formální parametry se pak nesmí používat na pravé straně přiřazovacích příkazů, hodnota skutečných parametrů před vyvoláním podprogramu je nepodstatná. Programátor má k dispozici konstrukty, které umožňují specifikovat způsob předávání parametrů. Odlišná filozofie byla zvolena v jazyce ADA; neurčuje se způsob předávání, ale role parametru, která může být trojí: æ Pouze vstupní (in). æ Pouze výstupní (out). æ Vstupně-výstupní (in out). Původní norma jazyka ADA (83) neurčovala, zda se in a out parametry mají předávat odkazem, hodnotou, výsledkem, nebo hodnotouvýsledkem. Důsledkem bylo, že správné programy dávaly různé výsledky po kompilaci na dvou různých správných kompilátorech. Norma byla revidována. Explicitní hodnoty funkcí Většina jazyků povoluje funkcím pouze jeden explicitní výsledek. Mechanismus pro jeho předání může být na úrovni jazyka různý (C vs. Pascal). Vždy je však možné se na explicitní hodnotu funkce dívat jako na speciální parametr předávaný výsledkem. Explicitně sdílená prostředí Skupina deklarací, která může být sdílena různými podprogramy. Příkladem je package v jazyce ADA: 49

package Shared_Tables is Tab_Size: constant integer := 100; type Table is array (1..Tab_Size) of real; Table1, Table2: Table; Curr_Entry: integer range 1..Tab_Size; end Podprogram P pak může tento balík deklarací využít pomocí příkazu with Shared_Tables. Uvnitřtěla P pak např. lze používat proměnnou Shared_Tables.Table1. Specifikátor Shared_Tables lze dále vynechat po provedení příkazu use Shared_Tables. Implementace je podobná jako u globálních záznamů. Explicitní sdílení proměnných Každý podprogram může exportovat některé ze svých lokálních proměnných okolnímu světu. Příkladem je konstrukt define: procedure P(...); defines X,Y,Z; X,Y,Z: real; U,V: integer; begin...end; Procedura Q pak může používat exportované proměnné X,Y,Z: procedure Q(...); uses P.X,P.Z; Y: integer; begin...end; Tento model je v omezené formě implementován také v C (extern). 50

Dynamický rozsah S každým podprogramem P lze spojit ne-lokální referenční prostředí na základě pravidel dynamického rozsahu. Pokud X není uvniťr P deklarováno, prochází se posloupnost aktivačních záznamů podprogramů, které vedly k vyvolání P. Hledá se tak asociace pro X, která byla vytvořena naposled. æ Různé aktivace P mohou mít různá ne-lokální prosťredí. æ Pamět ová reprazentace proměnných musí zahrnovat rovněž identifikátor. æ Nutnost dynamické typové kontroly æ Implementace bývá dvojí: Procházením zásobníku aktivačních záznamů. Pomocí globální tabulky platných asociací. Statický rozsah Pokud je ne-lokální prostředí podprogramu určeno podle pravidel statického rozsahu, je obvykle stejné při všech aktivacích P. Umístění nelokální proměnné v paměti však není jednoduché zjistit. Je ťreba dynamicky udržovat informaci o umístění aktivačních záznamů staticky nadřazených podprogramů. Implementovat to lze následovně: æ Každý aktivační záznam bude navíc obsahovat ukazatel na aktivační záznam staticky nadřazené procedury. Ne-lokální prosťredí je pak tvořeno lokálními prostředími aktivačních záznamů, které lze dosáhnou přes tyto ukazatele. Každá ne-lokální asociace je pak dosažitelná na konstantní počet přístupů (uvedená konstanta závisí na statické hloubce programu. æ Pomocí dynamicky udržované globální tabulky konstantní velikosti, obsahující ukazatele na staticky nadřazené podprogramy vždy pro ten podprogram, jehož aktivační záznam je na vrcholu zásobníku. 51

Tato tabulka se obvykle nazývá displej. Jelikož pro každou proměnnou X se dá určit nejbližší staticky nadřazený podprogram, obsahující deklaraci pro X, již během kompilace, umožňuje displej nalézt příslušný aktivační záznam na jediný přístup. Deklarace v lokálních blocích Používá se v jazyce C; umožňuje zmenšit velikost paměti potřebné pro lokální proměnné. 52

Dědičnost Specifikace abstraktního datového typu je na úrovni jazyka obvykle rozdělena na dvě části: æ Popis veřejné části (záhlaví). Obsahuje typy, datové objekty a hlavičky funkcí, které jsou z vnějšku viditelné. æ Popis implementace veřejné části (tělo). Zde se mohou objevit další typy, datové objekty i funkce, které jsou však již z vnějšku nedostupné. Datové objekty bývají uvedeny v záhlaví, právě když mají být navenek dostupné. Viditelné funkce mají v záhlaví signaturu, jejich definice však bývá téměř vždy v těle (vyjímkou je C++, kde definovaní funkce v záhlaví má podobný efekt jako modifikátor inline). U typů je situace složitější. V principu je možné definici viditelných typů uvést jak v záhlaví, tak v těle souvisí to s implementací, zejména s možností separátní kompilace. Jsou možné dva přístupy: æ Přímé zapouzdření. Pokud abstraktní datový typ A obsahuje datový objekt P abstraktním datového typu B, bude při deklaraci objektu Q typu A vymezena také pamět pro uložení P jako součást paměti pro Q (tj. P je uvnitř Q). Tomu se uzpůsobí též implementace operace přístupu ke komponentě, která bude velmi rychlá. Nevýhodou je, že jakákoliv změna v abstraktním datovém typu B si vynutí překompilování kódu, který používá typ A. æ Nepřímé zapouzdření. V situaci popsané výše se při deklaraci Q vymezí místo jen na ukazatel a vytvoří se separátní datový objekt typu A. Ukazatel uvnitř Q se inicializuje na adresu tohoho objektu. Výhody a nevýhody jsou komplementární. ADA preferuje přímé zapouzdření (tedy výkon). Definice typů protobývají součást záhlaví. Je však možné simulavat také nepřímé zapouzdření: 53

package A is type MyStack is private; procedure NewStack(S: out MyStack);... private type MyStackRep; skryté detaily implementace typu MyStack type MyStack is access MyStackRep; typmystack je tedy ukazatel na MyStackRep end; package body A is;... end; Generické abstraktní datové typy Většina jazyků obsahuje několik vestavěných generických abstraktních typů; příkladem je array nazákladě dodaného typu a rozsahu indexů se vytvoří nový datový typ. ADA a C++ podporují vytváření uživatelských abstraktních datových typů: 54

generic type Elem is private; package AnyStackType is type Stack(Size: Positive) is private; procedure Push(I: in Elem; S: in out Stack); procedure Pop(I: out Elem; S: in out Stack); private type Stack(Size: Positive) is record StkStorage: array(1..size) of Elem; Top: integer range 0..Size := 0; end record; end AnyStackType; package body AnyStackType is procedure Push(I: in Elem; S: in out Stack) is begin... end; procedure Pop(I: in Elem; S: in out Stack) is begin... end; end AnyStackType; Abstraktní datový typ zásobník hodnot typu integer pak lze definovat jako package IntStackType is new AnyStackType(elem => integer); Implementace je přímočará generický abstraktní datový typ sám o sobě negeneruje žádný kód. Jeho instance vzniknou dosazením konkrétního typu (jde v podstatě o makrodefinici). Problém je, že pro každou novou instanci vznikne úplně nové sada funkcí, které jsou podobné. 55