Referenz (Informatik)

Im Computerprogrammierung, a Hinweis ist ein Wert, der es einem Programm ermöglicht, indirekt auf einen bestimmten zugreifen zu können Daten, so wie ein VariableWert oder a Aufzeichnung, in dem Computer's Erinnerung oder in einem anderen Speichermedium. Die Referenz soll auf verweisen zum Datum, und der Zugriff auf das Datum wird aufgerufen Derference die Referenz. Eine Referenz unterscheidet sich vom Datum selbst.

Eine Referenz ist eine Zusammenfassung Datentyp und kann in vielerlei Hinsicht implementiert werden. In der Regel bezieht sich eine Referenz auf Daten, die im Speicher eines bestimmten Systems gespeichert sind, und der interne Wert ist der Speicheradresse der Daten, d. H. Eine Referenz wird als implementiert Zeiger. Aus diesem Grund soll eine Referenz oft auf die Daten "verweisen". Andere Implementierungen umfassen einen Offset (Differenz) zwischen der Adresse des Datums und einer festen "Basis" -Ade, einer Index, einzigartiger Schlüssel, oder Kennung verwendet in a Sieh nach oben Betrieb in ein Array oder Tischein Betriebssystem handhaben, a physikalische Adresse auf einem Speichergerät oder einer Netzwerkadresse wie a URL.

Formelle Darstellung

Eine Referenz R ist ein Wert, der eine Operation zulässt, Dereferenz(R), was einen Wert ergibt. Normalerweise wird die Referenz so getippt, dass sie Werte eines bestimmten Typs zurückgibt, z. B.:[1][2]

Schnittstelle Bezug<T> {  T Wert(); } 

Oft gibt die Referenz auch eine Zuordnungsoperation zu Laden(R, x), was bedeutet, dass es ein ist Abstrakte Variable.[1]

Verwenden

Referenzen werden in großem Umfang verwendet in Programmierung, insbesondere um große oder veränderliche Daten effizient zu bestehen Argumente zu Verfahrenoder um solche Daten unter verschiedenen Verwendungen zu teilen. Insbesondere kann eine Referenz auf eine Variable oder einen Datensatz verweisen, die Verweise auf andere Daten enthält. Diese Idee ist die Grundlage von Indirekte Adressierung und von vielen verknüpfte Datenstrukturen, wie zum Beispiel verlinkte Listen. Die Referenzen erhöhen die Flexibilität darin, wo Objekte gespeichert werden können, wie sie zugewiesen werden und wie sie zwischen Codebereichen übergeben werden. Solange man auf einen Verweis auf die Daten zugreifen kann, kann man über sie auf die Daten zugreifen und die Daten selbst müssen nicht verschoben werden. Sie erleichtern auch die Freigabe von Daten zwischen verschiedenen Codebereichen. Jeder hält einen Hinweis darauf.

Referenzen können in einem Programm erhebliche Komplexität verursachen, teilweise aufgrund der Möglichkeit von baumeln und wilde Referenzen und teilweise weil die Topologie von Daten mit Referenzen ist a gerichteter Graph, deren Analyse ziemlich kompliziert sein kann. Trotzdem sind Referenzen immer noch einfacher zu analysieren als Zeiger aufgrund des Abwesenheit von Zeigerarithmetik.

Der Referenzmechanismus ist, wenn es in der Implementierung unterschiedlich ist, ein grundlegendes Programmiersprache, das fast allen modernen Programmiersprachen gemeinsam ist. Sogar einige Sprachen, die keine direkte Verwendung von Referenzen unterstützen, haben eine interne oder implizite Verwendung. Zum Beispiel die Rufen Sie durch Referenz an Die Anrufkonvention kann entweder mit explizitem oder implizitem Einsatz von Referenzen implementiert werden.

Beispiele

Zeiger sind die primitivste Referenzart. Aufgrund ihrer engen Beziehung zur zugrunde liegenden Hardware sind sie eine der leistungsstärksten und effizientesten Arten von Referenzen. Aufgrund dieser Beziehung benötigen Zeiger jedoch ein starkes Verständnis des Programmierers der Details der Speicherarchitektur. Da Zeiger die Adresse eines Speicherorts speichern, kann eine unangemessene Verwendung von Zeigern anstelle eines Wertes direkt zu einem Wert führen undefiniertes Verhalten in einem Programm, insbesondere aufgrund Zeiger baumeln oder wilde Zeiger. Smart Zeiger sind undurchsichtige Datenstrukturen Das wirkt wie Zeiger, kann aber nur mit bestimmten Methoden zugegriffen werden.

A handhaben ist eine abstrakte Referenz und kann auf verschiedene Weise dargestellt werden. Ein häufiges Beispiel sind Dateigriffe (die Dateidatenstruktur in der C Standard -E/A -Bibliothek), verwendet, um den Dateiinhalt abstrakt zu machen. Es repräsentiert normalerweise beide die Datei selbst, als wenn er a sperren in der Datei und eine bestimmte Position im Inhalt der Datei wie beim Lesen einer Datei.

Im verteiltes ComputerDie Referenz kann mehr als eine Adresse oder eine Bekennung enthalten; Es kann auch eine eingebettete Spezifikation der Netzwerkprotokolle enthalten, die zur Lokalisierung und Zugriff auf das referenzierte Objekt verwendet werden. Die Art und Weise, wie Informationen codiert oder serialisiert werden. So zum Beispiel a WSDL Die Beschreibung eines Remote -Webdienstes kann als Referenzform angesehen werden. Es enthält eine vollständige Spezifikation, wie man lokalisiert und an eine bestimmte binden Internetservice. Ein Verweis auf a Live -verteiltes Objekt ist ein weiteres Beispiel: Es ist eine vollständige Spezifikation, wie eine kleine Softwarekomponente namens a Proxy Dies führt anschließend in eine Peer-to-Peer-Interaktion und durch die die lokale Maschine zu Zugriff auf Daten erhält, die repliziert werden oder nur als schwach konsequentes Nachrichtenstrom existiert. In all diesen Fällen enthält die Referenz die vollständige Reihe von Anweisungen oder ein Rezept für den Zugriff auf die Daten. In diesem Sinne dient es dem gleichen Zweck wie eine Kennung oder Adresse im Speicher.

Wenn wir eine Reihe von Schlüssel haben K und eine Reihe von Datenobjekten D, jede gut definierte (einzeln bewertete) Funktion von K zu D ∪ {Null} definiert eine Art von Referenz, wo Null ist das Bild eines Schlüssels, das sich nicht auf etwas Sinnvolles bezieht.

Eine alternative Darstellung einer solchen Funktion ist eine gerichtete Grafik, die als Erreichbarkeitsdiagramm bezeichnet wird. Hier wird jedes Datum von einem Scheitelpunkt dargestellt und es gibt eine Kante von u zu v Wenn das Datum in u bezieht sich auf das Datum in v. Das Maximum überdurchschnittlich ist ein. Diese Grafiken sind wertvoll in Müllsammlung, wo sie verwendet werden können, um zugänglich von unzugängliche Objekte.

Externer und interner Speicher

In vielen Datenstrukturen bestehen große, komplexe Objekte aus kleineren Objekten. Diese Objekte werden typischerweise auf zwei Arten gespeichert:

  1. Bei internem Speicher wird der Inhalt des kleineren Objekts im größeren Objekt gespeichert.
  2. Mit externem Speicher werden die kleineren Objekte an ihrem eigenen Standort zugewiesen, und das größere Objekt speichert nur Verweise auf sie.

Der interne Speicher ist normalerweise effizienter, da für die Referenzen Platzkosten vorliegen und dynamische Zuweisung Metadaten und eine Zeitkosten, die mit der Derferenzierung einer Referenz und der Zuweisung des Speichers für die kleineren Objekte verbunden ist. Interner Speicher erhöht sich auch Referenzort Indem Sie verschiedene Teile desselben großen Objekts im Gedächtnis nahe beieinander halten. Es gibt jedoch eine Vielzahl von Situationen, in denen externer Speicher bevorzugt wird:

  • Wenn die Die Datenstruktur ist rekursiv, was bedeutet, dass es sich selbst enthalten kann. Dies kann nicht auf interne Weise dargestellt werden.
  • Wenn das größere Objekt in einem Bereich mit begrenztem Raum wie dem Stapel gespeichert wird, können wir verhindern, dass wir den Speicher ausführen, indem wir große Komponentenobjekte in einem anderen Speicherbereich speichern und sie unter Verwendung von Referenzen beziehen.
  • Wenn die kleineren Objekte in der Größe variieren können, ist es häufig unpraktisch oder teuer, das größere Objekt so zu ändern, dass es sie dennoch enthalten kann.
  • Referenzen sind oft einfacher zu arbeiten und sich besser an neue Anforderungen anzupassen.

Einige Sprachen, wie z. Java, Smalltalk, Python, und PlanenUnterstützen Sie keinen internen Speicher. In diesen Sprachen werden alle Objekte durch Referenzen einheitlich zugegriffen.

Sprachunterstützung

Montage

Im MontagespracheEs ist typisch, Referenzen mithilfe von Rohspeicheradressen oder Indizes in Tabellen auszudrücken. Diese funktionieren, sind aber etwas schwierig zu bedienen, da eine Adresse Ihnen nichts über den Wert sagt, auf den sie hinweist, nicht einmal, wie groß sie ist oder wie sie sie interpretiert. Solche Informationen sind in der Programmlogik codiert. Das Ergebnis ist, dass Fehlinterpretationen in falschen Programmen auftreten können, was zu verwirrenden Fehlern führt.

Lispeln

Eine der frühesten undurchsichtigsten Referenzen war die des Lispeln Sprache Nachteile Zelle, was einfach a ist Aufzeichnung enthält zwei Verweise auf andere LISP -Objekte, einschließlich möglicherweise anderer Cons -Zellen. Diese einfache Struktur wird am häufigsten verwendet, um einzeln zu bauen verlinkte Listen, kann aber auch verwendet werden, um einfach zu bauen Binärbäume und sogenannte "gepunktete Listen", die nicht mit einer Nullreferenz, sondern mit einem Wert enden.

C/C ++

Das Zeiger ist heute noch eine der beliebtesten Arten von Referenzen. Es ähnelt der Montagedarstellung einer rohen Adresse, außer dass sie eine statische statisch trägt Datentyp Dies kann zur Kompilierungszeit verwendet werden, um sicherzustellen, dass die Daten, auf die sie sich beziehen, nicht falsch interpretiert werden. Weil C jedoch a hat Schwaches Typsystem was mit Verwendung verletzt werden kann Abgüsse (Explizite Konvertierungen zwischen verschiedenen Zeigertypen und zwischen Zeigertypen und Ganzzahlen.) Eine Fehlinterpretation ist immer noch möglich, wenn auch schwieriger. Sein Nachfolger C ++ versuchte zu erhöhen Geben Sie Sicherheit ein von Zeigern mit neuen Besetzungstätern, einem Referenztyp &und intelligente Zeiger in seine Standardbibliothekbehielt aber immer noch die Fähigkeit, diese Sicherheitsmechanismen für die Kompatibilität zu umgehen.

Forran

Fortran hat keine explizite Repräsentation von Referenzen, verwendet sie jedoch implizit in seiner Call-by-Reference Semantik anrufen. EIN Forran Referenz wird am besten als als angesehen alias eines anderen Objekts, wie z. B. eine Skalarvariable oder eine Zeile oder Spalte eines Arrays. Der Referenz oder die Manipulation des Inhalts des Referenzs gibt keine Syntax. FORTRAN -Referenzen können null sein. Wie in anderen Sprachen erleichtern diese Referenzen die Verarbeitung dynamischer Strukturen wie verknüpfte Listen, Warteschlangen und Bäume.

Objektorientierte Sprachen

Eine Reihe objektorientierter Sprachen wie Sprachen wie z. Eiffel, Java, C#, und Visual Basic haben eine viel undurchlässigere Referenztyp angewendet, die normalerweise als einfach als einfach bezeichnet wird Hinweis. Diese Referenzen haben Typen wie C -Zeiger, die angeben, wie sie die Daten interpretieren können, auf die sie verweisen, aber sie sind dadurch, dass sie nicht als rohe Adresse interpretiert werden können und unsichere Konvertierungen nicht zulässig sind. Referenzen werden ausgiebig zum Zugriff und zum Zugriff und zum Zugriff verwendet zuordnen Objekte. Referenzen werden auch in der Funktion verwendet/Methode Anrufe oder Nachrichtenübergang und Referenzzählungen werden häufig zur Durchführung verwendet Müllsammlung von nicht verwendeten Objekten.

Funktionssprachen

Im Standard ml, OcamlUnd viele andere funktionale Sprachen sind die meisten Werte anhaltend: Sie können nicht durch Zuordnung geändert werden. Zuweisbare "Referenzzellen" liefern Veränderliche Variablen, Daten, die geändert werden können. Solche Referenzzellen können einen beliebigen Wert halten, und so werden die angegeben polymorph Typ α Ref, wo α ist durch die Art des Wertes ersetzt zu werden. Diese veränderlichen Referenzen können über ihre Lebensdauer auf verschiedene Objekte hingewiesen werden. Dies ermöglicht beispielsweise die Erstellung von kreisförmigen Datenstrukturen. Die Referenzzelle entspricht einem veränderlichen Array der Länge 1 funktional.

Um Sicherheits- und effiziente Implementierungen zu bewahren, können Referenzen nicht sein Typ-Kaste In ML können auch Zeigerarithmetik durchgeführt werden. Es ist wichtig zu beachten, dass im funktionalen Paradigma viele Strukturen, die mit Zeigern in einer Sprache wie C dargestellt werden, unter Verwendung anderer Einrichtungen dargestellt werden, wie z. Algebraischer Datentyp Mechanismus. Der Programmierer kann dann bestimmte Eigenschaften (wie die Garantie der Unveränderlichkeit) beim Programmieren genießen, obwohl der Compiler häufig Maschinenzeiger "unter der Motorhaube" verwendet.

Perl/Php

Perl unterstützt harte Referenzen, die ähnlich wie in anderen Sprachen funktionieren, und Symbolische Referenzen, die nur Stringwerte sind, die die Namen von Variablen enthalten.Wenn ein Wert, der keine harte Referenz ist, Derferenz ist, betrachtet Perl, dass er eine symbolische Referenz ist, und gibt die Variable mit dem vom Wert angegebenen Namen an.[3] Php hat ein ähnliches Merkmal in Form seiner $$ var Syntax.[4]

Siehe auch

Verweise

  1. ^ a b Sherman, Mark S. (April 1985). Paragon: Eine Sprache, die Typhierarchien für die Spezifikation, Implementierung und Auswahl abstrakter Datentypen verwendet. Springer Science & Business Media. p. 175. ISBN 978-3-540-15212-5.
  2. ^ "Referenz (Java -Plattform SE 7)". docs.oracle.com. Abgerufen 10. Mai 2022.
  3. ^ "Perlref". perldoc.perl.org. Abgerufen 2013-08-19.
  4. ^ "Variable Variablen - Handbuch". Php. Abgerufen 2013-08-19.

Externe Links

  • Zeiger Spaß mit Binky Einführung in Zeiger in einem 3-minütigen Bildungsvideo-Stanford Computer Science Education Library