Переменная (информатика)
Эта статья нуждается в дополнительных цитатах для проверки . ( ноябрь 2009 г. ) |
В компьютерном программировании переменная — это абстрактное место хранения, связанное с соответствующим символическим именем , которое содержит некоторое известное или неизвестное количество данных или объекта , называемое значением ; или, проще говоря, переменная — это именованный контейнер для определенного набора битов или типа данных (например, целое число , число с плавающей запятой , строка и т. д.). [1] Переменная может в конечном итоге быть связана с адресом памяти или идентифицироваться по нему . Имя переменной — это обычный способ ссылки на сохраненное значение, а также ссылка на саму переменную, в зависимости от контекста. Такое разделение имени и содержания позволяет использовать имя независимо от точной информации, которую оно представляет. Идентификатор в исходном коде компьютера может быть привязан к значению во время выполнения , и, таким образом, значение переменной может меняться в ходе выполнения программы . [2] [3] [4] [5]
Переменные в программировании могут не соответствовать напрямую понятию переменных в математике . Последний является абстрактным и не имеет ссылки на физический объект, такой как место хранения. Значение вычислительной переменной не обязательно является частью уравнения или формулы , как в математике. Переменным в компьютерном программировании часто дают длинные имена, чтобы сделать их относительно информативными, тогда как переменные в математике часто имеют краткие одно- или двухсимвольные имена для краткости при транскрипции и манипуляциях.
На место хранения переменной могут ссылаться несколько разных идентификаторов, такая ситуация называется псевдонимом . Присвоение значения переменной с использованием одного из идентификаторов изменит значение, к которому можно получить доступ через другие идентификаторы.
Компиляторам приходится заменять символические имена переменных фактическим расположением данных. Хотя имя, тип и местоположение переменной часто остаются неизменными, данные, хранящиеся в этом месте, могут быть изменены во время выполнения программы.
Действия над переменной
[ редактировать ]В императивных языках программирования значения обычно могут быть доступны или изменены в любое время. В чисто функциональных и логических языках переменные привязаны к выражениям и сохраняют одно значение в течение всего своего существования из-за требований ссылочной прозрачности . В императивных языках такое же поведение демонстрируют (именованные) константы (символические константы), которые обычно противопоставляются (обычным) переменным.
В зависимости от системы типов языка программирования переменные могут хранить только указанный тип данных (например, целое число или строка ). Альтернативно, тип данных может быть связан только с текущим значением, что позволяет хранить в одной переменной все, что поддерживается языком программирования. Переменные — это контейнеры для хранения значений.
Переменные и область видимости:
- Автоматические переменные : каждая локальная переменная в функции возникает только при вызове функции и исчезает при выходе из функции. Такие переменные известны как автоматические переменные.
- Внешние переменные: это переменные, которые являются внешними по отношению к функции и к которым может обращаться любая функция по имени. Эти переменные существуют постоянно; вместо того, чтобы появляться и исчезать при вызове и выходе из функции, они сохраняют свои значения даже после того, как функции, которые их установили, вернулись.
Идентификаторы, ссылающиеся на переменную
[ редактировать ]Идентификатор, ссылающийся на переменную, может использоваться для доступа к переменной с целью считывания значения, изменения значения или редактирования других атрибутов переменной, таких как разрешение доступа, блокировки , семафоры и т. д.
Например, на переменную может ссылаться идентификатор « total_count
" и переменная может содержать число 1956. Если на ту же переменную ссылается идентификатор " r
" а также, и если использовать этот идентификатор " r
", значение переменной изменяется на 2009, затем считывается значение по идентификатору " total_count
" даст результат 2009 года, а не 1956 года.
Если на переменную ссылается только один идентификатор, этот идентификатор можно просто назвать именем переменной ; в противном случае мы можем говорить об этом как об одном из имен переменной . Например, в предыдущем примере идентификатор " total_count
" — это имя рассматриваемой переменной, а " r
" — другое имя той же переменной.
Объем и масштабы
[ редактировать ]Область действия переменной описывает, где в тексте программы эта переменная может использоваться, а степень ( также называемая временем жизни ) переменной описывает, когда при выполнении программы переменная имеет (значимое) значение. Область видимости переменной влияет на ее размер. Область видимости переменной на самом деле является свойством имени переменной, а экстент — это свойство места хранения переменной. Их не следует путать с контекстом (также называемым средой ), который является свойством программы и варьируется в зависимости от места в тексте программы или ее выполнении — см. область действия: обзор . Кроме того, время жизни объекта может совпадать со временем жизни переменной, но во многих случаях не привязано к нему.
Область действия — важная часть разрешения имени переменной. Большинство языков определяют конкретную область действия для каждой переменной (а также любого другого именованного объекта), которая может отличаться в пределах конкретной программы. Область действия переменной — это часть текста программы, для которой имя переменной имеет значение и для которой переменная считается «видимой». Вход в эту область обычно начинается со времени существования переменной (по мере того, как она попадает в контекст), а выход из этой области обычно завершает ее жизнь (поскольку она выходит из контекста). Например, переменная с « лексической областью действия » имеет смысл только внутри определенной функции/ подпрограммы или, точнее, внутри блока выражений/операторов (в соответствии с областью действия функции или областью действия блока ); это статическое разрешение, выполняемое во время анализа или компиляции. Альтернативно, переменная с динамической областью действия разрешается во время выполнения на основе глобального стека привязок , который зависит от конкретного потока управления . Переменные, доступные только внутри определенных функций, называются « локальные переменные ». « Глобальная переменная » или переменная с неопределенной областью действия может упоминаться в любом месте программы.
Extent С другой стороны, — это динамический аспект переменной во время выполнения. Каждая привязка переменной к значению может иметь свой собственный экстент во время выполнения. Степень привязки — это часть времени выполнения программы, в течение которой переменная продолжает ссылаться на одно и то же значение или ячейку памяти. Выполняемая программа может входить и выходить из данного экстента много раз, как в случае закрытия .
Если язык программирования не поддерживает сборку мусора , переменная, размер которой постоянно превышает ее область действия, может привести к утечке памяти , в результате чего память, выделенная для этой переменной, никогда не может быть освобождена, поскольку переменная, которая будет использоваться для ссылки на нее в целях освобождения, больше не используется. доступный. Однако привязка переменной может выходить за пределы ее области действия, как это происходит в замыканиях Lisp и статических локальных переменных C ; когда выполнение возвращается в область действия переменной, переменную можно снова использовать. Переменная, область действия которой начинается до того, как начинается ее экстент, считается неинициализированной и часто имеет неопределенное произвольное значение при доступе (см. «дикий указатель» ), поскольку ей еще не было явно присвоено конкретное значение. Переменная, экстент которой заканчивается раньше, чем ее область действия, может стать висячим указателем и снова считаться неинициализированной, поскольку ее значение было уничтожено. Переменные, описанные в двух предыдущих случаях, можно назвать выходящими за пределы экстента или несвязанными . Во многих языках попытка использовать значение переменной, выходящее за пределы ее размера, является ошибкой. На других языках это может дать непредсказуемые результаты . Однако такой переменной можно присвоить новое значение, что придаст ей новый размер.
В целях экономии пространства пространство памяти, необходимое для переменной, может быть выделено только тогда, когда переменная используется впервые, и освобождено, когда она больше не нужна. Переменная необходима только тогда, когда она находится в области видимости, поэтому начало жизни каждой переменной, когда она входит в область видимости, может освободить место для неиспользуемых переменных. Чтобы избежать пустой траты такого пространства, компиляторы часто предупреждают программистов, если переменная объявлена, но не используется.
Хорошей практикой программирования считается максимально сужение области действия переменных, чтобы разные части программы случайно не взаимодействовали друг с другом, изменяя переменные друг друга. Это также предотвращает действия на расстоянии . Общие методы для этого заключаются в том, чтобы разные разделы программы использовали разные пространства имен или делали отдельные переменные «частными» с помощью динамической или лексической области видимости переменных .
Многие языки программирования используют зарезервированное значение (часто называемое null или nil ) для обозначения недопустимой или неинициализированной переменной.
Ввод текста
[ редактировать ]В статически типизированных языках, таких как C , C++ , Java или C# , переменная также имеет тип , что означает, что в ней могут храниться только определенные типы значений. Например, переменной типа « целое число » запрещено хранить текстовые значения. [6]
В динамически типизированных языках, таких как Python , тип переменной определяется по ее значению и может меняться в зависимости от ее значения. В Common Lisp обе ситуации существуют одновременно: переменной присваивается тип (если она не объявлена, предполагается, что она имеет тип). T
, универсальный супертип ), который существует во время компиляции. Значения также имеют типы, которые можно проверять и запрашивать во время выполнения.
Типирование переменных также позволяет полиморфизмы разрешать во время компиляции. Однако это отличается от полиморфизма, используемого в вызовах объектно-ориентированных функций (называемых виртуальными функциями в C++ ), который разрешает вызов на основе типа значения, а не супертипов, которые разрешено иметь переменной.
хранить в переменных значения других типов данных Переменные часто хранят простые данные, такие как целые числа и литеральные строки, но некоторые языки программирования позволяют также . Такие языки также могут позволять функциям быть параметрическими полиморфными . Эти функции действуют как переменные и представляют данные нескольких типов. Например, функция с именем length
может определять длину списка. Такой length
Функция может быть параметрически полиморфной за счет включения переменной типа в ее сигнатуру типа , поскольку количество элементов в списке не зависит от типов элементов.
Параметры
[ редактировать ]Формальные параметры (или формальные аргументы ) функций также называются переменными. Например, в этом Python сегменте кода :
>>> def addtwo(x):
... return x + 2
...
>>> addtwo(5)
7
переменная с именем x
является параметром, поскольку ему присваивается значение при вызове функции. Целое число 5 — это аргумент , который дает x
его ценность. В большинстве языков параметры функции имеют локальную область действия. Эта конкретная переменная с именем x
можно упоминать только в рамках addtwo
функция (хотя, конечно, другие функции также могут иметь переменные, называемые x
).
Распределение памяти
[ редактировать ]Особенности размещения переменных и представления их значений сильно различаются как среди языков программирования, так и среди реализаций данного языка. Многие реализации языка выделяют пространство для локальных переменных , размер которых сохраняется для одного вызова функции в стеке вызовов и чья память автоматически освобождается при возвращении функции. В более общем смысле, при привязке имени имя переменной привязывается к адресу некоторого конкретного блока (непрерывной последовательности) байтов в памяти, и операции над переменной манипулируют этим блоком. Ссылки чаще встречаются для переменных, значения которых имеют большие или неизвестные размеры при компиляции кода. Такие переменные ссылаются на местоположение значения, а не сохраняют само значение, которое выделяется из пула памяти, называемого кучей .
Связанные переменные имеют значения. Однако ценность — это абстракция, идея; в реализации значение представлено неким объектом данных , который хранится где-то в памяти компьютера. Программа или среда выполнения должны выделять память для каждого объекта данных и, поскольку память ограничена, гарантировать, что эта память будет предоставлена для повторного использования, когда объект больше не нужен для представления значения какой-либо переменной.
Объекты, выделенные из кучи, необходимо вернуть, особенно если они больше не нужны. В языках со сборкой мусора (таких как C# , Java , Python, Golang и Lisp ) среда выполнения автоматически освобождает объекты, когда существующие переменные больше не могут ссылаться на них. В языках без сборки мусора, таких как C , программа (и программист) должна явно выделить память, а затем освободить ее, чтобы освободить свою память. Невыполнение этого требования приводит к утечкам памяти , при которых куча истощается по мере выполнения программы, и существует риск возможного сбоя из-за исчерпания доступной памяти.
Когда переменная относится к структуре данных, созданной динамически, доступ к некоторым ее компонентам возможен только косвенно через переменную. В таких обстоятельствах сборщики мусора (или аналогичные функции программы на языках, в которых сборщики мусора отсутствуют) должны иметь дело со случаем, когда необходимо освободить только часть памяти, доступной из переменной.
Соглашения об именах
[ редактировать ]В отличие от своих математических аналогов, программные переменные и константы обычно имеют многосимвольные имена, например COST
или total
. Односимвольные имена чаще всего используются только для вспомогательных переменных; например, i
, j
, k
для индексных переменных массива .
Некоторые соглашения об именах применяются на уровне языка как часть синтаксиса языка, который включает формат допустимых идентификаторов. Почти во всех языках имена переменных не могут начинаться с цифры (0–9) и не могут содержать пробелов. Разрешены ли знаки препинания в именах переменных, варьируется от языка к языку; многие языки допускают только подчеркивание («_») в именах переменных и запрещают все остальные знаки препинания. В некоторых языках программирования к идентификаторам переменных добавляются символы (символы или знаки препинания), указывающие тип данных или область действия переменной.
Чувствительность к регистру имен переменных также варьируется в зависимости от языка, и некоторые языки требуют использования определенного регистра при именовании определенных объектов; [примечание 1] Большинство современных языков чувствительны к регистру; некоторые старые языки нет. Некоторые языки резервируют определенные формы имен переменных для собственного внутреннего использования; во многих языках имена, начинающиеся с двух символов подчеркивания («__»), часто подпадают под эту категорию.
Однако, помимо основных ограничений, налагаемых языком, именование переменных во многом является вопросом стиля. На уровне машинного кода имена переменных не используются, поэтому выбранные точные имена не имеют значения для компьютера. Таким образом, имена переменных идентифицируют их, в остальном они всего лишь инструмент для программистов, упрощающий написание и понимание программ. Использование неудачно выбранных имен переменных может затруднить просмотр кода, чем неописательные имена, поэтому часто приветствуются понятные имена. [7] [8]
Программисты часто создают и соблюдают рекомендации по стилю кода, которые предлагают рекомендации по именованию переменных или налагают точную схему именования. Более короткие имена вводятся быстрее, но они менее информативны; Более длинные имена часто облегчают чтение программ и понимание назначения переменных. Однако слишком многословие в именах переменных также может привести к тому, что код станет менее понятным.
Типы переменных (в зависимости от срока службы)
[ редактировать ]Мы можем классифицировать переменные по времени их жизни. Различные типы переменных: статические, динамические стека, явные динамические кучи и неявные динамические кучи. Статическая переменная также известна как глобальная переменная. Она привязывается к ячейке памяти до начала выполнения и остается в той же ячейке памяти до завершения. Типичным примером являются статические переменные в C и C++. Динамическая переменная стека известна как локальная переменная, которая привязывается при выполнении оператора объявления и освобождается при завершении процедуры. Основными примерами являются локальные переменные в подпрограммах C и методах Java. Явные динамические переменные кучи — это безымянные (абстрактные) ячейки памяти, которые выделяются и освобождаются явными инструкциями времени выполнения, указанными программистом. Основными примерами являются динамические объекты в C++ (через создание и удаление) и все объекты в Java. Неявные динамические переменные кучи привязываются к куче только тогда, когда им присвоены значения. Выделение и освобождение происходят, когда значения переназначаются переменным. В результате неявные динамические переменные кучи обладают высочайшей степенью гибкости. Основными примерами являются некоторые переменные в JavaScript, PHP и все переменные в APL.
См. также
[ редактировать ]- Управляющая переменная (программирование)
- Нелокальная переменная
- Временная переменная
- Переменная интерполяция
- Скаляр (математика)
Примечания
[ редактировать ]Ссылки
[ редактировать ]- ^ Брукшир 2019 , с. 249, «Переменные и типы данных», «языки программирования высокого уровня позволяют обращаться к местам в основной памяти по описательным именам, а не по числовым адресам».
- ^ Ахо, Альфред В.; Сетхи, Рави; Уллман, Джеффри Д. (1986), Составители: принципы, методы и инструменты , стр. 26–28, Bibcode : 1986cptt.book.....A
- ^ Кнут, Дональд (1997). Искусство компьютерного программирования . Том. 1 (3-е изд.). Ридинг, Массачусетс: Аддисон-Уэсли. стр. 3–4. ISBN 0-201-89683-4 .
- ^ «Программирование с переменными» . Ханская академия . Проверено 23 марта 2020 г.
- ^ «Скретч для начинающих программистов» . Гарвард . Проверено 23 марта 2020 г.
- ^ «Статическая типизация — Глоссарий MDN Web Docs: Определения терминов, связанных с Интернетом | MDN» . http://developer.mozilla.org . 08.06.2023 . Проверено 6 мая 2024 г.
- ^ Как не выбирать переменные , дата обращения 11 июля 2012 г. [МЕРТВАЯ ССЫЛКА]
- ^ Эдсгер Дейкстра , К черту «осмысленные идентификаторы»!
Цитируемые работы
[ редактировать ]- Брукшир, Дж. Гленн (2019). «Информатика: обзор» (PDF) . Проверено 1 апреля 2024 г.