Ценность (информатика)
Эта статья нуждается в дополнительных цитатах для проверки . ( август 2009 г. ) |
В информатике и программировании значение — это представление некоторой сущности, которой может манипулировать программа. Членами типа являются значения этого типа. [1]
«Значение переменной» задается соответствующим отображением в среде . [2] В языках с назначаемыми переменными становится необходимым различать r-значение (или содержимое) и l-значение (или местоположение) переменной. [3]
В декларативных (высокоуровневых) языках значения должны быть ссылочно прозрачными . Это означает, что результирующее значение не зависит от местоположения выражения, необходимого для вычисления значения. Значимы только содержимое ячейки (биты, равные они 1 или 0) и их интерпретация. [ нужна ссылка ]
Категория значения
[ редактировать ]Несмотря на свое название, в стандартах языка C++ эта терминология используется для категоризации выражений, а не значений. [4] : 8.2.1
Задание: l-значения и r-значения
[ редактировать ]В некоторых языках используется идея l-значений и r-значений , происходящая из типичного способа вычисления в левой и правой части оператора присваивания. L-значение относится к объекту, который сохраняется за пределами одного выражения. R-значение — это временное значение, которое не сохраняется за пределами выражения, в котором оно используется. [5]
Понятие l-значений и r-значений было введено в Комбинированном языке программирования (CPL). Понятия в выражении r-значения, l-значения и r-значения/l-значения аналогичны режимам параметров входного параметра (имеет значение), выходного параметра (может быть назначен) и входного/выходного параметра. (имеет значение и может быть присвоено), хотя технические детали различаются в зависимости от контекста и языка.
R-значения и адреса
[ редактировать ]Во многих языках, особенно в семействе C , l-значения имеют адреса хранения , которые программно доступны для работающей программы (например, через какой-либо оператор адреса, такой как «&» в C/C++), что означает, что они являются переменными или детерминантами. ссылочные ссылки на определенную ячейку памяти. R-значения могут быть l-значениями (см. ниже) или не-l-значениями — этот термин используется только для отличия от l-значений. Рассмотрим выражение C 4 + 9
. При выполнении компьютер генерирует целое число 13, но поскольку программа явно не указала, где в компьютере хранится это число 13, выражение не является l-значением. С другой стороны, если программа на языке C объявляет переменную x и присваивает переменной x значение 13, то выражение x
имеет значение 13 и является l-значением.
В C термин l-значение первоначально означал что-то, чему можно было присвоить (отсюда и название, указывающее на то, что оно находится слева от оператора присваивания), но поскольку зарезервированное слово const
(константа) был добавлен в язык, теперь термин «изменяемое l-значение». В C++11 специальный семантический глиф &&
существует (не путать с &&
оператор, используемый для логических операций), чтобы обозначить использование/доступ к адресу выражения для компилятора только ; т. е. адрес не может быть получен с помощью адреса-из &
оператор во время выполнения программы (см. использование семантики перемещения ). Добавление семантики перемещения усложнило таксономию классификации значений, добавив к ней концепцию xvalue (значение с истекающим сроком действия), которое относится к объекту, срок службы которого приближается к концу, ресурсы которого можно использовать повторно (обычно путем их перемещения). Это также привело к созданию категорий glvalue (обобщенное lvalue), которые представляют собой lvalue и xvalues, и prvalues (чистые rvalues), которые представляют собой rvalues, не являющиеся xvalues. [6]
Этот тип ссылки может применяться ко всем r-значениям, включая не-l-значения, а также l-значения. Некоторые процессоры предоставляют одну или несколько инструкций, которые принимают немедленное значение , иногда для краткости называемое «немедленным». Непосредственное значение сохраняется как часть инструкции, которая его использует, обычно для загрузки в регистр, добавления или вычитания из него. Другими частями инструкции являются код операции и пункт назначения. Последнее может быть неявным. (Непрямое значение может находиться в регистре или храниться в другом месте памяти, что требует, чтобы инструкция содержала прямой или косвенный адрес [например, адрес индексного регистра] значения.)
Выражение l-значения обозначает объект (ссылается на него). Неизменяемое значение l адресно, но не назначаемо. Изменяемое значение l позволяет не только исследовать обозначенный объект, но и изменять его. Значение r — это любое выражение, значение, отличное от l, — это любое выражение, которое не является значением l. Одним из примеров является «непосредственное значение» (см. выше), которое, следовательно, не адресуется.
На языке ассемблера
[ редактировать ]Значением может быть практически любой тип данных заданного типа , например строка, цифра или одна буква.
Процессоры часто поддерживают более одного размера непосредственных данных, например 8 или 16 бит, используя уникальный код операции и мнемонику для каждого варианта инструкции. Если программист предоставляет значение данных, которое не подходит, ассемблер выдает сообщение об ошибке «Вне диапазона». Большинство ассемблеров позволяют выражать непосредственное значение в виде ASCII , десятичных , шестнадцатеричных , восьмеричных или двоичных данных. Таким образом, символ ASCII 'A'
то же самое, что 65
или 0x41
. Порядок байтов строк может различаться на разных процессорах в зависимости от ассемблера и архитектуры компьютера.
Примечания
[ редактировать ]- ^ Митчелл 1996 , с. 9.
- ^ Ахо, Альфред В.; Лам, Моника С.; Сетхи, Рави; Уллман, Джеффри Д. (1986). Составители: принципы, методы и инструменты . Издательство Аддисон-Уэсли. ISBN 0-201-10088-6 .
- ^ Митчелл 1996 , стр. 389–390.
- ^ «ISO/IEC 14882:2017 Языки программирования — C++» . 2017.
- ^ «Lvalues и Rvalues (Visual C++)» . Сеть разработчиков Microsoft . Проверено 3 сентября 2016 г.
- ^ Уильям М. Миллер. «Таксономия категорий значений выражений» (PDF) .
Ссылки
[ редактировать ]- Митчелл, Джон К. (1996). Основы языков программирования . Массачусетский технологический институт Пресс. ISBN 0-262-13321-0 .
- Стрейчи, Кристофер (2000). «Фундаментальные концепции языков программирования». Вычисления высшего порядка и символьные вычисления . 13 :11–49. дои : 10.1023/А:1010000313106 . S2CID 14124601 .