Reference (programování)

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Reference je v informatice pojem používaný v programování, který označuje odkaz na proměnnou nebo instanci objektu. Reference je na rozdíl od ukazatele abstraktnější a navenek neobsahuje žádnou informaci o uložení objektu v operační paměti.

Reference umožňuje v programu nepřímý přístup ke konkrétním datům, jako jsou proměnné nebo záznamy v paměti počítače nebo na jiném paměťovém zařízení (například pevný disk). Reference se odkazují k datům a přístup k těmto datům je pak nazýván dereference. Reference jsou odlišné od dat samotných. Typická reference odkazuje jen na fyzickou adresu, která dává pouze informaci, kde jsou data v paměti nebo na paměťovém zařízení uložena (a nic o jejím obsahu). Z tohoto důvodu se reference často označuje jako ukazatel (pointer) nebo adresa. Nicméně v reference může být rovněž uveden offset (rozdíl) mezi datovými adresami a nějaké pevné stanovené (většinou základní) adresy nebo indexu v poli.

Pojem reference nesmí být zaměňován s jinými hodnotami (primárními klíči nebo Identifikátory), které sice jednoznačně identifikují datovou položku, ale poskytují k ní přístup pouze v netriviální vyhledávací operaci v některé z tabulek v databázi.

Reference jsou široce používány v programování, zejména k efektivnímu přenosu velkého množství dat, nebo pro proměnlivá data jako jsou argumenty procedur, nebo sdílená data. Reference mohou zejména odkazovat na proměnné nebo záznam, který obsahuje odkazy na další data. Tato myšlenka je základem nepřímého adresování a mnoha propojených datových struktur, jako jsou například lineárními seznamy.

Výhody[editovat | editovat zdroj]

Reference zvyšují flexibilitu, kde mohou být data uloženy, jak jsou alokovány a jak jsou předávány mezi jednotlivými částmi kódu. Dokud reference odkazují na tyto data, umožňují k nim zároveň také přístup, a data samotná se tak nemusí nikam přesouvat. Reference také umožňují snadnější sdílení mezi rozdílnými částmi kódu.

Mechanismus reference (pokud se slyší v implementaci), je ve většině základních moderních programovacích jazyků společná, a dokonce i některé jazyky, které nepodporují přímé použití referencí tak pro ně mají nějaké vnitřní nebo implicitní použití. Například, referenční volání konvence může být prováděno buď explicitně, nebo implicitně použitím referencí.

Příklady[editovat | editovat zdroj]

Ukazatelé jsou vzhledem k přímému vztahu se základním hardwarem efektivním a jedním z nejmocnějších typů odkazů vůbec. Nicméně, díky tomuto přímému vztahu, ukazatelé vyžadují od programátora podrobné pochopení architektury dané paměti, protože ukazatele ukládají adresy místa uložení namísto přímé hodnoty. Tím může nevhodné používání ukazatelů snadno vést k nepředvídatelnému chování samotného programu. Inteligentní ukazatel (Smart pointer) je zase neprůhledná datová struktura, které sice funguje jako ukazatel, ale lze k ní přistupovat pouze pomocí jednotlivých metod.

File handles, nebo handles jsou typy odkazu používané k abstraktnímu obsahu souboru. To obvykle představuje jednak samotný soubor (při žádosti zamknutí souboru), tak i specifické postavení v rámci obsahu souboru (při čtení souboru).

Při Distribuovaném výpočtu (rozdělení na více menších, nenáročných úloh) může odkaz obsahovat více než adresu nebo identifikátor, ale může také zahrnovat specifikace síťových protokolů používané k vyhledávání a přístupu k odkazovaným objektům. Způsob, jakým je informace zakódována. Například Web WSDL (popis vzdálené webové služby), může být považována jako forma reference, protože obsahuje kompletní specifikace, jak najít a jak sem připojit na konkrétní webové služby. Reference na pohybující se distribuované objekty (peer-to-peer) je jiný příklad: je to kompletní specifikace, jak vytvořit malý proxy, software, který bude následně zapojen do peer-to-peer interakce, jejímž prostřednictvím lokální počítač může získat přístup k datům, která jsou replikována nebo existuje jen jako message stream.

Příklad volaní pomocí reference v E:

def modify(var p, &q) {
    p := 27 # předána hodnota - změněn pouze lokální parametr změněn
    q := 27 # předáván odkazem - proměnná používá ve volání je upravena
}
 
? var a := 1
# value: 1
? var b := 2
# value: 2
? modify(a,&b)
? a
# value: 1
? b
# value: 27

Příklad, který simuluje volaní referencí v jazyce C:

void Modify(int p, int * q, int * o)
{
    p = 27;  // předány hodnotou - změněn pouze lokální parametr
    *q = 27; // hodnotou nebo referencí, kontrola místa určeni
    *o = 27; // hodnotou nebo referencí, kontrola místa určeni
}
int main()
{
    int a = 1;
    int b = 1;
    int x = 1;
    int * c = &x;
    Modify(a, &b, c);   // a je předáván hodnotou, b je předáván odkazem vytvořením pointrem,
                        // c je pointer předány hodnotou
    // b a x jsou změněny
    return(0);
}