stiva de apel

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

În informatică , un teanc de apel (literalmente tradus din limba engleză ca „stiva de apel“) este o zonă de memorie a unui program, organizat sub forma unei stive , în care informațiile cu privire la active , subrutine este stocată la un moment dat ( subrutine active sunt cele care au fost invocate , dar a căror executare nu a terminat). Acesta poate fi tradus ca un teanc de invocărilor funcție (sau funcție de apeluri) sau apeluri de metode pentru stivă (sau metoda de apeluri) , în funcție de tipul de subrutinei implicat.

Acest tip de baterie este adesea numit stiva de execuție, de control stivă, funcția de stivă, sau stivă run-time, sau atunci când nu există nici o posibilitate de confuzie, pur și simplu stiva.

Setul de informații specifice unui subrutină într - o stivă apel este numit cadru.

Operațiune

Exemplu

Motivul pentru care aveți nevoie pentru a lua o stivă apel ține evidența în cazul în care fiecare subrutină activ ar trebui să se întoarcă de control în cazul în care executarea. În cazul în care, de exemplu, un DrawSquare (desena un pătrat) subrutină numește DrawLine (trage o linie) subrutina din patru puncte diferite, codul DrawLine trebuie să fie în măsură să știe unde să se întoarcă după execuție. Această sarcină este realizată în mod obișnuit prin codul pentru fiecare apel în termen de DrawSquare prin introducerea adresei " instrucțiunii după o anumită declarație de apel («adresa de returnare»sau adresa de retur) în stiva de apel.

Având în vedere că stiva de apel este organizată ca o stivă, funcția apelantului pune adresa expeditorului pe stivă și apelul subrutină, atunci când se termină, se elimină adresa de retur din stivă și transferă controlul la acea adresă. În cazul în care o subrutină numit un alt apeluri subrutina, se va pune adresa de retur de pe stiva de apel și , astfel încât informațiile sunt stivuite și eliminate în conformitate cu cerințele programului . Dacă utilizați tot spațiul disponibil pentru stiva de apel, o eroare numită stivă overflow . Adăugați un apel subrutină stivă este definit în înfășurării ; îndepărtarea este numit unwinding.

Există , de obicei , doar un teanc de apel asociat cu un program de funcționare (sau mai precis cu fiecare sarcină sau fir a unui proces), cu toate acestea stiva suplimentare pot fi create pentru a gestiona semnale sau pentru multitasking cooperativ. Deoarece există doar unul în acest context de important, suntem pur și simplu, referindu-se la stiva (implicit „a sarcinii“).

În limbajele de programare de nivel înalt, specificațiile stiva de apel sunt ascunse de programator . Acesta din urmă are acces numai la lista de funcții și nu în memoria ocupată de stiva, nici la structura internă adoptată. Multe limbaje de asamblare pe de altă parte, necesită programatori să fie implicate în managementul stivă. Detaliile stivei într-un limbaj de programare, de asemenea, depinde de compilator, sistemul de operare și instrucțiunile disponibile.

Obiectivele stiva de apel

Scopul principal al stiva de apel este:

  • stocarea adreselor de returnare - Când o subrutină este numit, educația adresa de retur trebuie să fie salvat pe undeva. Folosind o stivă pentru a stoca adrese de returnare are avantaje majore fata de alternativele. Una dintre acestea este faptul că fiecare sarcină are propria stiva și, prin urmare, subrutine poate fi „reintrare“ și, prin urmare, pot fi active simultan pentru diferite sarcini care fac lucruri diferite. Un alt avantaj este acela că recursivitatea este acceptată în mod automat. Atunci când o funcție în sine numește recursiv, o adresă de retur trebuie să fie înregistrate pentru fiecare activare a funcției, astfel încât să poată fi utilizat pentru întoarcerea de la fiecare activare a funcției. Această capacitate este automată, cu o stivă.

Un teanc de apel poate avea alte scopuri, în funcție de limba, sistemul de operare, și mediul de mașină. Între acestea:

  • stocarea de date locale - necesită o subrutină frecvent spațiu de memorie pentru a înregistra valorile variabilelor locale, variabilele care sunt utilizate numai în subrutina activă și care nu trebuie să păstreze valorile după revenirea (la funcția de asteptare). Acesta este adesea convenabil să aloce spațiu pentru această utilizare pentru a muta pur și simplu, în partea de sus a stivei suficient pentru a avea spațiu. Este foarte rapid în comparație, de exemplu, cu alocare de tip heap . Fiecare activare diferită a unei subrutine are propriul spațiu separat pentru stiva de date locale.
  • parametru de trecere - subrutine de multe ori necesită ca valorile parametrilor sunt furnizate de codul pe care le -a numit, și nu este neobișnuit ca spațiul pentru acești parametri pot fi în stiva de apel. În general, în cazul în care există doar câțiva parametri mici, registrele procesorului , poate fi utilizat pentru trecerea valorilor, dar în cazul în care există mai mulți parametri pentru a gestiona în acest fel, este necesar spațiu în memorie. Stiva de apel funcționează cel mai bine ca un loc pentru acești parametri, mai ales că fiecare apel subprogram, care va avea valori diferite ale parametrilor, va avea un spațiu separat în stiva de apel pentru aceste valori.
  • stiva de evaluare - de operanzii pentru operații aritmetice și logice sunt adesea inserate în registru și folosit acolo. Cu toate acestea, în unele situații operanzii pot fi stivuite la o adâncime arbitrară, ceea ce înseamnă că ceva mai mult decât trebuie utilizat registru. Teancul acestor operanzi, similar cu calculatoare de tip RPN, se numește stiva de evaluare și poate dura până spațiu pe stiva de apel.
  • indicatorul exemplu curent - Unele limbaje orientate obiect (cum ar fi C ++ ), stoca acest indicator ca argument al funcțiilor din stiva de apel atunci când invoca o metodă. Acest puncte pointer la instanta a obiectului pe care metoda invocată este asociat. Este o parte esențială a contextului de execuție a limbilor orientate-obiect, deoarece oferă acces la datele deținute de obiectul curent. Acest indicator este legat de straturi folosite în programarea orientată pe obiecte stratificat (tipuri de structuri de stivă) din stivă de apeluri run-time.
  • Mediu de containere subrutină - Unele limbaje de programare (cum ar fi Pascal și Ada ) sprijin subrutine imbricate , care să permită o rutină internă pentru a accesa contextul său de rutină container, adică parametrii și variabilele locale în mediul de rutină extern. Astfel de limbi, în general, permite rutine pentru a efectua apeluri recursive (funcția se numește), rezultând în mai multe stive de apel pentru apeluri de rutină la rutina interne, fiecare arătând în același mediu ca rutină externă. Acest tip de cadru este , de asemenea , cunoscut sub numele de afișare apel.

Elemente conexe

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