Глобальная переменная - Global variable

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

В некоторых языках все переменные являются глобальными или глобальными по умолчанию, в то время как в большинстве современных языков переменные имеют ограниченную область видимости, обычно лексическую область видимости , хотя глобальные переменные часто доступны путем объявления переменной на верхнем уровне программы. Однако в других языках глобальные переменные не существуют; Как правило, это модульные языки программирования, которые реализуют структуру модуля, или основанные на классах объектно-ориентированные языки программирования, которые реализуют структуру классов.

Использовать

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

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

Переменные среды

Переменные среды - это возможность, предоставляемая некоторыми операционными системами . В оболочке ОС ( ksh в Unix , bash в Linux , COMMAND.COM в DOS и CMD.EXE в Windows ) они представляют собой своего рода переменную: например, в unix и связанных системах обычная переменная становится переменной среды, когда exportключевое слово используется. Программный код, отличный от оболочек, должен обращаться к ним с помощью вызовов API , таких как getenv()и setenv().

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

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

Только глобальный и глобальный по умолчанию

Ряд неструктурированных языков, таких как (ранние версии) BASIC , COBOL и Fortran I (1956), предоставляют только глобальные переменные. Fortran II (1958) ввел подпрограммы с локальными переменными и ключевое слово COMMON для доступа к глобальным переменным. Использование COMMON в FORTRAN продолжилось в FORTRAN 77 и повлияло на более поздние языки, такие как PL / SQL. Именованные ОБЩИЕ группы для глобальных объектов ведут себя как структурированные пространства имен. Переменные также являются глобальными по умолчанию в FORTH , Lua , Perl и большинстве оболочек.

По языку

C и C ++

В языке C нет global ключевого слова . Однако переменные, объявленные вне функции, имеют «файловую область», что означает, что они видны внутри файла. Переменные, объявленные в области видимости файла, видны между их объявлением и концом единицы компиляции ( .cфайла) (если они не затенены объектом с похожим именем в более близкой области, например локальной переменной); и они неявно имеют внешнюю связь и, таким образом, видны не только .cфайлу или модулю компиляции, содержащему их объявления, но также и всем другим модулям компиляции, которые связаны для формирования полной программы. Однако внешней связи недостаточно для использования такой переменной в других файлах: для того, чтобы модуль компиляции мог правильно обращаться к такой глобальной переменной, ему необходимо знать ее тип. Это достигается объявлением переменной в каждом файле с помощью externключевого слова. (Он будет объявлен в каждом файле, но может быть определен только в одном.) Такие externобъявления часто помещаются в общий файл заголовка, поскольку для всех файлов .c в проекте обычной практикой является включение по крайней мере одного .hфайла: стандарт Заголовочный файл errno.hявляется примером, делающим errnoпеременную доступной для всех модулей в проекте. Если этот глобальный механизм доступа считается проблематичным, его можно отключить с помощью staticключевого слова, которое ограничивает переменную областью файлов и вызывает попытки импортировать ее, вызывая externошибку компиляции (или связывания).

Пример «глобальной» переменной в C :

#include <stdio.h>

// This is the file-scope variable (with internal linkage), visible only in
// this compilation unit.
static int shared = 3;

// This one has external linkage (not limited to this compilation unit).
extern int over_shared;

// Also internal linkage.
int over_shared_too = 2;

static void ChangeShared() {
  // Reference to the file-scope variable in a function.
  shared = 5;
}

static void LocalShadow() {
  // Local variable that will hide the global of the same name.
  int shared;

  // This will affect only the local variable and will have no effect on the
  // file-scope variable of the same name.
  shared = 1000;
}

static void ParamShadow(int shared) {
  // This will affect only the parameter and will have no effect on the file-
  // scope variable of the same name.
  shared = -shared;
}

int main() {
  // Reference to the file-scope variable.

  printf("%d\n", shared);

  ChangeShared();

  printf("%d\n", shared);

  LocalShadow();

  printf("%d\n", shared);

  ParamShadow(1);

  printf("%d\n", shared);

  return 0;
}

Поскольку переменная является внешней, нет необходимости передавать ее в качестве параметра для использования в функции, кроме main. Он принадлежит каждой функции в модуле.

Результатом будет:

3
5
5
5

Джава

Некоторые языки, например Java, не имеют глобальных переменных. В Java все переменные, не являющиеся локальными, являются полями класса. Следовательно, все переменные находятся в области действия класса или метода. В Java статические поля (также известные как переменные класса ) существуют независимо от любых экземпляров класса, и одна копия используется всеми экземплярами; следовательно, общедоступные статические поля используются для многих из тех же целей, что и глобальные переменные в других языках из-за их аналогичного поведения «совместного использования»:

public class Global {
    public static int a;
}

PHP

В PHP есть globalключевое слово и несколько необычных способов использования глобальных переменных. Переменные, объявленные вне функций, имеют область видимости файла (которая для большинства целей является самой широкой областью). Однако они недоступны внутри функций, если они не импортированы с globalключевым словом (т. Е. Ключевое слово обращается к глобальным переменным, оно не объявляет их).

Однако некоторые предопределенные переменные, известные как суперглобальные переменные, всегда доступны. Все они массивы. Универсальным является $GLOBALSсуперглобальный, который содержит все переменные, определенные вне области действия функции. Изменения в его элементах изменяют исходные переменные, а добавления создают новые переменные. Суперглобальные переменные $_POSTи $_GETшироко используются в веб-программировании.

Другие языки

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

использованная литература