Handle
Handle (překládáno též jako madlo nebo rukojeť) označuje v programování pomocný objekt bez známé vnitřní struktury, který reprezentuje nějaký složitější objekt spravovaný cizím kódem. Vnitřně může být handle reprezentován ukazatelem nebo referencí na cílový objekt, číslem odkazujícím do tabulky, struktura přímo obsahující příslušná data atd., z hlediska aplikačního programu však tato vnitřní struktura není známa a handle je „neprůhledný objekt“, který je pouze předáván mezi volanými funkcemi API. Příkladem použití je handle otevřeného souboru – při otevření souboru získá program od operačního systému handle na tento soubor, který předává všem funkcím pracujícím s tímto souborem. Pro program handle tento otevřený soubor reprezentuje a jeho prostřednictvím může získat o tomto souboru informace, či se souborem pracovat; přesný obsah a struktura informací uložených v handlu samém však programu nejsou známy.
Účel a výhody
editovatExistuje několik důvodů, proč byla tato technika vůbec zavedena. Její hlavní výhodou je tzv. zapouzdření (tento koncept byl o něco později rozvinut v tzv. objektově orientovaném programování) – oddělení vnějšího chování a rozhraní nějakého objektu od jeho vnitřní struktury. Toto striktní oddělení umožňuje v případě potřeby změnit „vnitřek objektu“ – jeho vnitřní reprezentaci a implementaci – aniž by na takovou změnu museli uživatelé objektu jakkoli reagovat, ba dokonce si uživatelé nemusí této změny ani všimnout.
Třeba v příkladu handle na otevřený soubor si lze představit, že přesná struktura informací, které si operační systém potřebuje udržovat, může záviset na konkrétním systému souborů, na kterém se soubor nachází. Pokud by se tedy nepoužíval handle, musel by program konkrétně podporovat všechny požadované souborové systémy.
Využití
editovatMezi typická využití handlů patří:
- otevřený soubor – souborový deskriptor
- komunikační kanál – socket, roura apod.
- synchronizační primitivum – semafor, zámek apod.
- proces, vlákno
- uživatelská oprávnění – viz též lístek
- paměť – výhodou místo použití běžného ukazatele je možnost měnit fyzické umístění přidělené paměti v adresovém prostoru (tzv. movable paměť, běžná např. v 16bitových Windows; viz též segmentace paměti)
- okno či jiný objekt grafického rozhraní či window manageru
Vnitřní reprezentace a práce s handly
editovatHandle je zpravidla jen malý objekt, nejčastěji se jedná o 32bitovou hodnotu; v některých případech se však formálně jako handle může používat celá datová struktura, u které pouze není dovoleno její přímé použití programem. Implementací handlu může být obvykle buď přímo ukazatel na odpovídající větší datovou strukturu, nebo identifikační číslo položky v tabulce spravovaných objektů. V silně typovaných jazycích může být i sama vnitřní struktura handlu před programem skryta (a jediné, co programovací jazyk dovolí, je hodnotu opravdu jen předávat volaným funkcím).
Handle obvykle platí jen pro proces, kterému byl přidělen, v některých případech je dokonce dovoleno handle využívat jen z vlákna, kterému bylo přiděleno. Operační systém či příslušná knihovna však mohou poskytovat prostředky, jak jinému procesu umožnit pracovat se stejným objektem – jak handle zduplikovat. Některé handly také může proces zdědit od procesu, který jej vytvořil.
Pomocí zpětného inženýrství se často programátorovi může podařit zjistit vnitřní reprezentaci handlu, což poté může využít k přímému přístupu k reprezentovanému objektu a případně s ním pracovat způsobem, který jinak poskytované rozhraní nenabízí. Takové využití však neguje všechny výše zmíněné výhody a vede k nefunkčnosti programu ve chvíli, kdy knihovna tuto vnitřní reprezentaci změní.