Proměnná (počítačová věda) - Variable (computer science)

V počítačovém programování je proměnná nebo skalární abstraktní umístění úložiště spárované s přidruženým symbolickým názvem , které obsahuje určité známé nebo neznámé množství informací označované jako hodnota ; nebo jednoduše řečeno, proměnná je kontejner pro konkrétní sadu bitů nebo typ dat (jako celé číslo, float, řetězec atd ...). Proměnná může být nakonec přidružena nebo identifikována adresou paměti . Název proměnné je obvyklý způsob, jak odkazovat na uloženou hodnotu, kromě odkazu na samotnou proměnnou, v závislosti na kontextu. Toto oddělení jména a obsahu umožňuje použití názvu nezávisle na přesných informacích, které představuje. Identifikátor ve zdrojovém kódu počítače může být vázán na hodnotu během běhu a hodnota proměnné se tak může v průběhu provádění programu měnit .

Proměnné v programování nemusí přímo odpovídat pojmu proměnných v matematice . Ten je abstraktní , bez odkazu na fyzický objekt, jako je umístění úložiště. Hodnota výpočetní proměnné nemusí být nutně součástí rovnice nebo vzorce jako v matematice. Proměnné v počítačovém programování často dostávají dlouhá jména, aby byly relativně popisné pro jejich použití, zatímco proměnné v matematice mají často stručné, jedno- nebo dvouznakové názvy pro stručnost při přepisu a manipulaci.

Na umístění úložiště proměnné může odkazovat několik různých identifikátorů, což je situace známá jako aliasing . Přiřazení hodnoty proměnné pomocí jednoho z identifikátorů změní hodnotu, ke které lze přistupovat prostřednictvím ostatních identifikátorů.

Kompilátory musí nahradit symbolická jména proměnných skutečným umístěním dat. Zatímco název, typ a umístění proměnné často zůstávají pevné, data uložená v umístění lze během provádění programu změnit.

Akce na proměnné

V imperativních programovacích jazycích lze k hodnotám obecně přistupovat nebo je kdykoli měnit . V čistě funkčních a logických jazycích jsou proměnné vázány na výrazy a udržují jedinou hodnotu po celou dobu své životnosti kvůli požadavkům referenční transparentnosti . V imperativních jazycích stejné chování vykazují (pojmenované) konstanty (symbolické konstanty), které jsou obvykle v kontrastu s (normálními) proměnnými.

V závislosti na typovém systému programovacího jazyka mohou proměnné ukládat pouze zadaný datový typ (např. Celé číslo nebo řetězec ). Alternativně může být datový typ spojen pouze s aktuální hodnotou, což umožňuje jedné proměnné uložit cokoli, co podporuje programovací jazyk.

Proměnné jsou kontejnery pro ukládání hodnot.

Proměnné a rozsah:

  • Automatické proměnné : Každá lokální proměnná ve funkci vzniká, pouze když je funkce vyvolána, a zmizí, když je funkce ukončena. Takové proměnné jsou známé jako automatické proměnné.
  • Externí proměnné: Jedná se o proměnné, které jsou externí pro funkci a lze k nim přistupovat jménem podle jakékoli funkce. Tyto proměnné trvale existují; spíše se objevují a mizí, když jsou funkce volány a opouštěny, si zachovávají své hodnoty i poté, co se funkce, které je nastavily, vrátily.

Identifikátory odkazující na proměnnou

Identifikátor odkazující na proměnnou lze použít k přístupu k proměnné za účelem načtení hodnoty nebo změnu hodnoty nebo úpravu dalších atributů proměnné, jako je přístupové oprávnění, zámky , semafory atd.

Například na proměnnou může odkazovat identifikátor " total_count" a proměnná může obsahovat číslo 1956. Pokud na stejnou proměnnou odkazuje také identifikátor " r" a pokud používá tento identifikátor " r", hodnota proměnné je změněno na rok 2009, potom načtení hodnoty pomocí identifikátoru " total_count" přinese výsledek roku 2009 a ne 1956.

Pokud na proměnnou odkazuje pouze jeden identifikátor, lze tento identifikátor jednoduše nazvat názvem proměnné ; jinak o tom můžeme mluvit jako o jednom z názvů proměnné . Například v předchozím příkladu je identifikátor " total_count" názvem příslušné proměnné a " r" je jiný název stejné proměnné.

Rozsah a rozsah

Rozsah proměnné popisuje, kde se v textu programu, může být použita proměnná, zatímco rozsah (nazývaný také životnost ) proměnné popisuje, kdy při realizaci programu, je proměnná má (smysluplnou) hodnotu. Rozsah proměnné ovlivňuje její rozsah. Rozsah proměnné je ve skutečnosti vlastností názvu proměnné a rozsah je vlastností umístění proměnné v paměti. Ty by neměly být zaměňovány s kontextem (nazývaným také prostředí ), což je vlastnost programu a liší se podle bodu v textu nebo provádění programu - viz rozsah: přehled . Kromě toho se životnost objektu může shodovat s proměnnou životností, ale v mnoha případech k němu není vázána.

Rozsah je důležitou součástí rozlišování názvů proměnných. Většina jazyků definuje konkrétní rozsah pro každou proměnnou (stejně jako pro jakoukoli jinou pojmenovanou entitu), který se může v rámci daného programu lišit. Rozsah proměnné je část textu programu, pro kterou má název proměnné význam a pro kterou je proměnná označena jako „viditelná“. Vstupem do tohoto rozsahu obvykle začíná životnost proměnné (jak přichází do kontextu) a opuštěním z tohoto rozsahu obvykle končí její životnost (jak to jde mimo kontext). Například proměnná s „ lexikálním rozsahem “ má smysl pouze v rámci určité funkce/ podprogramu , přesněji v bloku výrazů/ příkazů (podle toho s rozsahem funkce nebo rozsahem bloku ); toto je statické rozlišení, proveditelné v čase analýzy nebo kompilace. Alternativně je proměnná s dynamickým rozsahem vyřešena za běhu na základě zásobníku globálních vazeb, který závisí na konkrétním toku řízení. Proměnné přístupné pouze v rámci určitých funkcí se nazývají „ lokální proměnné “. „ Globální proměnnou “ nebo proměnnou s neurčitým rozsahem lze odkazovat kdekoli v programu.

Na druhé straně rozsah je runtime ( dynamický ) aspekt proměnné. Každá vazba proměnné na hodnotu může mít svůj vlastní rozsah za běhu. Rozsah vazby je část doby provádění programu, během níž proměnná nadále odkazuje na stejnou hodnotu nebo umístění paměti. Spuštěný program může vstoupit a odejít v daném rozsahu mnohokrát, jako v případě uzavření .

Pokud programovací jazyk nenabízí uvolňování paměti , může proměnná, jejíž rozsah trvale přesahuje její rozsah, vést k nevracení paměti , přičemž paměť přidělenou proměnné nelze nikdy uvolnit, protože proměnná, která by byla použita k jejímu odkazu pro účely opětovného umístění, již není přístupný. Může však být přípustné, aby vazba proměnných přesahovala svůj rozsah, jak se vyskytuje v uzávěrech Lisp a C statických lokálních proměnných ; když provádění přejde zpět do rozsahu proměnné, proměnnou lze znovu použít. Proměnná, jejíž rozsah začíná dříve, než její rozsah, se říká, že je neinicializovaná a často má nedefinovanou, libovolnou hodnotu, je -li k ní přístup (viz divoký ukazatel ), protože ještě musí být explicitně zadána konkrétní hodnota. Proměnná, jejíž rozsah končí před jejím rozsahem, se může stát visícím ukazatelem a považována za neinicializovanou ještě jednou, protože její hodnota byla zničena. O proměnných popsaných v předchozích dvou případech lze říci, že jsou mimo rozsah nebo nevázané . V mnoha jazycích je chybou pokoušet se použít hodnotu proměnné, pokud je mimo rozsah. V jiných jazycích to může přinést nepředvídatelné výsledky . Této proměnné však lze přiřadit novou hodnotu, což jí dává nový rozsah.

Kvůli prostorové efektivitě může být paměťový prostor potřebný pro proměnnou přidělen pouze při prvním použití proměnné a uvolněn, když již není potřeba. Proměnná je nutná pouze tehdy, když je v rozsahu, takže počátek životnosti každé proměnné, když vstoupí do rozsahu, může poskytnout prostor nepoužitým proměnným. Aby nedocházelo k plýtvání takovým prostorem, kompilátory často varují programátory, pokud je proměnná deklarována, ale není použita.

Považuje se za správnou programátorskou praxi, aby byl rozsah proměnných co nejužší, aby různé části programu mezi sebou nemohly náhodně interagovat vzájemnou úpravou proměnných. Tím se také zabrání akci na dálku . Běžné techniky, jak toho dosáhnout, jsou různé sekce programu, které používají různé mezery názvů , nebo nastavení jednotlivých proměnných na „soukromé“ prostřednictvím dynamického určování rozsahu proměnných nebo lexikálního určování rozsahu proměnných .

Mnoho programovacích jazyků používá k označení neplatné nebo neinicializované proměnné vyhrazenou hodnotu (často pojmenovanou null nebo nil ).

Psaní na stroji

Ve staticky zadaných jazycích, jako je Go nebo ML , má proměnná také typ , což znamená, že do ní lze ukládat pouze určité druhy hodnot. Například proměnná typu " celé číslo " má zakázáno ukládat textové hodnoty.

V dynamicky zadávaných jazycích, jako je Python , je typ proměnné odvozen z její hodnoty a může se měnit podle její hodnoty. V Common Lisp existují obě situace současně: Proměnné je přiřazen typ (pokud je deklarován, předpokládá se T, že je univerzálním supertypem ), který existuje v době kompilace. Hodnoty mají také typy, které lze kontrolovat a dotazovat za běhu.

Zadávání proměnných také umožňuje vyřešit polymorfismy v době kompilace. To se však liší od polymorfismu používaného v objektově orientovaných voláních funkcí ( v C ++ označovaných jako virtuální funkce ), které řeší volání na základě typu hodnoty na rozdíl od supertypů, které proměnná smí mít.

Proměnné často ukládají jednoduchá data, jako jsou celá čísla a doslovné řetězce, ale některé programovací jazyky umožňují proměnné ukládat hodnoty i jiných datových typů . Tyto jazyky mohou také umožnit, aby byly funkce parametrické polymorfní . Tyto funkce fungují jako proměnné a představují data více typů. Funkce s názvem lengthmůže například určovat délku seznamu. Taková lengthfunkce může být parametrická polymorfní zahrnutím proměnné typu do podpisu typu , protože počet prvků v seznamu je nezávislý na typech prvků.

Parametry

Tyto formální parametry (nebo formální argumenty ) funkcí jsou také označovány jako proměnné. Například v tomto segmentu kódu Pythonu

>>> def addtwo(x):
...     return x + 2
...
>>> addtwo(5)
7

pojmenovaná proměnná xje parametr, protože při volání funkce je jí dána hodnota. Celé číslo 5 je argument, který udává xjeho hodnotu. Ve většině jazyků mají parametry funkcí místní rozsah. Na tuto konkrétní pojmenovanou proměnnou xlze odkazovat pouze v rámci addtwofunkce (i když jiné funkce samozřejmě mohou mít také proměnné nazvané x).

Přidělení paměti

Specifika alokace proměnných a reprezentace jejich hodnot se velmi liší, a to jak mezi programovacími jazyky, tak mezi implementacemi daného jazyka. Mnoho jazykových implementací přiděluje prostor pro lokální proměnné , jejichž rozsah trvá pro jedno volání funkce v zásobníku volání a jejichž paměť se automaticky obnoví, když se funkce vrátí. Obecněji řečeno, ve vazbě názvu je název proměnné vázán na adresu nějakého konkrétního bloku (souvislé sekvence) bajtů v paměti a operace s proměnnou tento blok manipulují. Odkazování je běžnější u proměnných, jejichž hodnoty mají při kompilaci kódu velké nebo neznámé velikosti. Takové proměnné odkazují na umístění hodnoty místo na uložení samotné hodnoty, která je alokována z fondu paměti nazývaného halda .

Vázané proměnné mají hodnoty. Hodnota je však abstrakce, myšlenka; při implementaci je hodnota reprezentována nějakým datovým objektem , který je uložen někde v paměti počítače. Program nebo runtime prostředí musí vyčlenit paměť pro každý datový objekt a protože paměť je konečná, zajistit, aby tato paměť byla získána pro opětovné použití, když objekt již není potřeba k reprezentaci hodnoty nějaké proměnné.

Objekty přidělené z haldy musí být získány zpět - zvláště když objekty již nejsou potřeba. V jazyce shromažďovaném odpadky (například C# , Java , Python, Golang a Lisp ) prostředí runtime automaticky získává zpět objekty, pokud na ně již existující proměnné nemohou odkazovat. V jazycích, které nejsou shromažďovány odpadky, jako je C , musí program (a programátor) výslovně přidělit paměť a později ji uvolnit, aby získal zpět svoji paměť. Pokud tak neučiníte, dojde k nevracení paměti , při kterém se halda během běhu programu vyčerpá, hrozí riziko případného selhání při vyčerpání dostupné paměti.

Když proměnná odkazuje na datovou strukturu vytvořenou dynamicky, k některým jejím komponentám lze přistupovat pouze nepřímo prostřednictvím proměnné. Za takových okolností se musí garbage collectors (nebo analogické funkce programu v jazycích, které postrádají garbage collectory) vypořádat s případem, kdy je třeba kultivovat pouze část paměti dosažitelné z proměnné.

Konvence pojmenování

Na rozdíl od svých matematických protějšků mají programovací proměnné a konstanty běžně názvy více znaků, např. COSTNebo total. Jednoznaková jména se nejčastěji používají pouze pro pomocné proměnné; Například, i, j, kpro index pole proměnné.

Některé konvence pojmenování jsou vynucovány na jazykové úrovni jako součást syntaxe jazyka, která zahrnuje formát platných identifikátorů. Téměř ve všech jazycích nemohou názvy proměnných začínat číslicí (0–9) a nemohou obsahovat mezery. Zda jsou v názvech proměnných povolena interpunkční znaménka, se liší jazyk od jazyka; mnoho jazyků povoluje pouze podtržítko ("_") v názvech proměnných a zakazuje všechny ostatní interpunkce. V některých programovacích jazycích jsou k identifikátorům proměnných připojeny sigily (symboly nebo interpunkce), které označují datový typ nebo rozsah proměnné.

Rozlišování malých a velkých písmen názvů proměnných se mezi jazyky také liší a některé jazyky vyžadují použití určitého případu při pojmenovávání určitých entit; Většina moderních jazyků rozlišuje velká a malá písmena; některé starší jazyky nejsou. Některé jazyky si vyhrazují určité formy názvů proměnných pro vlastní interní použití; v mnoha jazycích jména začínající dvěma podtržítky („__“) často spadají do této kategorie.

Kromě základních omezení uložených jazykem je však pojmenování proměnných do značné míry otázkou stylu. Na úrovni strojového kódu se názvy proměnných nepoužívají, takže zvolená přesná jména na počítači nezáleží. Názvy proměnných je tedy identifikují, pro ostatní jsou jen nástrojem pro programátory, který usnadní programům psaní a porozumění. Použití špatně zvolených názvů proměnných může způsobit, že kontrola kódu bude obtížnější než nepopisná jména, takže názvy, které jsou jasné, jsou často doporučovány.

Programátoři často vytvářejí a dodržují pokyny pro styl kódu, které nabízejí pokyny pro pojmenování proměnných nebo stanoví přesné schéma pojmenování. Kratší názvy se píšou rychleji, ale jsou méně popisné; delší názvy často usnadňují čtení programů a porozumění účelu proměnných. Extrémní výřečnost v názvech proměnných však může také vést k méně srozumitelnému kódu.

Variabilní typy (na základě životnosti)

Pokud jde o klasifikaci proměnných, můžeme klasifikovat proměnné na základě jejich životnosti. Různé typy proměnných jsou statické, dynamické v zásobníku, explicitní dynamické haldy a implicitní dynamické haldy. Statická proměnná je také známý jako globální proměnné, že je vázán na paměťové buňky před začátkem provádění a zůstává na stejné paměťové buňky až do ukončení. Typickým příkladem jsou statické proměnné v C a C ++. Stack-dynamic variable is known as local variable, which is bound when the declaration statement is executed, and it is deallocation when the procedure returns. Hlavními příklady jsou lokální proměnné v podprogramech C a metody Java. Explicitní proměnné dynamické hromady jsou bezejmenné (abstraktní) paměťové buňky, které jsou přidělovány a uvolňovány podle explicitních instrukcí za běhu určených programátorem. Hlavními příklady jsou dynamické objekty v C ++ (pomocí nových a odstraněných) a všechny objekty v Javě. Implicitní proměnné Heap-Dynamic jsou vázány na úložiště haldy, pouze pokud jsou jim přiřazeny hodnoty. K přidělení a uvolnění dochází při opětovném přiřazení hodnot proměnným. Výsledkem je, že implicitní proměnné dynamické haldy mají nejvyšší stupeň flexibility. Hlavními příklady jsou některé proměnné v JavaScriptu, PHP a všechny proměnné v APL.

Viz také

Poznámky

Reference