stringtranslate.com

Переменная (информатика)

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

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

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

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

Действия над переменной

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

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

Переменные и область действия:

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

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

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

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

Масштаб и объем

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

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

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

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

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

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

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

Печатание

В статически типизированных языках, таких как C , C++ , Java или C# , переменная также имеет тип , что означает, что в ней могут храниться только определенные виды значений. Например, переменной типа « integer » запрещено хранить текстовые значения. [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++ (через new и delete) и все объекты в Java. Неявные кучно-динамические переменные привязаны к куче только тогда, когда им присваиваются значения. Выделение и освобождение происходят, когда значения переназначаются переменным. В результате неявные динамические переменные кучи обладают наивысшей степенью гибкости. Основными примерами являются некоторые переменные в JavaScript, PHP и все переменные в APL.

Смотрите также

Примечания

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

Ссылки

  1. ^ Брукшир 2019, стр. 249, «Переменные и типы данных», «языки программирования высокого уровня позволяют ссылаться на области в основной памяти с помощью описательных имен, а не числовых адресов».
  2. ^ Ахо, Альфред В.; Сети, Рави; Ульман, Джеффри Д. (1986), Компиляторы: принципы, методы и инструменты , стр. 26–28, Bibcode : 1986cptt.book.....A
  3. ^ Кнут, Дональд (1997). Искусство программирования . Том 1 (3-е изд.). Рединг, Массачусетс: Addison-Wesley. С. 3–4. ISBN 0-201-89683-4.
  4. ^ "Программирование с переменными". Khan Academy . Получено 23 марта 2020 г.
  5. ^ "Scratch for Budding Coders". Гарвард . Получено 23 марта 2020 г.
  6. ^ "Статическая типизация - Глоссарий MDN Web Docs: Определения терминов, связанных с Интернетом | MDN". developer.mozilla.org . 2023-06-08 . Получено 2024-05-06 .
  7. ^ Как не выбирать переменные, получено 11 июля 2012 г. [МЕРТВАЯ ССЫЛКА]
  8. ^ Эдсгер Дейкстра , К черту «значимые идентификаторы»!

Цитируемые работы