Verweisung (Informatik)

In der Informatik ist eine Verweisung ein Wert, der einem Programm ermöglicht, auf eine besondere Gegebenheit, wie eine Variable oder eine Aufzeichnung im Gedächtnis des Computers oder in einem anderen Speichergerät indirekt zuzugreifen. Wie man sagt, bezieht sich die Verweisung auf die Gegebenheit, und das Zugreifen auf die Gegebenheit wird dereferencing die Verweisung genannt.

Eine Verweisung ist von den Daten selbst verschieden. Gewöhnlich ist eine Verweisung die physische Adresse dessen, wo die Daten im Gedächtnis oder im Speichergerät versorgt werden. Deshalb wird eine Verweisung häufig einen Zeigestock oder Adresse genannt und wird gesagt, zu den Daten hinzuweisen. Jedoch kann eine Verweisung auch der Ausgleich (Unterschied) zwischen der Adresse der Gegebenheit und einer festen "Grund"-Adresse oder einem Index in eine Reihe sein.

Das Konzept der Verweisung muss mit anderen Werten nicht verwirrt sein (Schlüssel oder Bezeichner), die einzigartig den Datenartikel identifizieren, aber Zugang dazu nur durch eine nichttriviale lookup Operation in einer Tabellendatenstruktur geben.

Verweisungen werden in der Programmierung weit verwendet, um besonders große oder veränderliche Daten als Argumente für Verfahren effizient zu passieren, oder solche Daten unter dem verschiedenen Gebrauch zu teilen. Insbesondere eine Verweisung kann zu einer Variable oder Aufzeichnung hinweisen, die Verweisungen auf andere Daten enthält. Diese Idee ist die Basis des indirekten Wendens und vieler verbundener Datenstrukturen wie verbundene Listen.

Eine Verweisung kann im Vergleich zu einer Straßenadresse, wie "12 Main Street" oder "drei Häuser unten die Straße auf der linken Seite" sein. Das Gehen zum Gebäude mit dieser Adresse ist dereferencing die Verweisung analog. Der Name "Bob und das Autogeschäft von Joe" könnte ein einzigartiger Bezeichner für dasselbe Gebäude sein, aber kann nicht im Vergleich zu einer Datenverweisung sein, weil die Entdeckung des Gebäudes mit diesem Namen eine nichttriviale Suche oder einen lookup in einem Verzeichnis verlangt.

Vorteile

Verweisungen vergrößern Flexibilität darin, wo Gegenstände versorgt werden können, wie sie zugeteilt werden, und wie sie zwischen Gebieten des Codes passiert werden. So lange man auf eine Verweisung auf die Daten zugreifen kann, kann man auf die Daten dadurch zugreifen, und die Daten selbst brauchen nicht bewegt zu werden. Sie machen auch das Teilen von Daten zwischen verschiedenen Codegebieten leichter; jeder behält eine Verweisung darauf.

Der Mechanismus von Verweisungen, wenn er sich in der Durchführung ändert, ist eine grundsätzliche für fast alle modernen Programmiersprachen übliche Programmiersprache-Eigenschaft. Sogar einige Sprachen, die keinen direkten Gebrauch von Verweisungen unterstützen, haben einen inneren oder impliziten Nutzen. Zum Beispiel kann der Anruf durch die Bezugsbenennen-Tagung entweder mit dem ausführlichen oder mit impliziten Gebrauch von Verweisungen durchgeführt werden.

Beispiele

Zeigestöcke sind am primitivsten. Wegen ihrer vertrauten Beziehung mit der zu Grunde liegenden Hardware sind sie einer der stärksten und effizienten Typen von Verweisungen. Jedoch, auch wegen dieser Beziehung, verlangen Zeigestöcke ein starkes Verstehen durch den Programmierer der Details der Speicherarchitektur. Weil Zeigestöcke eine Speicherpositionsadresse statt eines Werts direkt versorgen, kann der unpassende Gebrauch von Zeigestöcken zu unbestimmtem Verhalten in einem Programm führen. Kluge Zeigestöcke sind undurchsichtige Datenstrukturen, die wie Zeigestöcke handeln, aber nur durch besondere Methoden zugegriffen werden können.

Dateigriffe oder Griffe, sind ein Typ der Verweisung, die verwendet ist, um Dateiinhalt zu abstrahieren. Es vertritt gewöhnlich sowohl die Datei selbst, als, wenn es um ein Schloss auf der Datei, als auch eine spezifische Position innerhalb des Inhalts der Datei, als bittet, wenn es eine Datei liest.

In der verteilten Computerwissenschaft kann die Verweisung mehr als eine Adresse oder Bezeichner enthalten; es kann auch eine eingebettete Spezifizierung der Netzprotokolle einschließen, die verwendet sind, um den Verweise angebrachten Gegenstand, die Weise ausfindig zu machen und auf ihn zuzugreifen, wie Information verschlüsselt oder in Fortsetzungen veröffentlicht wird. So, zum Beispiel, kann eine WSDL Beschreibung eines entfernten Webdienstes als eine Form der Verweisung angesehen werden; es schließt eine ganze Spezifizierung dessen ein, wie man sich niederlässt und zu einem besonderen Webdienst bindet. Eine Verweisung auf einen lebenden verteilten Gegenstand ist ein anderes Beispiel: Es ist eine ganze Spezifizierung dafür, wie man einen kleinen Softwarebestandteil genannt eine Vertretung baut, die sich nachher mit einer Gleicher-zu-Gleicher-Wechselwirkung beschäftigen wird, und durch den die lokale Maschine Zugang zu Daten gewinnen kann, der wiederholt wird oder nur als ein schwach konsequenter Nachrichtenstrom besteht. In allen diesen Fällen schließt die Verweisung den vollen Satz von Instruktionen oder ein Rezept, weil ein, wie man auf die Daten zugreift; in diesem Sinn dient es demselben Zweck wie ein Bezeichner oder Adresse im Gedächtnis.

Formelle Darstellung

Mehr allgemein kann eine Verweisung als ein Stück von Daten betrachtet werden, das einzigartige Wiederauffindung eines anderen Stückes von Daten erlaubt. Das schließt primäre Schlüssel in Datenbanken und Schlüssel in einer assoziativen Reihe ein. Wenn wir eine Reihe von Daten D haben, definiert jede bestimmte (einzeln geschätzte) Funktion von D auf D  {ungültig} einen Typ der Verweisung, wo ungültig, ist das Image eines Stückes von Daten, die sich nicht auf irgendetwas Bedeutungsvolles beziehen.

Eine alternative Darstellung solch einer Funktion ist ein geleiteter Graph genannt einen reachability Graphen. Hier wird jede Gegebenheit durch einen Scheitelpunkt vertreten, und es gibt einen Rand von u bis v, wenn sich die Gegebenheit in u auf die Gegebenheit in v bezieht. Der maximale-Grad ist derjenige. Diese Graphen sind in der Müll-Sammlung wertvoll, wo sie verwendet werden können, um sich zugänglich von unzugänglichen Gegenständen zu trennen.

Äußerliche und innere Lagerung

In vielen Datenstrukturen werden große, komplizierte Gegenstände aus kleineren Gegenständen zusammengesetzt. Diese Gegenstände werden normalerweise auf eine von zwei Weisen versorgt:

  1. Mit der inneren Lagerung wird der Inhalt des kleineren Gegenstands innerhalb des größeren Gegenstands versorgt.
  2. Mit der Außenlagerung werden die kleineren Gegenstände in ihrer eigenen Position zugeteilt, und der größere Gegenstand versorgt nur Verweisungen auf sie.

Innere Lagerung ist gewöhnlich effizienter, weil es Raumkosten für die Verweisungen und dynamische Verteilung metadata, und Zeitkosten gibt, die mit dereferencing eine Verweisung und mit dem Zuteilen des Gedächtnisses für die kleineren Gegenstände vereinigt sind. Innere Lagerung erhöht auch Gegend der Verweisung durch das Halten verschiedener Teile desselben großen Gegenstands eng miteinander im Gedächtnis. Jedoch gibt es eine Vielfalt von Situationen, in denen Außenlagerung bevorzugt wird:

  • Wenn die Datenstruktur rekursiv ist, bedeutend, dass sie sich beherrschen kann. Das kann auf die innere Weise nicht vertreten werden.
  • Wenn der größere Gegenstand in einem Gebiet mit dem beschränkten Raum wie der Stapel versorgt wird, dann können wir verhindern, an Lagerung knapp zu werden, indem wir große Teilgegenstände in einem anderen Speichergebiet versorgen und uns auf sie beziehen, Verweisungen verwendend.
  • Wenn sich die kleineren Gegenstände in der Größe ändern können, ist es häufig ungünstig oder teuer, den größeren Gegenstand in der Größe anzupassen, so dass es sie noch enthalten kann.
  • Verweisungen sind häufig leichter, zu arbeiten mit und sich besser an neue Voraussetzungen anzupassen.

Einige Sprachen, wie Java, Plausch, Pythonschlange, und Schema, unterstützen innere Lagerung nicht. Auf diesen Sprachen wird auf alle Gegenstände durch Verweisungen gleichförmig zugegriffen.

Sprachunterstützung

Auf Zusammenbau-Sprachen haben die ersten Sprachen verwendet, es ist typisch, um Verweisungen mit entweder rohen Speicheradressen oder Indizes in Tische auszudrücken. Diese arbeiten, aber sind etwas heikel, um zu verwenden, weil eine Adresse Ihnen nichts über den Wert erzählt, den sie auf nicht sogar anspitzt, wie groß es ist, oder wie man sie interpretiert; solche Information wird in der Programm-Logik verschlüsselt. Das Ergebnis besteht darin, dass Missdeutungen in falschen Programmen vorkommen können, verwirrende Fehler verursachend.

Eine der frühsten undurchsichtigen Verweisungen war die der Lispeln-Sprache lernt Zelle, die einfach eine Aufzeichnung ist, die zwei Verweisungen auf andere Lispeln-Gegenstände enthält, einschließlich vielleicht anderen lernt Zellen. Diese einfache Struktur wird meistens verwendet, um einzeln verbundene Listen zu bauen, aber kann auch verwendet werden, um einfache binäre Bäume und so genannte "punktierte Listen" zu bauen, die nicht mit einer ungültigen Verweisung, aber einem Wert enden.

Eine andere frühe Sprache, Fortran, hat keine ausführliche Darstellung von Verweisungen, aber verwendet sie wirklich implizit in seiner Benennen-Semantik des Anrufs durch die Verweisung.

Der Zeigestock ist noch einer der populärsten Typen von Verweisungen heute. Es ist der Zusammenbau-Darstellung einer rohen Adresse ähnlich, außer dass es einen statischen datatype trägt, der während der Übersetzung verwendet werden kann, um sicherzustellen, dass die Daten, auf die es sich bezieht, nicht missdeutet werden. Jedoch, weil C ein schwaches Typ-System hat, das mit Würfen verletzt werden kann (ausführliche Konvertierungen zwischen verschiedenen Zeigestock-Typen und zwischen Zeigestock-Typen und ganzen Zahlen), ist Missdeutung noch, wenn schwieriger, möglich. Sein Nachfolger C ++ hat versucht, Typ-Sicherheit von Zeigestöcken mit neuen Wurf-Maschinenbedienern und klugen Zeigestöcken in seiner Standardbibliothek zu vergrößern, aber hat noch die Fähigkeit behalten, diese Sicherheitsmechanismen für die Vereinbarkeit zu überlisten.

Mehrere populäre Hauptströmungssprachen heute wie Eiffel, Java, C#, und Visuell Grundlegend haben viel mehr undurchsichtigen Typ der Verweisung angenommen, die gewöhnlich auf als einfach eine Verweisung verwiesen ist. Diese Verweisungen haben Typen wie C Zeigestöcke, die anzeigen, wie man die Daten interpretiert, in denen sie Verweise anbringen, aber sie sind typesafe, in dem sie als eine rohe Adresse nicht interpretiert werden können und unsichere Konvertierungen nicht erlaubt werden.

Fortran

Von einer Fortran Verweisung wird am besten als ein Deckname eines anderen Gegenstands, wie eine Skalarvariable oder eine Reihe oder Säule einer Reihe gedacht. Es gibt keine Syntax zu dereference die Verweisung, oder manipulieren Sie den Inhalt des referent direkt. Verweisungen von Fortran können ungültig sein. Als auf anderen Sprachen erleichtern diese Verweisungen die Verarbeitung von dynamischen Strukturen, wie verbundene Listen, Warteschlangen und Bäume.

Funktionelle Sprachen

In allen obengenannten Einstellungen, dem Konzept veränderlicher Variablen, machen Daten, die modifiziert werden können, häufig impliziten Gebrauch von Verweisungen. In Normalem ML, OCaml und vielen anderen funktionellen Sprachen, sind die meisten Werte beharrlich: Sie können durch die Anweisung nicht modifiziert werden. Bestimmbare "Bezugszellen" dienen den unvermeidlichen Zwecken von veränderlichen Verweisungen auf befehlenden Sprachen, und machen die Fähigkeit, ausführlich modifiziert zu werden. Solche Bezugszellen können jeden Wert halten, und werden so der polymorphe Typ gegeben, wo durch den Typ des Werts ersetzt werden soll, der darauf angespitzt ist. Diese veränderlichen Verweisungen können auf verschiedene Gegenstände über ihre Lebenszeit angespitzt werden. Zum Beispiel erlaubt das, kreisförmiger Datenstrukturen zu bauen. Die Bezugszelle ist zu einer Reihe der Länge 1 funktionell gleichwertig.

Um Sicherheit und effiziente Durchführungen zu bewahren, können Verweisungen nicht in ML festgelegt werden, noch Zeigestock-Arithmetik kann durchgeführt werden. Es ist wichtig zu bemerken, dass im funktionellen Paradigma viele Strukturen, die mit Zeigestöcken auf einer Sprache wie C vertreten würden, mit anderen Möglichkeiten wie der starke algebraische datatype Mechanismus vertreten werden. Der Programmierer ist dann im Stande, bestimmte Eigenschaften (wie die Garantie der Unveränderlichkeit) zu genießen, während er programmiert, wenn auch der Bearbeiter häufig Maschinenzeigestöcke "unter der Motorhaube" verwendet.

Symbolische Verweisungen

Einige Sprachen, wie Perl, unterstützen symbolische Verweisungen, die gerade Schnur-Werte sind, die die Namen von Variablen enthalten. Wenn ein Wert, der nicht eine regelmäßige Verweisung ist, dereferenced ist, denkt Perl, dass es eine symbolische Verweisung ist, und gibt die Variable mit dem durch den Wert gegebenen Namen. PHP hat eine ähnliche Eigenschaft in der Form seiner Syntax.

Siehe auch

  • Abstraktion (Informatik)
  • Autovivification
  • Begrenzter Zeigestock
  • Dereferenceable Uniform-Quellenbezeichner
  • Magisches Plätzchen
  • Variable, (programmierend)
  • Schwache Verweisung

Außenverbindungen


Kinder des toten Punkts / William Winter
Impressum & Datenschutz