Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

In computer science, a reference is a value that enables a program to indirectly access a particular datum, such as a variable's value or a record, in the computer's memory or in some other storage device. The reference is said to refer to the datum, and accessing the datum is called dereferencing the reference.

Ссылка отличается от самой базы данных. Обычно для ссылок на данные, хранящиеся в памяти в данной системе, ссылка реализуется как физический адрес того, где данные хранятся в памяти или на устройстве хранения. По этой причине ссылку часто ошибочно путают с указателем или адресом и говорят, что она «указывает на» данные. Однако ссылка также может быть реализована другими способами, такими как смещение (разница) между адресом данных и некоторым фиксированным «базовым» адресом, как индекс в массиве или, более абстрактно, как дескриптор . В более широком смысле, в сети ссылками могут быть сетевые адреса, например URL-адреса..

Понятие ссылки не следует путать с другими значениями ( ключами или идентификаторами ), которые однозначно идентифицируют элемент данных, но предоставляют доступ к нему только через нетривиальную операцию поиска в некоторой структуре данных таблицы .

Список литература широко используется в программировании , особенно эффективно передать большие или изменяемые данные в качестве аргументов для процедур , или для обмена таких данных между различным использованием. В частности, ссылка может указывать на переменную или запись, содержащую ссылки на другие данные. Эта идея лежит в основе косвенной адресации и многих связанных структур данных , таких как связанные списки . Ссылки могут вызвать значительную сложность программы, частично из-за возможности висящих и диких ссылок, а частично из-за того, что топология данных со ссылками представляет собой ориентированный граф., анализ которых может быть довольно сложным.

Преимущества [ править ]

Ссылки повышают гибкость в том, где можно хранить объекты, как они распределяются и как они передаются между областями кода. Пока можно получить доступ к ссылке на данные, можно получить доступ к данным через нее, и сами данные не нужно перемещать. Они также упрощают обмен данными между различными областями кода; каждый хранит ссылку на него.

Механизм ссылок, если он различается по реализации, является фундаментальной особенностью языка программирования, общей почти для всех современных языков программирования. Даже некоторые языки, которые не поддерживают прямое использование ссылок, имеют внутреннее или неявное использование. Например, соглашение о вызове по ссылке может быть реализовано с явным или неявным использованием ссылок.

Примеры [ править ]

Указатели - это самый примитивный тип ссылок. Из-за их тесной связи с базовым оборудованием они являются одним из самых мощных и эффективных типов справочных материалов. Однако также из-за этой связи указатели требуют от программиста четкого понимания деталей архитектуры памяти. Поскольку указатели хранят адрес ячейки памяти, а не значение напрямую, неправильное использование указателей может привести к неопределенному поведению в программе, особенно из-за висящих указателей или диких указателей . Умные указатели - это непрозрачные структуры данных, которые действуют как указатели, но к ним можно получить доступ только с помощью определенных методов.

Ручка является абстрактной ссылкой, и может быть представлена различными способами. Типичным примером являются дескрипторы файлов (структура данных FILE в стандартной библиотеке ввода-вывода C ), используемые для абстрагирования содержимого файла. Обычно он представляет как сам файл, как при запросе блокировки файла, так и определенную позицию в содержимом файла, как при чтении файла.

В распределенных вычислениях ссылка может содержать больше, чем адрес или идентификатор; он также может включать встроенную спецификацию сетевых протоколов, используемых для поиска и доступа к объекту, на который имеется ссылка, а также способ кодирования или сериализации информации. Таким образом, например, WSDL- описание удаленной веб-службы можно рассматривать как форму ссылки; он включает полную спецификацию того, как найти и привязать к определенной веб-службе . Ссылка на живой распределенный объект - еще один пример: это полная спецификация того, как создать небольшой программный компонент, называемый прокси.который впоследствии будет участвовать в одноранговом взаимодействии и посредством которого локальный компьютер может получить доступ к данным, которые реплицируются или существуют только в виде слабо согласованного потока сообщений. Во всех этих случаях справочник включает полный набор инструкций или рецепт доступа к данным; в этом смысле он служит той же цели, что и идентификатор или адрес в памяти.

Официальное представительство [ править ]

В более общем смысле ссылку можно рассматривать как часть данных, которая позволяет однозначно извлекать другую часть данных. Сюда входят первичные ключи в базах данных и ключи в ассоциативном массиве . Если у нас есть набор ключей K и набор объектов данных D , любая четко определенная (однозначная) функция от K до D ∪ { null } определяет тип ссылки, где null - это изображение ключа, не имеющего ссылки к чему-нибудь значимому.

Альтернативным представлением такой функции является ориентированный граф, называемый графом достижимости . Здесь каждый элемент данных представлен вершиной, и есть ребро от u до v, если элемент данных в u относится к данным в v . Максимальный выпускной диплом - один. Эти графики полезны при сборке мусора , где их можно использовать для отделения доступных от недоступных объектов .

Внешнее и внутреннее хранилище [ править ]

Во многих структурах данных большие сложные объекты состоят из более мелких. Эти объекты обычно хранятся одним из двух способов:

  1. Во внутренней памяти содержимое меньшего объекта хранится внутри большего объекта.
  2. При использовании внешнего хранилища более мелкие объекты размещаются в своем собственном месте, а более крупный объект хранит только ссылки на них.

Внутреннее хранилище обычно более эффективно, потому что для ссылок и метаданных динамического распределения существуют затраты на пространство , а также временные затраты, связанные с разыменованием ссылки и выделением памяти для более мелких объектов. Внутреннее хранилище также увеличивает локальность ссылок , сохраняя в памяти разные части одного и того же большого объекта рядом. Однако существует множество ситуаций, в которых предпочтительнее внешнее хранилище:

  • Если структура данных рекурсивная , то есть она может содержать себя. Это не может быть представлено во внутреннем виде.
  • Если более крупный объект хранится в области с ограниченным пространством, такой как стек, то мы можем предотвратить исчерпание памяти, сохраняя большие объекты-компоненты в другой области памяти и обращаясь к ним с помощью ссылок.
  • Если более мелкие объекты могут различаться по размеру, часто бывает неудобно или дорого изменять размер более крупного объекта, чтобы он все еще мог их содержать.
  • Часто со ссылками легче работать, и они лучше адаптируются к новым требованиям.

Некоторые языки, такие как Java , Smalltalk , Python и Scheme , не поддерживают внутреннюю память. В этих языках доступ ко всем объектам единообразно осуществляется через ссылки.

Языковая поддержка [ править ]

В языках ассемблера , которые использовались первыми, ссылки обычно выражаются с использованием либо необработанных адресов памяти, либо индексов в таблицах. Они работают, но их несколько сложно использовать, потому что адрес ничего не говорит вам о значении, на которое он указывает, даже о том, насколько он велик или как его интерпретировать; такая информация закодирована в логике программы. В результате неправильные интерпретации могут возникать в некорректных программах, вызывая непонятные ошибки.

Одной из самых ранних непрозрачных ссылок была ссылка на cons-ячейку языка Lisp , которая представляет собой просто запись, содержащую две ссылки на другие объекты Lisp, включая, возможно, другие cons-ячейки. Эта простая структура чаще всего используется для построения односвязных списков , но также может использоваться для построения простых двоичных деревьев и так называемых «точечных списков», которые заканчиваются не пустой ссылкой, а значением.

Другой ранний язык, Fortran, не имеет явного представления ссылок, но использует их неявно в своей семантике вызова по ссылке .

Указатель еще один из самых популярных видов литературы сегодня. Он похож на ассемблерное представление необработанного адреса, за исключением того, что он несет статический тип данных, который можно использовать во время компиляции, чтобы гарантировать, что данные, на которые он ссылается, не будут неправильно истолкованы. Однако, поскольку C имеет слабую систему типов, которая может быть нарушена с помощью приведений (явных преобразований между различными типами указателей и между типами указателей и целыми числами), неправильная интерпретация все еще возможна, хотя и более трудна. Его преемник C ++ попытался повысить безопасность типов указателей с помощью новых операторов приведения и интеллектуальных указателей в своей стандартной библиотеке., но по-прежнему сохраняет возможность обхода этих механизмов безопасности для обеспечения совместимости.

Ряд популярных сегодня основных языков, таких как Eiffel , Java , C # и Visual Basic , приняли гораздо более непрозрачный тип ссылки, обычно называемый просто ссылкой . Эти ссылки имеют такие типы, как указатели C, указывающие, как интерпретировать данные, на которые они ссылаются, но они безопасны по типу, поскольку не могут быть интерпретированы как необработанный адрес, а небезопасные преобразования не разрешены.

Фортран [ править ]

A Fortran reference is best thought of as an alias of another object, such as a scalar variable or a row or column of an array. There is no syntax to dereference the reference or manipulate the contents of the referent directly. Fortran references can be null. As in other languages, these references facilitate the processing of dynamic structures, such as linked lists, queues, and trees.

Functional languages[edit]

Во всех вышеупомянутых настройках концепция изменяемых переменных , данных, которые могут быть изменены, часто подразумевает неявное использование ссылок. В Standard ML , OCaml и многих других функциональных языках большинство значений являются постоянными: они не могут быть изменены путем присвоения. Назначаемые «ссылочные ячейки» служат неизбежным целям изменяемых ссылок в императивных языках и делают возможность изменения явной. Такие ссылочные ячейки могут содержать любое значение, поэтому им присваивается полиморфный тип α ref, гдеαзаменяется указанным типом значения. Эти изменяемые ссылки могут указывать на разные объекты в течение их времени жизни. Например, это позволяет строить круговые структуры данных. Ссылочная ячейка функционально эквивалентна массиву длины 1.

Для обеспечения безопасности и эффективности реализации в ML нельзя приводить к типу ссылки , а также выполнять арифметические операции с указателями. Важно отметить, что в функциональной парадигме многие структуры, которые могут быть представлены с помощью указателей на таком языке, как C, представлены с использованием других средств, таких как мощный механизм алгебраических типов данных . Затем программист может пользоваться определенными свойствами (такими как гарантия неизменности) во время программирования, даже если компилятор часто использует машинные указатели «под капотом».

Символические ссылки [ править ]

Некоторые языки, например Perl , поддерживают символические ссылки , которые представляют собой просто строковые значения, содержащие имена переменных. Когда значение, которое не является обычной ссылкой, разыменовано, Perl считает это символической ссылкой и дает переменную с именем, заданным значением. [1] PHP имеет аналогичную функцию в форме $$varсинтаксиса. [2]

Ссылки на объектно-ориентированных языках [ править ]

Многие объектно-ориентированные языки широко используют ссылки. Они могут использовать ссылки для доступа к объектам и их назначения . Ссылки также используются в вызовах функций / методов или при передаче сообщений, а счетчики ссылок часто используются для выполнения сборки мусора неиспользуемых объектов.

См. Также [ править ]

  • Тип ссылки
  • Абстракция (информатика)
  • Автоживление
  • Ограниченный указатель
  • Разыменяемый унифицированный идентификатор ресурса
  • Волшебное печенье
  • Переменная (программирование)
  • Слабая ссылка

Ссылки [ править ]

  1. ^ "perlref" . perldoc.perl.org . Проверено 19 августа 2013 .
  2. ^ «Переменные переменные - Руководство» . PHP . Проверено 19 августа 2013 .

Внешние ссылки [ править ]

  • Pointer Fun With Binky Введение в указатели в 3-минутном обучающем видео - Stanford Computer Science Education Library