Автоматическая переменная

В компьютерном программировании автоматическая переменная — локальная переменная, которая выделяется и освобождается автоматически, когда поток выполнения программы входит и выходит из области действия переменной. Область действия — это лексический контекст, в частности, функция или блок, в котором определена переменная. Локальные данные обычно (в большинстве языков) невидимы вне функции или лексического контекста, в котором они определены. Локальные данные также невидимы и недоступны для вызываемой функции[note 1], но не освобождаются, возвращаясь в область видимости, когда поток выполнения возвращается к вызывающей стороне.

Понятие автоматических локальных переменных в первую очередь применяется в рекурсивных языках с лексической областью видимости[note 2]. Автоматические локальные переменные обычно размещаются в стековом кадре процедуры, в которой они объявлены[note 3]. Первоначально это было сделано для достижения повторного входа и разрешения рекурсии[note 4], — соображение, которое актуально и сегодня. Концепция автоматических переменных в рекурсивных (и вложенных) функциях в языке с лексической областью видимости была представлена широкой аудитории вместе с ALGOL в конце 1950-х годов и получила дальнейшее распространение благодаря его многочисленным потомкам.

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

В конкретных языках программирования править

C, C++ править

Все переменные, объявленные в блоке кода, по умолчанию являются автоматическими. Неинициализированная автоматическая переменная имеет неопределенное значение до тех пор, пока ей не будет присвоено допустимое значение ее типа.[1] Cпецификатор auto может быть добавлен к объявлениям этих переменных, но, поскольку по умолчанию все они автоматические, это совершенно избыточно и делается редко.

В C использование ключевого слова register является подсказкой компилятору, о необходимости кэширования переменной в регистре процессора. Помимо запрещения использования оператора адреса (&) для переменной или любого из ее подкомпонентов, компилятор может игнорировать данную подсказку.[2]

В C++ конструктор автоматических переменных вызывается, когда выполнение достигает места объявления. Деструктор вызывается, когда он достигает конца заданного блока программы (блоки программы заключены в фигурные скобки). Эта функция часто используется для управления выделением и освобождением ресурсов, например для открытия и автоматического закрытия файлов или освобождения памяти. См. раздел «Инициализация ресурсов — это инициализация (RAII)».

Начиная с C++11, C++ позволяет объявлять переменные с ключевым словом auto[3], но это означает, что тип переменной выводится и не относится к области действия переменной.

Java править

(Автоматические переменные называются локальными переменными)

Подобно C и C++, но здесь нет ключевого слова auto или register. Однако компилятор Java не позволит использовать локальную переменную, явно не инициализированную и выдаст ошибку компиляции (в отличие от C и C++, где компилятор обычно выдает только предупреждение). Стандарт языка Java требует, чтобы инициализацию каждой локальной переменной перед её использованием.[4] Это отличается от переменных объектов, которые неявно инициализируются значениями по умолчанию (которые равны 0 для чисел и null для объектов).

Perl править

(Автоматические переменные называются лексическими, моими (my) или частными (private) переменными.)

В Perl локальные переменные объявляются с помощью оператора my. Неинициализированные скалярные переменные будут иметь значение undef; неинициализированные массивы или хэши будут иметь значение ().[5]

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

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

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

  1. если это не вложенная функция, которая определена вместе локальными данными
  2. хотя они существуют в похожей, но не идентичной форме также и в рекурсивных языках с динамической областью видимости, таких как старые варианты языка LISP
  3. , если не указано иное, к примеру, статические данные или данные кучи , которые указываются в некоторых языках
  4. Когда используется свойство реентерабельности подпрограммы, для рекурсии или иным образом, оптимизатор не должен пытаться размещать такие переменные в регистрах процессора (для эффективности), поскольку это нарушило бы реентерабельность.

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

  1. на 2008 год C standard. Дата обращения: 30 августа 2022. Архивировано 11 января 2018 года. (3.61 MiB): section 6.2.4, Storage durations of objects
  2. Storage Duration, Архивировано из оригинала 9 октября 2022, Дата обращения: 30 августа 2022
  3. Placeholder type specifiers, Архивировано из оригинала 20 октября 2016, Дата обращения: 30 августа 2022
  4. 4.12.5 Initial Values of Variables. Sun Microsystems. Дата обращения: 17 октября 2008. Архивировано 5 сентября 2012 года.
  5. Private variables via my() - perlsub - perldoc.perl.org. Дата обращения: 17 октября 2008. Архивировано 21 сентября 2020 года.
  6. Temporary values via local() - perlsub - perldoc.perl.org. Дата обращения: 25 февраля 2011. Архивировано 21 сентября 2020 года.