stringtranslate.com

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

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

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

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

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

Глобальные переменные широко используются для передачи информации между разделами кода, которые не разделяют отношения вызывающий/вызываемый, как параллельные потоки и обработчики сигналов. Языки (включая 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, [1] и повлияло на более поздние языки, такие как PL/SQL. Именованные группы COMMON для глобальных переменных ведут себя как структурированные пространства имен. [2] Переменные также являются глобальными по умолчанию в Forth , Lua , Perl и большинстве оболочек.

По языку

С и С++

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

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

#include <stdio.h> // Это переменная области действия файла (с внутренней связью), видимая только в // этой единице компиляции. static int shared = 3 ;    // У этого есть внешняя связь (не ограниченная этим блоком компиляции). extern int over_shared ;  // Также внутренняя связь. int over_shared_too = 2 ;   static void ChangeShared () { // Ссылка на переменную файловой области в функции. shared = 5 ; }       static void LocalShadow () { // Локальная переменная, которая скроет глобальную переменную с тем же именем. int shared ;       // Это повлияет только на локальную переменную и не окажет никакого влияния на переменную // файловой области с тем же именем. shared = 1000 ; }    static void ParamShadow ( int shared ) { // Это повлияет только на параметр и не окажет никакого влияния на переменную области действия файла с тем же именем. shared = - shared ; }         int main () { // Ссылка на переменную области действия файла.    printf ( "%d \n " , общий );  ИзменитьОбщий (); printf ( "%d \n " , общий );  ЛокальнаяТень (); printf ( "%d \n " , общий );  ПараметрТень ( 1 ); printf ( "%d \n " , общий );  вернуть 0 ; } 

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

Результат будет следующим:

3555

Ява

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

публичный класс Глобальный { публичный статический int a ; }       

PHP

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

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

Другие языки

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

Ссылки

  1. ^ "Учебник по Фортрану 77".
  2. ^ «Первые шаги: объекты стека и кучи».
  3. ^ C in a Nutshell, P.Prinz & T Crawford, 2006, O'Reilly, Ch 11
  4. ^ «Каковы правила для локальных и глобальных переменных в Python?». docs.python.org . Python Software Foundation . Получено 4 июня 2020 г. .
  5. ^ "Объявляйте переменные как глобальные". in.mathworks.com . The MathWorks, Inc . Получено 7 февраля 2015 г. .