Variabilă (informatică) - Variable (computer science)

În programarea computerului , o variabilă sau scalar este o locație de stocare abstractă asociată cu un nume simbolic asociat , care conține o cantitate cunoscută sau necunoscută de informații denumită valoare ; sau, în termeni simpli, o variabilă este un container pentru un anumit set de biți sau tip de date (cum ar fi întreg, float, șir etc ...). O variabilă poate fi în cele din urmă asociată sau identificată printr-o adresă de memorie . Numele variabilei este modul obișnuit de a face referire la valoarea stocată, în plus față de a face referire la variabila însăși, în funcție de context. Această separare a numelui și a conținutului permite utilizarea numelui independent de informațiile exacte pe care le reprezintă. Identificatorul din codul sursă al computerului poate fi legat de o valoare în timpul timpului de execuție , iar valoarea variabilei se poate modifica astfel în cursul executării programului .

Variabilele din programare pot să nu corespundă direct conceptului de variabile din matematică . Acesta din urmă este abstract , neavând nicio referință la un obiect fizic, cum ar fi locația de stocare. Valoarea unei variabile de calcul nu este neapărat parte dintr-o ecuație sau formulă ca în matematică. Variabilele din programarea computerelor primesc frecvent denumiri lungi pentru a le face relativ descriptive ale utilizării lor, în timp ce variabilele din matematică au deseori nume concise, cu unul sau două caractere, pentru concizie în transcriere și manipulare.

Locația de stocare a unei variabile poate fi menționată prin mai mulți identificatori diferiți, situație cunoscută sub numele de aliasing . Atribuirea unei valori variabilei folosind unul dintre identificatori va schimba valoarea care poate fi accesată prin intermediul celorlalți identificatori.

Compilatoarele trebuie să înlocuiască numele simbolice ale variabilelor cu locațiile reale ale datelor. În timp ce numele, tipul și locația unei variabile rămân deseori fixe, datele stocate în locație pot fi modificate în timpul executării programului.

Acțiuni asupra unei variabile

În limbaje de programare imperative , valorile pot fi în general accesate sau modificate oricând. În limbaje funcționale și logice pure , variabilele sunt legate de expresii și păstrează o singură valoare pe toată durata lor de viață datorită cerințelor de transparență referențială . În limbile imperative, același comportament este prezentat de constante (numite) (constante simbolice), care sunt de obicei contrastate cu variabile (normale).

În funcție de sistemul de tip al unui limbaj de programare, variabilele pot fi capabile să stocheze doar un tip de date specificat (de exemplu, întreg sau șir ). Alternativ, un tip de date poate fi asociat doar cu valoarea curentă, permițând unei singure variabile să stocheze orice este acceptat de limbajul de programare.

Variabilele sunt containerele pentru stocarea valorilor.

Variabile și domeniu:

  • Variabile automate : Fiecare variabilă locală dintr-o funcție apare doar atunci când funcția este apelată și dispare la ieșirea funcției. Astfel de variabile sunt cunoscute sub numele de variabile automate.
  • Variabile externe: Acestea sunt variabile care sunt externe unei funcții și care pot fi accesate pe nume prin orice funcție. Aceste variabile rămân în permanență; mai degrabă că apar și dispar ca funcții sunt numite și ieșite, își păstrează valorile chiar și după ce funcțiile care le-au setat au revenit.

Identificatori care fac referire la o variabilă

Un identificator care face referire la o variabilă poate fi utilizat pentru a accesa variabila pentru a citi valoarea sau pentru a modifica valoarea sau pentru a edita alte atribute ale variabilei, cum ar fi permisiunea de acces, blocări , semafore etc.

De exemplu, o variabilă poate fi menționată de identificatorul " total_count" și variabila poate conține numărul 1956. Dacă aceeași variabilă este menționată și de identificatorul " r" și dacă se utilizează acest identificator " r", valoarea variabilei este modificat la 2009, apoi citirea valorii folosind identificatorul " total_count" va produce un rezultat din 2009 și nu din 1956.

Dacă o variabilă este menționată doar de un singur identificator, acel identificator poate fi numit pur și simplu numele variabilei ; altfel putem vorbi despre el ca pe unul dintre numele variabilei . De exemplu, în exemplul anterior, identificatorul " total_count" este un nume al variabilei în cauză, iar " r" este un alt nume al aceleiași variabile.

Domeniul de aplicare și întinderea

Domeniul de aplicare al unei variabile descrie în cazul în care în textul unui program poate fi folosit variabila, in timp ce masura ( de asemenea , numit pe viață ) a unei variabile descrie când în executarea unui program variabila are o valoare (semnificativă). Scopul unei variabile afectează întinderea acesteia. Domeniul de aplicare al unei variabile este de fapt o proprietate a numelui variabilei, iar măsura este o proprietate a locației de stocare a variabilei. Acestea nu trebuie confundate cu contextul (numit și mediu ), care este o proprietate a programului și variază în funcție de punctul din textul sau execuția programului - vezi domeniul de aplicare: o prezentare generală . Mai mult, durata de viață a obiectului poate coincide cu durata de viață variabilă, dar în multe cazuri nu este legată de aceasta.

Domeniul de aplicare este o parte importantă a rezoluției de nume a unei variabile. Majoritatea limbilor definesc un domeniu de aplicare specific pentru fiecare variabilă (precum și pentru orice altă entitate numită), care poate diferi în cadrul unui anumit program. Scopul unei variabile este porțiunea din textul programului pentru care numele variabilei are semnificație și pentru care se spune că variabila este „vizibilă”. Intrarea în acest domeniu începe de obicei durata de viață a unei variabile (pe măsură ce intră în context) și ieșirea din acest domeniu își termină de obicei durata de viață (pe măsură ce iese din context). De exemplu, o variabilă cu „ sfera lexicală ” este semnificativă numai în cadrul unei anumite funcții / subrutine , sau mai precis într-un bloc de expresii / enunțuri (în consecință, cu sfera funcției sau sfera blocului ); aceasta este rezoluție statică, realizabilă în timp de analiză sau de compilare. Alternativ, o variabilă cu domeniu dinamic este rezolvată în timpul rulării, pe baza unei stive globale de legare care depinde de fluxul de control specific. Variabilele accesibile doar în cadrul anumitor funcții sunt denumite „ variabile locale ”. O „ variabilă globală ” sau una cu domeniu de aplicare nedefinit poate fi menționată oriunde în program.

Extinderea , pe de altă parte, este un aspect de execuție ( dinamic ) al unei variabile. Fiecare legare a unei variabile la o valoare poate avea propria sa extensie în timpul rulării. Măsura legării este porțiunea din timpul de execuție al programului în timpul căruia variabila continuă să se refere la aceeași valoare sau locație de memorie. Un program care rulează poate intra și ieși de o anumită măsură de multe ori, ca în cazul unei închideri .

Cu excepția cazului în care limbajul de programare prezintă colectarea gunoiului , o variabilă a cărei întindere depășește în permanență domeniul său de aplicare poate duce la o scurgere de memorie , prin care memoria alocată variabilei nu poate fi eliberată niciodată, deoarece variabila care ar fi utilizată pentru a o referi în scopuri de alocare nu mai este accesibil. Cu toate acestea, poate fi permis ca o legătură variabilă să se extindă dincolo de domeniul său de aplicare, așa cum se întâmplă în închiderile Lisp și variabilele locale statice C ; atunci când execuția trece înapoi în domeniul de aplicare al variabilei, variabila poate fi folosită din nou. O variabilă al cărei scop începe înainte de întinderea sa se spune că este neinițializată și are adesea o valoare nedefinită, arbitrară dacă este accesată (vezi pointerul sălbatic ), deoarece încă nu i s-a dat în mod explicit o anumită valoare. O variabilă a cărei întindere se termină înainte de sfera sa de aplicare poate deveni un indicator care atârnă și considerată încă neinitializată din moment ce valoarea sa a fost distrusă. Variabilele descrise de cele două cazuri anterioare pot fi considerate a fi extinse sau nelegate . În multe limbi, este o eroare să încerci să folosești valoarea unei variabile atunci când aceasta este în afara limitelor. În alte limbi, acest lucru poate produce rezultate imprevizibile . O astfel de variabilă poate primi totuși o nouă valoare, ceea ce îi conferă o nouă măsură.

Pentru eficiența spațiului, un spațiu de memorie necesar unei variabile poate fi alocat numai atunci când variabila este folosită pentru prima dată și eliberată atunci când nu mai este necesară. O variabilă este necesară numai atunci când se află în domeniul de aplicare, astfel începând durata de viață a fiecărei variabile atunci când intră în domeniul de aplicare poate da spațiu variabilelor neutilizate. Pentru a evita risipa unui astfel de spațiu, compilatoarele avertizează adesea programatorii dacă o variabilă este declarată, dar nu este utilizată.

Se consideră o bună practică de programare pentru a face domeniul de aplicare al variabilelor cât mai restrâns posibil, astfel încât diferite părți ale unui program să nu interacționeze accidental între ele prin modificarea variabilelor reciproce. Procedând astfel, se previne și acțiunea la distanță . Tehnici comune pentru a face acest lucru trebuie să aibă diferite secțiuni ale unui program de utilizare diferite spații de nume , sau pentru a face variabile individuale „privat“ , fie prin definire a domeniului variabilă dinamică sau de definire a domeniului variabil lexicală .

Multe limbaje de programare folosesc o valoare rezervată (adesea denumită nulă sau nulă ) pentru a indica o variabilă nevalidă sau neinițializată.

Tastare

În limbile tipizate static , cum ar fi Go sau ML , o variabilă are și un tip , ceea ce înseamnă că numai anumite tipuri de valori pot fi stocate în ea. De exemplu, o variabilă de tip „ întreg ” este interzisă să stocheze valorile textului.

În limbi scrise dinamic , cum ar fi Python , tipul unei variabile este dedus de valoarea ei și se poate modifica în funcție de valoarea sa. În Common Lisp , ambele situații există simultan: unei variabile i se dă un tip (dacă este nedeclarat, se presupune că este T, supertipul universal ) care există la momentul compilării. Valorile au și tipuri, care pot fi verificate și interogate în timpul rulării.

Tastarea variabilelor permite, de asemenea, rezolvarea polimorfismelor la momentul compilării. Cu toate acestea, acest lucru este diferit de polimorfismul utilizat în apelurile de funcții orientate pe obiecte (denumite funcții virtuale în C ++ ) care rezolvă apelul pe baza tipului de valoare, spre deosebire de supertipurile pe care este permisă să le aibă variabila.

Variabilele stochează adesea date simple, cum ar fi numere întregi și șiruri de caractere, dar unele limbaje de programare permit unei variabile să stocheze și valori ale altor tipuri de date . Astfel de limbaje pot permite, de asemenea, funcțiilor să fie parametrice polimorfe . Aceste funcții funcționează ca variabile pentru a reprezenta date de mai multe tipuri. De exemplu, o funcție numită lengthpoate determina lungimea unei liste. O astfel de lengthfuncție poate fi parametrică polimorfă prin includerea unei variabile de tip în semnătura sa de tip , deoarece numărul de elemente din listă este independent de tipurile de elemente.

Parametrii

De parametrii formali (sau argumentele formale ) de funcții sunt , de asemenea , denumite variabile. De exemplu, în acest segment de cod Python ,

>>> def addtwo(x):
...     return x + 2
...
>>> addtwo(5)
7

variabila denumită xeste un parametru deoarece i se dă o valoare atunci când funcția este apelată. Numărul întreg 5 este argumentul care îi dă xvaloarea. În majoritatea limbilor, parametrii funcției au scop local. Această variabilă specifică numită xpoate fi menționată numai în cadrul addtwofuncției (deși, desigur, alte funcții pot avea și variabile numite x).

Alocare de memorie

Specificul alocării variabilei și reprezentarea valorilor acestora variază foarte mult, atât între limbajele de programare, cât și între implementările unui limbaj dat. Multe implementări de limbă alocă spațiu pentru variabilele locale , a căror întindere durează pentru un singur apel de funcție pe teancul de apeluri și a căror memorie este recuperată automat la revenirea funcției. Mai general, în legarea numelui , numele unei variabile este legat de adresa unui anumit bloc (secvență contiguă) de octeți din memorie, iar operațiile asupra variabilei manipulează acel bloc. Referințarea este mai frecventă pentru variabilele ale căror valori au dimensiuni mari sau necunoscute atunci când codul este compilat. Astfel de variabile fac referire la locația valorii în loc să stocheze valoarea însăși, care este alocată dintr-un pool de memorie numit heap .

Variabilele legate au valori. O valoare, însă, este o abstractizare, o idee; în implementare, o valoare este reprezentată de un obiect de date , care este stocat undeva în memoria computerului. Programul sau mediul de execuție trebuie să pună deoparte memoria pentru fiecare obiect de date și, din moment ce memoria este finită, să se asigure că această memorie este cedată pentru reutilizare atunci când obiectul nu mai este necesar pentru a reprezenta valoarea unei variabile.

Obiectele alocate din heap trebuie recuperate - mai ales atunci când obiectele nu mai sunt necesare. Într-un limbaj colectat de gunoi (cum ar fi C # , Java , Python, Golang și Lisp ), mediul de execuție recuperează automat obiecte atunci când variabilele existente nu mai pot face referire la ele. În limbaje care nu sunt colectate la gunoi, cum ar fi C , programul (și programatorul) trebuie să aloce în mod explicit memoria, apoi să o elibereze ulterior, pentru a-și recupera memoria. Nerespectarea acestui lucru duce la scurgeri de memorie , în care heap-ul este epuizat pe măsură ce programul rulează, riscă eventualul eșec al epuizării memoriei disponibile.

Când o variabilă se referă la o structură de date creată dinamic, unele componente ale acesteia pot fi accesate numai indirect prin intermediul variabilei. În astfel de circumstanțe, colectorii de gunoi (sau caracteristici similare ale programului în limbaje care nu au colectoare de gunoi) trebuie să facă față unui caz în care trebuie recuperată doar o parte din memoria accesibilă din variabilă.

Convențiile de denumire

Spre deosebire de omologii lor matematici, variabilele și constantele de programare iau de obicei nume cu mai multe caractere, de exemplu COSTsau total. Numele cu un singur caracter sunt utilizate cel mai frecvent numai pentru variabilele auxiliare; de exemplu, i, j, kpentru indicele matrice variabile.

Unele convenții de denumire sunt aplicate la nivel de limbă ca parte a sintaxei limbii, care implică formatul identificatorilor valizi. În aproape toate limbile, numele variabilelor nu pot începe cu o cifră (0-9) și nu pot conține caractere în spațiu alb. Dacă semnele de punctuație sunt permise sau nu în numele variabilelor variază de la o limbă la alta; multe limbi permit doar sublinierea ("_") în numele variabilelor și interzic orice altă punctuație. În unele limbaje de programare, sigilele (simboluri sau punctuație) sunt aplicate pe identificatorii variabilei pentru a indica tipul de date sau domeniul de aplicare al variabilei.

Sensibilitatea la majuscule și la minuscule variază de la o limbă la alta și unele limbi necesită utilizarea unui anumit caz la denumirea anumitor entități; Cele mai multe limbi moderne sunt sensibile la majuscule și minuscule; unele limbi mai vechi nu sunt. Unele limbi își rezervă anumite forme de nume variabile pentru propria lor utilizare internă; în multe limbi, numele care încep cu două caractere de subliniere („__”) se încadrează adesea în această categorie.

Cu toate acestea, dincolo de restricțiile de bază impuse de o limbă, numirea variabilelor este în mare măsură o chestiune de stil. La nivelul codului mașinii , numele variabilelor nu sunt utilizate, astfel încât numele exacte alese nu contează pentru computer. Astfel, numele variabilelor le identifică, în rest acestea sunt doar un instrument pentru programatori pentru a face programele mai ușor de scris și de înțeles. Utilizarea unor nume de variabile slab alese poate face codul mai dificil de revizuit decât numele nescriptive, astfel încât numele care sunt clare sunt adesea încurajate.

Programatorii creează adesea și respectă linii directoare privind stilul de cod care oferă îndrumări cu privire la variabilele de numire sau impun o schemă precisă de numire. Numele mai scurte sunt mai rapid de tastat, dar sunt mai puțin descriptive; denumirile mai lungi fac programele mai ușor de citit și scopul variabilelor mai ușor de înțeles. Cu toate acestea, verbozitatea extremă în numele variabilelor poate duce, de asemenea, la un cod mai puțin inteligibil.

Tipuri de variabile (în funcție de durata de viață)

În ceea ce privește clasificarea variabilelor, putem clasifica variabilele pe baza duratei de viață a acestora. Diferitele tipuri de variabile sunt statice, stivă-dinamice, explicite heap-dinamice și implicite heap-dinamice. O variabilă statică este, de asemenea, cunoscută sub numele de variabilă globală, este legată de o celulă de memorie înainte de începerea executării și rămâne la aceeași celulă de memorie până la terminare. Un exemplu tipic este variabilele statice din C și C ++. O variabilă dinamic-stivă este cunoscută sub numele de variabilă locală, care este legată la executarea declarației de declarație și este alocată la revenirea procedurii. Principalele exemple sunt variabilele locale din subprogramele C și metodele Java. Variabilele Heap-Dynamic explicite sunt celule de memorie fără nume (abstracte) care sunt alocate și alocate prin instrucțiuni explicite de rulare specificate de programator. Principalele exemple sunt obiecte dinamice în C ++ (prin nou și ștergere) și toate obiectele din Java. Variabilele Heap-Dynamic implicite sunt legate de stocarea heap numai atunci când li se atribuie valori. Alocarea și eliberarea apar atunci când valorile sunt reatribuite la variabile. Ca rezultat, variabilele dinamice heap implicite au cel mai înalt grad de flexibilitate. Principalele exemple sunt câteva variabile în JavaScript, PHP și toate variabilele din APL.

Vezi si

Note

Referințe