Pila de crides

De la Viquipèdia, l'enciclopèdia lliure
Disseny de la pila de crides per a piles que creixen a l'alça després de la subrutina DrawSquare (mostrada en blau) anomenada DrawLine (mostrada en verd), que és la rutina que s'està executant actualment.

En informàtica, una pila de crides és una estructura de dades de pila que emmagatzema informació sobre les subrutines actives d'un programa informàtic. Aquest tipus de pila també es coneix com a pila d'execució, pila de programes, pila de control, pila en temps d'execució o pila de màquina, i sovint s'escurça només a "la pila". Tot i que el manteniment de la pila de crides és important per al bon funcionament de la majoria del programari, els detalls solen estar ocults i automàtics en llenguatges de programació d'alt nivell. Molts conjunts d'instruccions d'ordinador proporcionen instruccions especials per manipular les piles.[1]

Una pila de crides s'utilitza per a diversos propòsits relacionats, però el motiu principal per tenir-ne una és fer un seguiment del punt al qual cada subrutina activa hauria de tornar el control quan s'acabi d'executar. Una subrutina activa és aquella que s'ha cridat, però encara s'ha d'executar, després de la qual s'ha de retornar el control al punt de trucada. Aquestes activacions de subrutines es poden imbricar a qualsevol nivell (recursiu com a cas especial), d'aquí l'estructura de pila. Per exemple, si una subrutina DrawSquare crida a una subrutina DrawLine des de quatre llocs diferents, DrawLine ha de saber on ha de tornar quan finalitzi la seva execució. Per aconseguir-ho, l'adreça que segueix la instrucció que salta a DrawLine, l'adreça de retorn, es posa a la part superior de la pila de crides amb cada trucada.[2]

Descripció[modifica]

Com que la pila de crides s'organitza com una pila, la persona que truca envia l'adreça de retorn a la pila i la subrutina trucada, quan acaba, treu o treu l'adreça de retorn de la pila de crides i transfereix el control a aquesta adreça. Si una subrutina cridada fa una crida a una altra subrutina, enviarà una altra adreça de retorn a la pila de crides, i així successivament, amb la informació apilada i desapilada tal com ho indiqui el programa. Si el push consumeix tot l'espai assignat per a la pila de crides, es produeix un error anomenat desbordament de pila, que generalment fa que el programa es bloquegi. Afegir l'entrada d'una subrutina a la pila de crides de vegades s'anomena "winding"; per contra, eliminar entrades és "desbobinar".

En llenguatges de programació d'alt nivell, els detalls de la pila de crides solen estar ocults al programador. Només tenen accés a un conjunt de funcions, i no a la memòria de la pila en si. Aquest és un exemple d'abstracció. D'altra banda, la majoria dels llenguatges assemblador requereixen que els programadors s'impliquin en la manipulació de la pila. Els detalls reals de la pila en un llenguatge de programació depenen del compilador, el sistema operatiu i el conjunt d'instruccions disponible.[3]

Estructura[modifica]

Una pila de crides està formada per quadres de pila (també anomenats registres d'activació o marcs d'activació). Aquestes són estructures de dades dependents de la màquina i de l'ABI que contenen informació d'estat de subrutina. Cada trama de pila correspon a una trucada a una subrutina que encara no ha acabat amb un retorn. Per exemple, si s'està executant una subrutina anomenada DrawLine, després d'haver estat cridada per una subrutina DrawSquare, la part superior de la pila de crides es podria disposar com a la imatge adjacent.

El marc de pila a la part superior de la pila és per a la rutina que s'està executant, que pot accedir a la informació dins del seu marc (com ara paràmetres o variables locals) en qualsevol ordre.[4] El marc de pila normalment inclou almenys els elements següents (en ordre d'inserció):

  • els arguments (valors dels paràmetres) passats a la rutina (si n'hi ha);
  • l'adreça de retorn de tornada a l'interlocutor de la rutina (per exemple, al marc de la pila DrawLine, una adreça al codi de DrawSquare); i
  • espai per a les variables locals de la rutina (si n'hi ha)

Funcions de la pila de crides[modifica]

  • Apilar i emmarcar punters
  • Emmagatzemar l'adreça al marc de la crida

Referències[modifica]

  1. «Call stack - MDN Web Docs Glossary: Definitions of Web-related terms | MDN» (en anglès americà). https://developer.mozilla.org,+08-06-2023.+[Consulta: 1r setembre 2023].
  2. «The Call Stack» (en anglès). https://www.baeldung.com.+[Consulta: 1r setembre 2023].
  3. «Call Stack | Interview Cake» (en anglès). https://www.interviewcake.com.+[Consulta: 1r setembre 2023].
  4. Krzyzanowski, Paul. «Stack frames» (en anglès). Rutgers University. https://people.cs.rutgers.edu,+February 16, 2018. Arxivat de l'original el 2021-08-28. [Consulta: December 19, 2021].