Введение
Глобальная переменная – это переменная, доступная во всей компьютерной программе.
В программировании глобальная переменная – это переменная с глобальной областью видимости, что означает, что она видна (и, следовательно, доступна) во всей программе, если её область видимости не перекрыта другой переменной. Множество всех глобальных переменных известно как глобальная среда или глобальное состояние. В компилируемых языках глобальные переменные обычно являются статическими переменными, время жизни которых соответствует всему времени выполнения программы, в то время как в интерпретируемых языках (включая интерпретаторы командной строки) глобальные переменные обычно динамически выделяются при объявлении, поскольку они неизвестны заранее. В некоторых языках все переменные являются глобальными или глобальными по умолчанию, в то время как в большинстве современных языков переменные имеют ограниченную область видимости, как правило, лексическую, хотя глобальные переменные часто можно использовать, объявив переменную на верхнем уровне программы. Однако в других языках глобальных переменных не существует; это обычно модульные языки программирования, которые обеспечивают модульную структуру, или объектно-ориентированные языки программирования, основанные на классах, которые обеспечивают классовую структуру.
Использование
Механизмы взаимодействия с глобальными переменными называются механизмами глобальной среды (см. также глобальное состояние). Парадигма глобальной среды противопоставляется парадигме локальной среды, где все переменные являются локальными и не имеют общей памяти (и, следовательно, все взаимодействия могут быть сведены к передаче сообщений). Глобальные переменные широко используются для передачи информации между участками кода, не связанными отношением вызывающей и вызываемой функции, например, между конкурентными потоками и обработчиками сигналов. Языки (включая C), в которых каждый файл определяет неявное пространство имен, устраняют большинство проблем, возникающих в языках с глобальным пространством имен, хотя некоторые проблемы могут сохраняться без надлежащей инкапсуляции. Без надлежащей блокировки (например, с использованием мьютекса) код, использующий глобальные переменные, не будет потокобезопасным, за исключением значений, доступных только для чтения, в защищенной памяти.
Экологические переменные
Переменные среды – это функциональность, предоставляемая некоторыми операционными системами. В оболочке ОС (ksh в Unix, bash в Linux, COMMAND.COM в DOS и CMD.EXE в Windows) они представляют собой особый тип переменной: например, в Unix и подобных системах обычная переменная становится переменной среды при использовании ключевого слова `export`. Программный код, не являющийся оболочкой, должен обращаться к ним через вызовы API, такие как `getenv` и `setenv`. Они локальны для процесса, в котором были установлены. Это означает, что если открыть два окна терминала (два различных процесса, запускающих оболочку) и изменить значение переменной среды в одном окне, это изменение не будет видно в другом окне. Когда создается дочерний процесс, он наследует все переменные среды и их значения от родительского процесса. Обычно, когда программа вызывает другую программу, она сначала создает дочерний процесс посредством форка, затем дочерний процесс корректирует окружение по мере необходимости и, наконец, заменяет себя вызываемой программой. Таким образом, дочерние процессы не могут использовать переменные среды для обмена данными со своими аналогами, избегая проблемы "действия на расстоянии".
getenv and setenv
They are local to the process in which they were set. That means if we open two terminal windows (Two different processes running shell) and change value of environment variable in one window, that change will not be seen by other window. When a child process is created, it inherits all the environment variables and their values from the parent process. Usually, when a program calls another program, it first creates a child process by forking, then the child adjusts the environment as needed and lastly the child replaces itself with the program to be called. Child processes therefore cannot use environment variables to communicate with their peers, avoiding the action at a distance problem.
Только глобальные и глобальные по умолчанию
Ряд неструктурированных языков программирования, таких как (ранние версии) BASIC, COBOL и Fortran I (1956), предоставляют только глобальные переменные. Fortran II (1958) представил подпрограммы с локальными переменными и ключевое слово COMMON для доступа к глобальным переменным. Использование COMMON в FORTRAN продолжалось в FORTRAN 77 и оказало влияние на более поздние языки, такие как PL/SQL. Именованные группы COMMON для глобальных переменных в некоторой степени напоминают структурированные пространства имен. Переменные также глобальны по умолчанию в Forth, Lua, Perl и большинстве командных оболочек.
PHP (англ.)
PHP имеет глобальное ключевое слово и ряд необычных способов использования глобальных переменных. Переменные, объявленные вне функций, имеют файловую область видимости (которая для большинства целей является самой широкой). Однако они недоступны внутри функций, если не импортированы с помощью ключевого слова `global` (то есть, это ключевое слово обеспечивает доступ к глобальным переменным, а не объявляет их). Тем не менее, некоторые предопределенные переменные, известные как суперглобальные, всегда доступны. Все они являются массивами. Универсальным является суперглобальный массив `$GLOBALS`, который содержит все переменные, определенные вне области видимости функций. Изменения его элементов изменяют исходные переменные, а добавление новых элементов создает новые переменные. Суперглобальные массивы `$POST` и `$GET` широко используются в веб-программировании.
defined out of function scope. Changes to its elements change the original variables, and additions create new variables. The superglobals $ POST and $ GET are widely used in web programming.
Другие языки
В Python и MATLAB глобальную переменную можно объявить в любом месте с помощью ключевого слова `global`. Глобальные переменные в Ruby обозначаются символом `$`. Существует ряд предопределенных глобальных переменных, например, `$$` – это идентификатор текущего процесса.