Введение
В компьютерном программировании автоматическая переменная – это локальная переменная, которая автоматически выделяется и освобождается при входе и выходе из области видимости переменной. Область видимости – это лексический контекст, в частности, функция или блок, в котором переменная определена. Локальные данные обычно (в большинстве языков) невидимы вне функции или лексического контекста, где они определены. Локальные данные также невидимы и недоступны для вызываемой функции, но не освобождаются, а возвращаются в область видимости при возврате потока выполнения к вызывающей функции. Автоматические локальные переменные в основном применяются в рекурсивных языках с лексической областью видимости. Автоматические локальные переменные обычно выделяются в стековом кадре процедуры, в которой они объявлены. Это изначально было сделано для обеспечения повторного входа и поддержки рекурсии, что остаётся актуальным и сегодня. Концепция автоматических переменных в рекурсивных (и вложенных) функциях в языке с лексической областью видимости была представлена широкой аудитории с появлением ALGOL в конце 1950-х годов и впоследствии популяризирована его многочисленными потомками. Термин "локальная переменная" обычно является синонимом "автоматической переменной", поскольку во многих языках программирования это одно и то же, но "локальная" – понятие более общее: большинство локальных переменных являются автоматическими локальными переменными, однако существуют и статические локальные переменные, особенно в C. Для статической локальной переменной выделение памяти происходит статически (время жизни – всё время выполнения программы), а не автоматически, но она активна только во время выполнения функции.
In computer programming, an automatic variable is a local variable which is allocated and deallocated automatically when program flow enters and leaves the variable's scope. The scope is the lexical context, particularly the function or block in which a variable is defined. Local data is typically (in most languages) invisible outside the function or lexical context where it is defined. Local data is also invisible and inaccessible to a called function, but is not deallocated, coming back in scope as the execution thread returns to the caller. Automatic local variables primarily applies to recursive lexically scoped languages. Automatic local variables are normally allocated in the stack frame of the procedure in which they are declared. This was originally done to achieve re entrancy and allowing recursion, a consideration that still applies today. The concept of automatic variables in recursive (and nested) functions in a lexically scoped language was introduced to the wider audience with ALGOL in the late 1950s, and further popularized by its many descendants. The term local variable is usually synonymous with automatic variable, since these are the same thing in many programming languages, but local is more general – most local variables are automatic local variables, but static local variables also exist, notably in C. For a static local variable, the allocation is static (the lifetime is the entire program execution), not automatic, but it is only in scope during the execution of the function.
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`, который не создает автоматические переменные, а присваивает глобальным (пакетным) переменным временное значение, область видимости которого динамически ограничена заключающим блоком. Когда область видимости переменной покидается, прежнее значение восстанавливается.
Perl also has a local operator that does not create automatic variables, instead giving global (package) variables a temporary value, which is dynamically scoped to the enclosing block. When the scope of the variable is left, the old value is restored.