Введение

В компьютерном программировании автоматическая переменная – это локальная переменная, которая автоматически выделяется и освобождается при входе и выходе из области видимости переменной. Область видимости – это лексический контекст, в частности, функция или блок, в котором переменная определена. Локальные данные обычно (в большинстве языков) невидимы вне функции или лексического контекста, где они определены. Локальные данные также невидимы и недоступны для вызываемой функции, но не освобождаются, а возвращаются в область видимости при возврате потока выполнения к вызывающей функции. Автоматические локальные переменные в основном применяются в рекурсивных языках с лексической областью видимости. Автоматические локальные переменные обычно выделяются в стековом кадре процедуры, в которой они объявлены. Это изначально было сделано для обеспечения повторного входа и поддержки рекурсии, что остаётся актуальным и сегодня. Концепция автоматических переменных в рекурсивных (и вложенных) функциях в языке с лексической областью видимости была представлена широкой аудитории с появлением ALGOL в конце 1950-х годов и впоследствии популяризирована его многочисленными потомками. Термин "локальная переменная" обычно является синонимом "автоматической переменной", поскольку во многих языках программирования это одно и то же, но "локальная" – понятие более общее: большинство локальных переменных являются автоматическими локальными переменными, однако существуют и статические локальные переменные, особенно в C. Для статической локальной переменной выделение памяти происходит статически (время жизни – всё время выполнения программы), а не автоматически, но она активна только во время выполнения функции.

C, C++

(Называются автоматическими переменными.) Все переменные, объявленные внутри блока кода, по умолчанию являются автоматическими. Неинициализированная автоматическая переменная имеет неопределенное значение до тех пор, пока ей не будет присвоено допустимое значение своего типа. Спецификатор класса хранения `auto` также может быть добавлен к этим объявлениям переменных, но поскольку все они автоматические по умолчанию, это совершенно избыточно и редко делается. В языке C использование спецификатора `register` является подсказкой компилятору для кэширования переменной в регистре процессора. Помимо того, что не позволяет использовать оператор взятия адреса (&) для переменной или любого из её подкомпонентов, компилятор может игнорировать эту подсказку. В C++ конструктор автоматической переменной вызывается, когда выполнение достигает места её объявления. Деструктор вызывается, когда выполнение достигает конца данного программного блока (программные блоки заключаются в фигурные скобки). Эта возможность часто используется для управления выделением и освобождением ресурсов, например, для открытия и автоматического закрытия файлов или освобождения памяти. См. принцип "Приобретение ресурса – это инициализация" (RAII). Начиная с C++11, C++ позволяет объявлять переменные с использованием спецификатора типа `auto`, но это означает, что тип переменной определяется автоматически и не относится к области видимости переменной.

Ява

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

Перл

(Называются лексическими, моими или приватными переменными.) В Perl локальные переменные объявляются с помощью оператора `my`. Неинициализированные скаляры будут иметь значение `undef`; неинициализированные массивы или хеши будут пустыми. Perl также имеет оператор `local`, который не создает автоматические переменные, а присваивает глобальным (пакетным) переменным временное значение, область видимости которого динамически ограничена заключающим блоком. Когда область видимости переменной покидается, прежнее значение восстанавливается.