En programació d'ordinadors, una referència és un valor que permet a un programa accedir indirectament a una determinada dada, com ara el valor d'una variable o un registre, a la memòria de l'ordinador o en algun altre dispositiu d'emmagatzematge. Es diu que la referència fa referència a la dada, i accedir a la dada s'anomena desreferenciació de la referència. Una referència és diferent de la mateixa dada.
Una referència és un tipus de dades abstracte i es pot implementar de moltes maneres. Normalment, una referència fa referència a les dades emmagatzemades a la memòria en un sistema determinat, i el seu valor intern és l'adreça de memòria de les dades, és a dir, una referència s'implementa com a punter. Per aquest motiu sovint es diu que una referència "assenyala" les dades. Altres implementacions inclouen un desplaçament (diferència) entre l'adreça de la dada i una adreça "base" fixa, un índex o identificador utilitzat en una operació de cerca en una matriu o taula, un identificador del sistema operatiu, una adreça física en un dispositiu d'emmagatzematge o una adreça de xarxa, com ara un URL.[1]
Una referència R és un valor que admet una operació, desreferència (R), que dona un valor. Normalment, la referència s'escriu de manera que retorni valors d'un tipus específic, per exemple: [2][3]
interface Reference<T> {
T value();
}
Sovint la referència també admet un magatzem d'operacions d'assignació (R, x), el que significa que és una variable abstracta.[4]
Les referències s'utilitzen àmpliament en programació, especialment per transmetre eficaçment dades grans o mutables com a arguments als procediments, o per compartir aquestes dades entre diversos usos. En particular, una referència pot apuntar a una variable o registre que contingui referències a altres dades. Aquesta idea és la base de l'adreçament indirecte i de moltes estructures de dades enllaçades, com ara llistes enllaçades. Les referències augmenten la flexibilitat sobre on es poden emmagatzemar els objectes, com s'assignen i com es transmeten entre àrees de codi. Sempre que es pugui accedir a una referència a les dades, es pot accedir a les dades a través d'ella, i les dades en si no s'han de moure. També faciliten l'intercanvi de dades entre diferents àrees de codi; cadascun hi guarda una referència.
Les referències poden causar una complexitat important en un programa, en part a causa de la possibilitat de referències penjants i salvatges i en part perquè la topologia de dades amb referències és un gràfic dirigit, l'anàlisi del qual pot ser força complicada. No obstant això, les referències encara són més senzilles d'analitzar que els punters a causa de l'absència d'aritmètica de punters.
El mecanisme de referències, si varia en la implementació, és una característica fonamental del llenguatge de programació comuna a gairebé tots els llenguatges de programació moderns. Fins i tot alguns idiomes que no admeten l'ús directe de referències tenen algun ús intern o implícit. Per exemple, la convenció de trucada per referència es pot implementar amb l'ús explícit o implícit de referències.
Els punters són el tipus de referència més primitiu. A causa de la seva íntima relació amb el maquinari subjacent, són un dels tipus de referències més potents i eficients. Tanmateix, també a causa d'aquesta relació, els punters requereixen una bona comprensió per part del programador dels detalls de l'arquitectura de la memòria. Com que els punters emmagatzemen l'adreça d'una ubicació de memòria, en comptes d'un valor directament, l'ús inadequat dels punters pot provocar un comportament no definit en un programa, especialment a causa de punters penjants o punters salvatges. Els punters intel·ligents són estructures de dades opaques que actuen com a punters, però només es poden accedir mitjançant mètodes concrets.
Un mànec és una referència abstracta i es pot representar de diverses maneres. Un exemple comú són els identificadors de fitxers (l'estructura de dades FILE a la biblioteca d'E/S estàndard C), que s'utilitzen per abstraure el contingut del fitxer. Normalment representa tant el propi fitxer, com quan es demana un bloqueig al fitxer, com una posició específica dins del contingut del fitxer, com quan es llegeix un fitxer.
En la informàtica distribuïda, la referència pot contenir més que una adreça o un identificador; també pot incloure una especificació incrustada dels protocols de xarxa utilitzats per localitzar i accedir a l'objecte referenciat, la manera com es codifica o serialitza la informació. Així, per exemple, una descripció WSDL d'un servei web remot es pot veure com una forma de referència; inclou una especificació completa de com localitzar i vincular-hi un servei web concret. Una referència a un objecte distribuït en directe n'és un altre exemple: és una especificació completa sobre com construir un petit component de programari anomenat proxy que posteriorment participarà en una interacció d'igual a igual i mitjançant el qual la màquina local pot accedir a dades que es reprodueixen o que només existeixen com a flux de missatges poc coherent. En tots aquests casos, la referència inclou el conjunt complet d'instruccions, o una recepta, de com accedir a les dades; en aquest sentit, serveix per a la mateixa finalitat que un identificador o adreça en memòria.
Si tenim un conjunt de claus K i un conjunt d'objectes de dades D, qualsevol funció ben definida (d'un sol valor) de K a D ∪ {null} defineix un tipus de referència, on null és la imatge d'una clau que no fa referència. a qualsevol cosa significativa.
Una representació alternativa d'aquesta funció és un gràfic dirigit anomenat gràfic d'accessibilitat. Aquí, cada dada es representa amb un vèrtex i hi ha una aresta de u a v si la dada en u fa referència a la dada en v. El grau màxim de sortida és un. Aquests gràfics són valuosos a la recollida d'escombraries, on es poden utilitzar per separar els objectes accessibles dels inaccessibles.