====== Der Programmaufrufstack ====== Unter dem (Programm)Aufrufstapel (englisch call stack, procedure stack) versteht man einen besonders genutzten Stapelspeicher, der zur Laufzeit eines Programms den Zustand der gerade aufgerufenen Unterprogramme enthält. Was bedeutet das? Wir betrachten ein Beispiel: public class Hallo { public Hallo(String name) { System.out.println("Hallo " + name + "!"); GruessGott(name); System.out.println("Ich glaube, gleich verabschiede ich mich..."); AufWiedersehen(); AufWiedersehen(); } public void GruessGott(String name) { System.out.println("Grueß Gott, " + name + "!"); } public void AufWiedersehen() { System.out.println("Ciao!"); } } Beim Aufruf des Konstruktors werden also zwei weitere Methoden, also "Unterprogramme", aufgerufen, der Ablauf sieht etwa wie folgt aus. {{ :faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack:stack01.drawio.png |}} Dabei fällt auf, dass der Programmablauf nach jedem Aufruf eines Unterprogramms zu der Stelle zurückkehren muss, von der dieses aufgerufen wurde. Das wird dadurch realisiert, dass beim Aufruf einer Methode/Funktion auf dem **Programmaufrufstack** für jede Methode ein Speicherbereich reserviert wird, in dem alle relevanten Infos festgehalten werden, unter anderem auch die Rücksprungadresse, also die Stelle, von der aus die Methode gestartet wurde. ^ Was passiert ^ Wie sieht der Stack aus? ^ |\\ || | Der Konstruktor wird mit dem Argument ''name'' aufgerufen.\\ Auf dem Stack wird Speicher für den \\ Konstruktoraufruf reserviert. Es gibt keine Rücksprungadresse | {{ .:stack001.drawio.png |}} | |\\ || | Aus dem Konstruktor heraus wird die Methode ''GruessGott'' mit dem\\ Argument ''name'' aufgerufen.\\ Die Stelle für die Rückkehr nach Bearbeitung von ''GruessGott'' wird vermerkt.| {{ .:stack002.drawio.png |}} | |\\ || | Die Bearbeitung von ''GruessGott'' ist beendet.\\ Der zugehörige Speicherbereich im Call-Stack wird freigegeben.\\ Im Konstruktor wird die Verabschiedung angekündigt. | {{ .:stack001.drawio.png |}} | |\\ || | Aus dem Konstruktor heraus wird die Methode ''AufWiedersehen'' aufgerufen.\\ Keine Argumente, Rücksprungadresse wird vermerkt. | {{ .:stack003.drawio.png |}} | |\\ || | Der erste Aufruf von ''AufWiedersehen'' ist beendet.\\ Der Programmablauf kehrt zum Konstruktor zurück. | {{ .:stack001.drawio.png |}} | |\\ || | Aus dem Konstruktor heraus wird die Methode ''AufWiedersehen'' erneut aufgerufen.\\ Keine Argumente, Die **neue** Rücksprungadresse wird vermerkt. | {{ .:stack004.drawio.png |}} | |\\ || | Der zweite Aufruf von ''AufWiedersehen'' ist beendet.\\ Der Programmablauf kehrt zum Konstruktor zurück. | {{ .:stack001.drawio.png |}} | |\\ || |Der Konstruktoraufruf ist beendet.\\ Der Call-Stack ist leer. | {{ .:stack000.drawio.png |}} | ---- {{:aufgabe.png?nolink |}} === (A1) === Welche Informationen kannst du den folgenden Darstellungen des Programmaufrufstacks entnehmen? Welche Informationen kannst du den Darstellungen des Stacks nicht entnehmen? {{ :faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack:stack02.drawio.png |}} ---- {{ :faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack:stack03.drawio.png |}}