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

В компьютерном программировании , А переменная или скалярная является местом хранения (идентифицируется адресом памяти ) в паре с соответствующим символическим именем , которое содержит некоторые известные или неизвестное количество информации , указанной в качестве значения . Имя переменной - это обычный способ ссылки на сохраненное значение, помимо ссылки на саму переменную, в зависимости от контекста. Такое разделение имени и содержания позволяет использовать имя независимо от точной информации, которую оно представляет. Идентификатор в исходном коде компьютера может быть привязан к значению во время выполнения, и значение переменной, таким образом, может изменяться в процессе выполнения программы . [1] [2] [3] [4]

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

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

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

Действия с переменной [ править ]

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

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

Переменные - это контейнеры для хранения значений.

Переменные и объем:

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

Идентификаторы, ссылающиеся на переменную [ править ]

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

Например, на переменную может ссылаться идентификатор " total_count", а переменная может содержать номер 1956. Если на ту же переменную ссылается также идентификатор " r", и при использовании этого идентификатора " r" значение переменной равно изменен на 2009, то чтение значения с использованием идентификатора " total_count" даст результат 2009, а не 1956.

Если на переменную ссылается только один идентификатор, этот идентификатор можно просто назвать именем переменной ; в противном случае мы можем говорить об этом как об одном из имен переменной . Например, в предыдущем примере идентификатор « total_count» - это имя рассматриваемой переменной, а « r» - другое имя той же переменной.

Объем и степень [ править ]

Объем переменного описывает , где в тексте программы может быть использован переменная, в то время как степень (или срок службы ) описывает , когда в выполнении программы переменные имеет (значимое) значение. Область видимости переменной фактически является свойством имени переменной, а степень - свойством самой переменной. Их не следует путать с контекстом (также называемым средой ), который является свойством программы и варьируется в зависимости от места в исходном коде или выполнении - см. « Объем: обзор» . Кроме того, время жизни объекта может совпадать со временем жизни переменной, но во многих случаях не привязано к времени жизни переменной.

Область действия имени переменной влияет на ее размер .

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

С другой стороны, экстент - это динамический ( динамический ) аспект переменной. Каждая привязка переменной к значению может иметь свой собственный экстент во время выполнения. Степень привязки - это часть времени выполнения программы, в течение которой переменная продолжает ссылаться на то же значение или ячейку памяти. Работающая программа может входить и выходить из заданного экстента много раз, как в случае закрытия .

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

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

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

Многие языки программирования используют зарезервированное значение (часто называемое null или nil ), чтобы указать недопустимую или неинициализированную переменную.

Печатать [ править ]

В языках со статической типизацией, таких как Java или ML , переменная также имеет тип , что означает, что в ней могут храниться только определенные типы значений. Например, переменной типа « целое число » запрещено хранить текстовые значения.

В языках с динамической типизацией, таких как 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] Большинство современных языков чувствительны к регистру; некоторые старые языки - нет. Некоторые языки резервируют определенные формы имен переменных для собственного внутреннего использования; во многих языках имена, начинающиеся с двух знаков подчеркивания («__»), часто подпадают под эту категорию.

Однако, помимо основных ограничений, накладываемых языком, именование переменных в значительной степени зависит от стиля. На уровне машинного кода имена переменных не используются, поэтому выбранные точные имена не имеют значения для компьютера. Таким образом, имена переменных идентифицируют их, в остальном они просто инструмент для программистов, упрощающий написание и понимание программ. Использование плохо выбранных имен переменных может затруднить анализ кода, чем неописательные имена, поэтому часто рекомендуется использовать понятные имена. [5] [6]

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

Типы переменных (в зависимости от времени жизни) [ править ]

Что касается классификации переменных, мы можем классифицировать переменные на основе их времени жизни. Переменные различных типов: статические, динамические в стеке, явные динамические в куче и неявные динамические в динамике. Статическая переменная также известна как глобальная переменная, она привязывается к ячейке памяти до начала выполнения и остается в той же ячейке памяти до завершения. Типичный пример - статические переменные в C и C ++. Переменная, динамическая в стеке, известна как локальная переменная, которая привязывается при выполнении оператора объявления и освобождается при возврате из процедуры. Основными примерами являются локальные переменные в подпрограммах C и методы Java. Явные динамические переменные кучи - это безымянные (абстрактные) ячейки памяти, которые выделяются и освобождаются явными инструкциями времени выполнения, указанными программистом.Основными примерами являются динамические объекты в C ++ (через new и delete) и все объекты в Java. Неявные динамические переменные кучи привязываются к хранилищу кучи только тогда, когда им присваиваются значения. Распределение и деблокирование происходят, когда значения повторно присваиваются переменным. В результате неявные динамические переменные кучи обладают наивысшей степенью гибкости. Основными примерами являются некоторые переменные в JavaScript, PHP и все переменные в APL.

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

  • Управляющая переменная (программирование)
  • Нелокальная переменная
  • Временная переменная
  • Переменная интерполяция
  • Скаляр (математика)

Заметки [ править ]

  1. ^ Например, Haskell требует, чтобы имена типов начинались с заглавной буквы.

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

  1. ^ Компиляторы: принципы, методы и инструменты , стр. 26–28
  2. ^ Кнут, Дональд (1997). Искусство программирования . 1 (3-е изд.). Ридинг, Массачусетс: Эддисон-Уэсли. С. 3–4. ISBN 0-201-89683-4.
  3. ^ «Программирование с переменными» . Ханская академия . Проверено 23 марта 2020 года .
  4. ^ "Scratch для начинающих кодеров" . Гарвард . Проверено 23 марта 2020 года .
  5. ^ Как не выбирать переменные , получено 11 июля 2012 г. [DEAD LINK]
  6. ^ Эдсгер Дейкстра , К черту «значимые идентификаторы»!