stringtranslate.com

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

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

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

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

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

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

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

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

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

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

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

Ряд неструктурированных языков , таких как (ранние версии) BASIC , COBOL и Fortran I (1956), предоставляют только глобальные переменные. В Фортране 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> // Это переменная области файла (с внутренней связью), видимая // только в этом модуле компиляции. статический int общий = 3 ;    // У этого есть внешняя связь (не ограничивающаяся этим модулем компиляции). внешний int over_shared ;  // Также внутренняя связь. int over_shared_too = 2 ;   static void ChangeShared () { // Ссылка на переменную области файла в функции. общий = 5 ; }       static void LocalShadow () { // Локальная переменная, которая скроет одноименную глобальную переменную. int общий ;       // Это повлияет только на локальную переменную и не окажет никакого влияния на // переменную области файла с тем же именем. общий = 1000 ; }    static void ParamShadow ( int Shared ) { // Это повлияет только на параметр и не окажет никакого влияния на // переменную области действия файла с тем же именем. общий = - общий ; }         int main () { // Ссылка на переменную области файла.    printf ( "%d \n " , общий );  ИзменениеОбщего (); printf ( "%d \n " , общий );  Локальная Тень (); printf ( "%d \n " , общий );  ПарамТень ( 1 ); printf ( "%d \n " , общий );  вернуть 0 ; } 

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

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

3555

Джава

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

общественный класс Global { public static int a ; }       

PHP

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

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

Другие языки

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

Рекомендации

  1. ^ "Учебник по Фортрану 77" .
  2. ^ «Первые шаги: стек и куча объектов» .
  3. ^ C в двух словах, П.Принц и Т. Кроуфорд, 2006, О'Рейли, глава 11
  4. ^ «Каковы правила для локальных и глобальных переменных в Python?». docs.python.org . Фонд программного обеспечения Python . Проверено 4 июня 2020 г.
  5. ^ «Объявить переменные как глобальные». in.mathworks.com . Компания MathWorks, Inc. Проверено 7 февраля 2015 г.