Variabilă globală - Global variable
În programarea computerului , o variabilă globală este o variabilă cu scop global , ceea ce înseamnă că este vizibilă (prin urmare accesibilă) pe tot parcursul programului, cu excepția cazului în care este umbrită . Setul tuturor variabilelor globale este cunoscut sub numele de mediu global sau stare globală. În limbile compilate , variabilele globale sunt în general variabile statice , a căror întindere (durata de viață) este întreaga durată a programului, deși în limbile interpretate (inclusiv interpreții din linia de comandă ), variabilele globale sunt în general alocate dinamic atunci când sunt declarate, deoarece nu sunt cunoscute inaintea timpului.
În unele limbi, toate variabilele sunt globale, sau globale în mod implicit, în timp ce în majoritatea limbilor moderne variabilele au domeniu limitat, în general domeniu lexical , deși variabilele globale sunt adesea disponibile prin declararea unei variabile la nivelul superior al programului. Cu toate acestea, în alte limbi, variabilele globale nu există; acestea sunt în general limbaje de programare modulare care impun o structură de module sau limbaje de programare orientate pe obiecte bazate pe clase care impun o structură de clase.
Utilizare
Mecanismele de interacțiune cu variabilele globale sunt numite mecanisme de mediu global (vezi și starea globală ) mecanisme. Paradigma mediului global este în contrast cu paradigma mediului local , unde toate variabilele sunt locale fără memorie partajată (și, prin urmare, toate interacțiunile pot fi reconduse la transmiterea mesajelor ).
Variabilele globale sunt utilizate pe scară largă pentru a transmite informații între secțiunile de cod care nu împărtășesc o relație apelant / apelant, cum ar fi firele simultane și gestionarele de semnal. Limbile (inclusiv C) în care fiecare fișier definește un spațiu de nume implicit elimină majoritatea problemelor văzute cu limbi cu un spațiu de nume global, deși unele probleme pot persista fără o încapsulare adecvată. Fără o blocare adecvată (cum ar fi cu un mutex ), codul care utilizează variabile globale nu va fi sigur de fir, cu excepția valorilor numai în citire din memoria protejată .
Variabile de mediu
Variabilele de mediu sunt o facilitate oferită de unele sisteme de operare . În shell- ul sistemului de operare ( ksh în Unix , bash în Linux , COMMAND.COM în DOS și CMD.EXE în Windows ) sunt un fel de variabilă: de exemplu, în sistemele unix și conexe, o variabilă obișnuită devine o variabilă de mediu atunci când exportcuvântul cheie este folosit. Codul programului, altul decât shell-urile, trebuie să le acceseze prin apeluri API , cum ar fi
getenv()și setenv().
Ele sunt locale pentru procesul în care au fost stabilite. Asta înseamnă că dacă deschidem două ferestre de terminal (două procese diferite care rulează shell) și schimbăm valoarea variabilei de mediu într-o fereastră, această modificare nu va fi văzută de altă fereastră.
Când se creează un proces copil, acesta moștenește toate variabilele de mediu și valorile lor din procesul părinte. De obicei, atunci când un program apelează un alt program, acesta creează mai întâi un proces copil prin bifurcare , apoi copilul ajustează mediul după cum este necesar și, în cele din urmă, copilul se înlocuiește cu programul care va fi apelat. Prin urmare, procesele copilului nu pot utiliza variabile de mediu pentru a comunica cu colegii lor, evitând acțiunea la distanță.
Numai global și global implicit
Un număr de limbaje nestructurate , cum ar fi (versiunile timpurii ale) BASIC , COBOL și Fortran I (1956) furnizează doar variabile globale. Fortran II (1958) a introdus subrutine cu variabile locale și cuvântul cheie COMMON pentru accesarea variabilelor globale. Utilizarea COMMON în FORTRAN a continuat în FORTRAN 77 și a influențat limbaje ulterioare, cum ar fi PL / SQL. Grupurile COMUN numite pentru globali se comportă oarecum ca spații de nume structurate. Variabilele sunt, de asemenea, globale în mod implicit în FORTH , Lua , Perl și în majoritatea shell-urilor.
După limbă
C și C ++
Limbajul C nu are un global cuvânt cheie . Cu toate acestea, variabilele declarate în afara unei funcții au „domeniul de aplicare al fișierului”, ceea ce înseamnă că sunt vizibile în fișier. Variabilele declarate cu scopul fișierului sunt vizibile între declarația lor și sfârșitul unității de compilare ( .cfișier) (cu excepția cazului în care sunt umbrite de un obiect asemănător într-un domeniu mai apropiat, cum ar fi o variabilă locală); și implicit au legături externe și sunt astfel vizibile nu numai pentru .cfișierul sau unitatea de compilare care conține declarațiile lor, ci și pentru orice altă unitate de compilare care este legată pentru a forma programul complet. Cu toate acestea, legătura externă nu este suficientă pentru utilizarea unei astfel de variabile în alte fișiere: pentru ca o unitate de compilare să acceseze corect o astfel de variabilă globală, va trebui să știe tipul acesteia. Acest lucru se realizează prin declararea variabilei din fiecare fișier folosind externcuvântul cheie. (Acesta va fi declarat în fiecare fișier, dar poate fi definit într-un singur.) Astfel de externdeclarații sunt adesea plasate într-un fișier antet partajat, deoarece este o practică obișnuită pentru toate fișierele .c dintr-un proiect să includă cel puțin un .hfișier: standardul fișierul antet errno.heste un exemplu, făcând errnovariabila accesibilă tuturor modulelor dintr-un proiect. În cazul în care acest mecanism de acces global este considerat problematic, acesta poate fi dezactivat folosind staticcuvântul cheie care restricționează o variabilă la domeniul de aplicare al fișierului și va provoca încercări de importare a acestuia externpentru a ridica o eroare de compilare (sau legare).
Un exemplu de variabilă „globală” în 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;
}
Deoarece variabila este una externă, nu este nevoie să o treceți ca parametru pentru ao utiliza într-o funcție în afară de main. Aparține fiecărei funcții din modul.
Ieșirea va fi:
3 5 5 5
Java
Unele limbi, cum ar fi Java, nu au variabile globale. În Java, toate variabilele care nu sunt variabile locale sunt câmpuri ale unei clase. Prin urmare, toate variabilele sunt în sfera unei clase sau a unei metode. În Java, câmpurile statice (cunoscute și sub numele de variabile de clasă ) există independent de orice instanțe ale clasei și o copie este partajată între toate instanțele; prin urmare, câmpurile statice publice sunt utilizate în multe dintre aceleași scopuri ca și variabilele globale în alte limbi datorită comportamentului lor similar de „partajare”:
public class Global {
public static int a;
}
PHP
PHP are un globalcuvânt cheie și o serie de moduri neobișnuite de utilizare a variabilelor globale. Variabilele declarate în afara funcțiilor au domeniul de aplicare al fișierului (care este, în majoritatea scopurilor, cel mai larg domeniu de aplicare). Cu toate acestea, acestea nu sunt accesibile în interiorul funcțiilor decât dacă sunt importate cu globalcuvântul cheie (adică cuvântul cheie accesează variabile globale, nu le declară ).
Cu toate acestea, unele variabile predefinite, cunoscute sub numele de superglobale, sunt întotdeauna accesibile. Toate sunt tablouri. Unul de scop general este $GLOBALSsuperglobul, care conține toate variabilele definite în afara domeniului funcțional. Modificările aduse elementelor sale modifică variabilele originale, iar adăugările creează variabile noi. Superglobalii $_POSTși $_GETsunt folosiți pe scară largă în programarea web.
Alte limbi
- În Python și MATLAB o variabilă globală poate fi declarată oriunde cu
globalcuvântul cheie. -
Ruby e variabile globale se disting printr - o '
$' Sigil . Există un număr de globuri predefinite, de exemplu$$este ID-ul procesului curent .