Variabilă automată

În programarea computerelor, o variabilă automată este o variabilă locală care este alocată și dealocată automat atunci când firul de execuție al programului intră și iese din domeniul de aplicare al variabilei. Domeniul de aplicare este contextul lexical, în special funcția sau blocul în care este definită variabila. Datele locale sunt de obicei (în majoritatea limbilor) invizibile în afara funcției sau contextului lexical în care sunt definite. Datele locale sunt, de asemenea, invizibile și inaccesibile pentru funcția apelată , [nota 1] , dar nu sunt eliberate, revenind la sfera de aplicare atunci când firul de execuție revine apelantului.

Conceptul de variabile locale automate este folosit în primul rând în limbajele recursive cu sferă lexicală . [nota 2] Variabilele locale automate sunt de obicei plasate pe cadrul stivei procedurii în care sunt declarate. [nota 3] Acest lucru a fost făcut inițial pentru a obține reintrarea și rezoluția recursiunii , [nota 4] o considerație care este și astăzi relevantă. Conceptul de variabile automate în funcțiile recursive (și imbricate ) într-un limbaj cu scop lexical a fost introdus unui public larg cu ALGOL la sfârșitul anilor 1950 și propagat în continuare de numeroșii săi descendenți.

Termenul de variabilă locală este de obicei sinonim cu variabilă automată, deoarece în multe limbaje de programare este același lucru, dar variabila locală este mai generală - majoritatea variabilelor locale sunt variabile locale automate, dar există și variabile locale statice , în special în C Pentru o variabilă locală statică, alocarea unei zone de memorie este statică (durata de viață este întreaga execuție a programului), nu automată, dar este în domeniu doar în timpul execuției funcției.

În limbaje de programare specifice

C, C++

(Variabilele automate se numesc variabile automate )

Toate variabilele declarate într- un bloc de cod sunt automate implicit. O variabilă automată neinițializată are o valoare nedefinită până când i se atribuie o valoare validă de tipul său. [1] Un specificator autopoate fi adăugat la aceste declarații de variabile, dar deoarece toate sunt automate în mod implicit, acest lucru este complet redundant și se face rar.

În C, utilizarea cuvântului cheie registereste un indiciu pentru compilator pentru a stoca variabila într-un registru de procesor. În plus față de interzicerea utilizării operatorului de adresă ( &) pe o variabilă sau oricare dintre subcomponentele acesteia, compilatorul poate ignora acest indiciu. [2]

În C++, constructorul automat de variabile este apelat atunci când execuția ajunge la locul declarației. Destructorul este apelat când ajunge la sfârșitul blocului de program dat (blocurile de program sunt cuprinse între acolade). Această funcție este adesea folosită pentru a gestiona alocarea și dealocarea resurselor, cum ar fi deschiderea și închiderea automată a fișierelor sau eliberarea memoriei. Consultați Inițializarea resurselor este inițializare (RAII).

Începând cu C++11, C++ permite declararea variabilelor cu cuvântul cheie auto[3] , dar aceasta înseamnă că tipul variabilei este dedus și este în afara domeniului de aplicare al variabilei.

Java

(Variabilele automate se numesc variabile locale )

autoSimilar cu C și C++, dar nu există sau cuvânt cheie register. Cu toate acestea, compilatorul Java nu va permite utilizarea unei variabile locale care nu este inițializată explicit și va emite o eroare de compilare (spre deosebire de C și C++, unde compilatorul emite de obicei doar un avertisment). Standardul limbajului Java cere ca fiecare variabilă locală să fie inițializată înainte de a o utiliza. [4] Aceasta este diferită de variabilele obiect, care sunt implicit inițializate cu valori implicite (care sunt0pentru numere șinulpentru obiecte).

Perl

(Variabilele automate se numesc variabile lexicale , my sau private .)

În Perl, variabilele locale sunt declarate cu my. Variabilele scalare neinițializate vor avea valoarea undef; matricele sau hashurile neinițializate vor fi (). [5]

Perl are, de asemenea, un local, care nu creează variabile automate [6] , în schimb atribuind variabilelor globale (loturi) o valoare temporară care este atașată dinamic blocului înconjurător. Când o variabilă iese din domeniul de aplicare, vechea valoare este restaurată.

Vezi și

Note

  1. dacă nu este o funcție imbricată care este definită împreună cu datele locale
  2. deși există într-o formă similară, dar nu identică, și în limbaje recursive cu scop dinamic , cum ar fi vechile LISP -uri
  3. cu excepția cazului în care se menționează altfel, cum ar fi date statice sau date heap, care sunt specificate în unele limbi
  4. Când se folosește proprietatea de reintrare a subrutinei, pentru recursivitate sau altfel, optimizatorul nu ar trebui să încerce să aloce astfel de variabile în registrele procesorului (pentru eficiență), deoarece acest lucru ar rupe reintrarea.

Link -uri

  1. ↑ pentru standardul C 2008 . (3,61  MiB ) : secțiunea 6.2.4, Duratele de stocare a obiectelor 
  2. Durata stocării , < https://en.cppreference.com/w/c/language/storage_duration > 
  3. Indicatori de tip de substituent , < http://en.cppreference.com/w/cpp/language/auto > 
  4. 4.12.5 Valorile inițiale ale variabilelor . Microsisteme solare. Recuperat la 17 octombrie 2008.
  5. Variabile private prin my() - perlsub - perldoc.perl.org . Recuperat la 17 octombrie 2008.
  6. Valori temporare prin local() - perlsub - perldoc.perl.org . Preluat la 25 februarie 2011.