Proměnná (programování)

Popis, údaj,popis akce

Proměnná je v programování označení pro identifikátor (symbolické jméno), které uchovává určitou informaci při běhu programu. Proměnná může nabývat známých nebo neznámých informací, které se nazývají hodnota. Jméno proměnné je obvyklá cesta k získání reference k uložené hodnotě v paměti počítače. Separace jména a obsahu umožňuje použít jméno, které se používá nezávisle na přenesené informaci, kterou zastupuje. Identifikátor ve zdrojovém kódu zastupuje nějakou hodnotu, která se za běhu programu může měnit.

Proměnné v programování nemusejí přímo korespondovat s konceptem proměnných v matematice. Hodnota v počítačové proměnné nemusí být nezbytně část matematické rovnice či vzorce. Proměnné mohou být použity v opakujících se procesech: přiřazena hodnota v jednom místě programu, poté použita v jiné části programu a pak může být přiřazena úplně nová hodnota a celý proces se může opakovat stejnou cestou (iterace). Proměnným v počítačovém programování jsou většinou nazývány dlouhými názvy tak, aby bylo z názvu patrné k čemu slouží, na rozdíl od proměnných v matematice, kde jsou obvykle nazvány jedním či dvěma znaky pro jasnou stručnost zápisu.

Úložiště proměnných může být odkazováno několika různými identifikátory, tato situace je známá jako aliasing. Přiřazení hodnoty do proměnné pomocí jednoho z identifikátorů změní hodnotu, která je přístupná prostřednictvím jiných identifikátorů.

Překladač musí nahradit symbolická jména proměnných za skutečné umístění dat. Zatímco jméno proměnné, typ a lokace jsou často neměnná (pevná) tak data uložená v proměnné mohou být změněna za chodu programu.

Práce s proměnnými

V imperativních programovacích jazycích může být hodnota globálně adresována nebo změněna v jakémkoliv čase. V čistě funkcionálních a logicky zaměřených jazycích jsou proměnné omezeny na jeden výraz a hodnoty si udržují po celou dobu svého životního cyklu kvůli požadavkům na referenční transparentnost. V imperativních jazycích je stejného chování dosaženo pomocí konstant, které se chovají opačně než normální proměnné.

Identifikátory odkazující na proměnné

Identifikátor odkazující na proměnnou může být použit k přístupu k proměnné, aby mohla být čtena či změněna její hodnota nebo její atributy jako jsou přístupová práva, zámky, semafory, atd.

Například, na proměnnou může být odkazováno identifikátorem „total_counts“ a proměnná může obsahovat číslo 1956. Pokud bude na stejnou proměnnou odkazováno také identifikátorem „x“ a použitím tohoto identifikátoru „x“ bude hodnota změněna na 2009, pak čtení pomocí identifikátoru „total_counts“ vrátí také hodnota 2009, nikoliv 1956.

Pokud na proměnnou odkazuje pouze jeden identifikátor, může být proměnná volána klasický jménem proměnné, případně můžeme volit mezi větším množstvím jmen proměnné. V ukázce výše může být například proměnná volána jak jménem „x“, tak jménem „total_counts“.

Typová kontrola proměnné

Podrobnější informace naleznete v článku Typová kontrola.

V jazycích se statickou typovou kontrolou jako jsou Java nebo ML, má proměnná vždy určitý typ. To znamená, že proměnná může nabývat hodnot pouze v určitém rozsahu a pouze určité hodnoty může uchovávat. Například proměnnou typu integer nemůžeme použít k uchování řetězců.

V jazycích s dynamickou typovou kontrolou jako je například Python, jsou to hodnoty, ne proměnné, které mají svůj typ. V jazyce Common Lisp obě situace existují souběžně. Proměnné je určen typ (pokud není deklarován, předpokládá se typ T, což je univerzální super typ) který existuje v době kompilace. Hodnoty mají také typy, které jsou kontrolovány až za běhu programu.

Typová kontrola proměnné známá také jako polymorfismus je určena až za běhu programu. Toto chování je však rozdílné od polymorfismu použitém ve volání funkcí objektově orientovaných jazyků (například virtuální funkce jazyka C++), které určují volání konkrétní funkce na základě daného typu proměnné.

Proměnné zpravidla uchovávají jednoduché údaje jako čísla nebo řetězce. Některé programovací jazyky však umožňují do proměnné uložit také hodnoty jiných datových typů. Takové jazyky mohou současně funkcím umožňovat parametrický polymorfismus. Takové funkce se chovají jako proměnné, ale reprezentují data více datových typů. Například funkce nazvaná „délka“ může popisovat délku listu. Avšak funkce „délka“ musí být parametricky polymorfní, aby mohla být schopna udat délku listu, který je nezávislý na datovém typu svých elementů.

Jmenná konvence

Na rozdíl od matematických výrazů, v programování mohou proměnné mít zpravidla více znaků, jako například „COUNT“ nebo "total". Proměnné, jejichž název má pouze jeden znak, jsou často používány jako iterační (například i, j, k) nebo proměnné používané jako index pole.

Některé jmenné konvence jsou již součástí syntaxe jazyka a ovlivňují platnost proměnné. Skoro ve všech jazycích nemohou jména proměnných začínat číslem či nemohou obsahovat mezery. Některé jazyky současně neumožňují, aby proměnná začínala interpunkčním znakem (jediným platným znakem bývá podtržítko („_“). Interpunkční znaky se nemohou objevovat ani nikde v názvu proměnné.

Rozlišování malých a velkých písmen se také liší jazyk od jazyka. Některé (zpravidla starší) programovací jazyky nerozlišují použitou velikost písmen, avšak většina moderních jazyků ano (pro příklad proměnná „počet“ a „Počet“ se liší).

Ve výsledku však bývá rozlišování malých a velkých písmen pouze otázkou vkusu či programátorského stylu. Na úrovní strojového kódu nejsou proměnné používány vůbec, takže používání proměnných je pouze pomůckou pro programátory, aby učinily kód čistším a snadnějším na pochopení. Použitím nevhodně nazvaných proměnných se kód stává hůře čitelným.

Alokace paměti

Specifikace alokace proměnných a jejich reprezentace hodnot se značně liší a to jak v různých programovacích jazycích, tak i v implementaci daného jazyka. Mnoho jazykových implementací alokuje místo pro lokální proměnné, jejich existence je omezena na jediné volání dané funkce na zásobníku a jehož paměť je automaticky uvolněna pokud funkce vrátí návratovou hodnotu. Více obecně je jméno proměnné přiřazeno na adresu konkrétního bloku v paměti (souvisle sekvence) a operace na této proměnné manipulují pouze s tímto blokem paměti. Reference jsou obvyklejší pro proměnné jejichž hodnoty jsou příliš velké nebo neznámé velikosti, prováděné při kompilaci kódu. Tyto typy proměnných jsou alokovány z fondu paměti, která je nazývaná halda. Hodnota je nicméně abstrakce, idea: v implementaci je hodnota reprezentována nějakým datovým objektem, který je uložen kdesi v počítačové paměti. Program nebo běhové prostředí musí vyčlenit, pro každý datový objekt místo v paměti a protože paměť je konečná, musí zajistit stav kdy proměnná není již potřeba a v tom případě může být vyčleněné místo v paměti znovu použito jinou proměnnou.

Proměnné alokované na haldě musí byt uvolněny, zvláště v případě pokud už uložené objekty nejsou potřeba. V programovacích jazycích, kde existuje garbage collector (C#, Java, Lisp atd.) musí běhové prostředí automaticky uvolňovat objekty, když se k nim už existující proměnné neodkazují. V jazycích, které nevyužívají (nemají) garbage collector, jako C se programátor musí sám starat o uvolňování paměti. Pokud takto programátor neučiní, nedochází k uvolňování paměti a halda se dostane do stavu vyčerpání, kde hrozí riziko pádu programu z nedostatku paměti.

Reference

V tomto článku byl použit překlad textu z článku Variable (computer science) na anglické Wikipedii.

Související články

Média použitá na této stránce

Premenna.jpg
Autor: Fúzač Červený, Licence: CC BY-SA 4.0
Grafické znázornenie konceptu premennej