Reference (programování)

Reference je v informatice pojem používaný v programování, který označuje odkaz na proměnnou nebo instanci objektu. Reference je abstraktnější variantou ukazatele, která 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 nazýváme dereferencí. 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

Reference zvyšují flexibilitu, kde mohou být data uložena, jak jsou alokována a jak jsou předávána mezi jednotlivými částmi kódu. Dokud reference odkazují na tato 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 referencí je základní vlastnost, kterou má většina moderních programovacích jazyků; dokonce i jazyky, které přímo nepodporují používání referencí je používají vnitřně nebo implicitně. Například předávání parametrů referencí může být prováděno buď explicitně nebo implicitně použitím referencí.

Příklady

Ukazatele 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, ukazatele 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.

Deskriptor souboru nebo manipulátor souboru (file descriptor, file handle, nebo handle) 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);
}

Odkazy

Reference

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