Mediu (programare)

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Un mediu , în informatică și în programare , este definit ca ansamblul tuturor asociațiilor dintre identificatori și locații de memorie . Mai formal, mediul este o funcție care asociază domeniul semantic al identificatorilor ( Id ) cu cel al valorilor care pot fi notate prin identificatori ( valori DVal , DVal ), cum ar fi locațiile de memorie, procedurile, funcțiile :

 Env = Id    DVal

Rețineți că, deoarece locațiile de memorie conțin valori, există o funcție suplimentară, numită stocare , care leagă domeniul locațiilor de memorie ( Loc , subset de DVal ) la cel al valorilor stocabile SVal , cum ar fi un număr întreg sau un fișier de intrare sau de ieșire:

 Magazin = Loc    SVal

Evident, asocierea dintre identificator și valoarea asociată, cum ar fi într-o variabilă , necesită aplicarea secvențială a celor două funcții:

         
  
  unde este
   
  i : identificator
  ρ : mediu
  l : poziție
  σ : magazin
  v : valoare

În cele din urmă, se poate spune că identificatorii se referă, prin mediu, la o poziție și la aceasta se asociază o valoare, care poate varia dinamic, prin magazin.

Structura mediului

Definiția formală a mediului introduce două situații particulare la care pot fi supuși identificatorii:

  • partajare în care același identificator are două semnificații diferite, în funcție de contextul în care este utilizat;
  • aliasing în care doi identificatori diferiți se referă la aceeași poziție și, prin urmare, la aceeași valoare.

În general, declarațiile pot modifica mediul și stocarea, în timp ce comenzile modifică doar magazinul. De fapt, o declarație introduce o nouă legătură între un identificator și o poziție și, în cele din urmă, modifică magazinul prin asocierea unei valori poziției; o comandă poate modifica conținutul pozițiilor, dar nu asocierea dintre identificator și poziție (cu excepția câtorva limbi care permit manipularea directă).

Pentru simplitate, este posibil să ne imaginăm mediul ca setul tuturor numelor vizibile la un moment dat în timpul executării unui program; în mod informal, prin urmare, variabilele, procedurile, constantele și clasele pot face parte din mediu.

Elementul semnificativ pentru gestionarea mediului este subrutina sau blocul , care reprezintă, prin urmare, unitatea sa de management de bază. Mediul vizibil (activ) dintr-un subrutin este structurat după cum urmează:

  • mediul local , adică asociațiile create la intrarea subrutinei; exemplele sunt parametrii formali ai funcțiilor sau procedurilor sau declarațiilor locale;
  • mediul global , adică asociațiile comune tuturor subrutinelor, cum ar fi declarațiile prezente în blocul exterior sau cele exportate din module;
  • mediu non-local , adică asociațiile moștenite de la alte subrutine conform regulilor de definire .

Pentru simplitate, ne referim doar la limbi imperative, amintindu-ne că se pot face considerații similare pentru limbajele funcționale. Ne putem imagina o structură de bloc după cum urmează:

 începe // începe programul
    <declarații>
    <comenzi>
    începe // începe blocul 1
       <declarații>
       <comenzi>
    sfârșit // sfârșitul blocului 1
    <comenzi>
    începe // începe blocul 2
       <declarații>
       <comenzi>
       începe // începe subblocul 2.1
          <declarații>
          <comenzi>
       end // end subbloc 2.1
    sfârșit // sfârșitul blocului 2
 sfârșit // sfârșitul programului

Fiecare subbloc poate avea deci propriile sale declarații (de variabile, funcții, clase etc.), precum și comenzi care sunt în mod evident dependente de limbajul utilizat.

Rețineți că nu toate limbajele de programare acceptă aceste trei tipuri de mediu (de exemplu Prolog nu are un mediu nelocal).

Mediu global

Set de asociații care sunt create în partea cea mai exterioară a programului și care sunt vizibile în mod normal în cadrul fiecărui subrutină sau sub-bloc. În unele limbi, numai asocierile dintre identificatori și numele procedurilor sau funcțiilor pot fi vizibile automat în subblocuri, dar nu între identificatori și poziții, cu excepția cazului în care acest lucru este solicitat în mod explicit (așa cum se întâmplă, de exemplu, în funcțiile în PHP ).

Mediul local

Set de asociații care sunt create (sau activate) la intrarea într-un subrutină. De exemplu, în Perl :

 $ x = 3 meu; # declarații pentru mediul global
  $ meu meu = $ x;
  {# start subbloc
     $ z meu = "foo"; # declarații pentru mediul local
     $ x = 777 al meu;
     $ y = "$ y $ z $ x";
     }
  tipăriți "y este $ y, x este $ x \ n";
  print (definit ($ z)? "z valorează $ z \ n": "z nu există \ n");
  
  IEȘIRE> y este 3foo777, x este 3
  IEȘIRE> z nu există

La intrarea în subbloc, se generează un mediu local în care toate asociațiile mediului global sunt „copiate”, apoi asociațiile de mediu sunt generate așa cum se indică în declarații.

În exemplu, rețineți că a doua definiție a lui $x este locală pentru subbloc și, astfel, maschează valoarea globală. Orice utilizare a $x în cadrul sub-blocului se va referi, așadar, la mediul local. Utilizarea lui $y , pe de altă parte, se referă la mediul global și este văzută în mod clar în rezultatul generat. Rețineți că, atunci când subblocul este închis, mediul local este distrus, prin urmare, variabilele declarate intern nu vor mai exista în afara blocului.

Mediu non-local

Set de asociații care trebuie obținute de la alte subrutine urmând regulile de amplasare puse la dispoziție de limbă.

Să presupunem că un subprogram P conține o referință la numele x care nu este local pentru P și nu este global. Prin urmare, această referință trebuie rezolvată în mediul altor subrutine. Prin urmare, vor exista două posibilități diferite:

  • mediu non-localdinamic” (scop dinamic) - Referința la numele x va fi rezolvată cu ultima legare pentru x din lanțul de apeluri pentru P. Prin urmare, în fiecare activare subrutină sau bloc se generează un mediu nou: în acest fel nu este posibil să se stabilească a priori (static) ce asociere va fi utilizată, deoarece va depinde de fluxul de execuție al programului.
  • non-locală „statică“ mediu (static sau de definire a domeniului lexical) - Referința la numele x va fi rezolvată pe baza structurii sintactice a blocurilor de cuiburi și subrutine. Deci, mediul nelocal va fi cel al definiției subrutinei (și, prin urmare, „static”), și nu al aplicației (și, prin urmare, „dinamic”).

Pentru o mai mare claritate, a se vedea următorul exemplu, scris într-un pseudolingv:

 01: Proceduri B
  02: var x: ... // definit în B
  03: Proceduri P
  04: <utilizați x>
  05: endProc P
  06: beginBlock A
  07: Proceduri Q
  08: var x: ... // definit în Q, în interiorul blocului A
  09: Sunați la P       
  10: endProc Q
  11: Apelați Q
  12: endBlock A
  13: sfârșitul Proc B
  • Într-un mediu dinamic nelocal, apelarea Q la linia 11 va determina activarea unui nou mediu local, în care x este redefinit (linia 8) și, prin urmare, la apelarea P (linia 9), x pe care P îl va folosi în linia 4 se va referi la ultima definire. Rețineți că, în acest caz, mediul nelocal poate fi construit numai în timpul rulării.
  • Într-un mediu static non-local, x-ul utilizat în linia 4 este întotdeauna și în orice caz cel definit în linia 2, indiferent de alte redefiniri efectuate în alte subblocuri. Rețineți că astfel puteți defini mediul non-local deja la compilare.

Mediul în limbi interpretate

Conceptul formal de mediu este adesea simplificat în caracteristicile sale atunci când este utilizat un limbaj interpretat. Această categorie include, de exemplu, JavaScript , PHP , Perl , dar și cei mai cunoscuți interpreți de comandă ai oricărui sistem de operare . În mod normal, nu este obligatoriu să declarați în prealabil, de exemplu, variabilele care vor fi utilizate în corpul programului, deoarece interpretul se ocupă de alocarea memoriei și de crearea asociațiilor corespunzătoare în mediu de fiecare dată când este utilizată o nouă variabilă .

  • În cele mai avansate limbaje de scriptare, mediul poate fi structurat și într-un mod destul de complex, ca în orice limbaj imperativ care necesită compilare: în unele cazuri, de fapt, programul este supus unei compilări din mers și executat într-un mod mai optimizat.
  • În interpretii de comandă, mediul este adesea o simplă listă de asocieri între un identificator și o valoare de bază (de obicei un număr întreg sau un șir ). Fiecare nouă instanță interpretul moștenește în general mediul interpretului apelant (ca în Unix sau MS-DOS shell ); în mod similar, fiecare proces sau comandă invocată are posibilitatea de a citi acest mediu și, în unele cazuri, de a-l modifica. Adesea, acest tip de mediu conține informații legate de gestionarea caracteristicilor shell-ului în sine, cum ar fi lista de directoare unde să caute comenzi executabile (numită cale ), directorul implicit al utilizatorului (numit director de acasă ), caracteristicile terminal în uz și așa mai departe.

Elemente conexe

Informatică Portal IT : accesați intrările Wikipedia care se ocupă cu IT