Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung |
faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack:start [13.01.2022 10:11] – sbel | faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack:start [Unbekanntes Datum] (aktuell) – gelöscht - Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 |
---|
====== 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: | |
| |
<code java> | |
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!"); | |
} | |
| |
} | |
</code> | |
| |
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 | {{ :faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack: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.| {{ :faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack: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. | {{ :faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack:stack001.drawio.png |}} | | |
|\\ || | |
| Aus dem Konstruktor heraus wird die Methode ''AufWiedersehen'' aufgerufen.\\ Keine Argumente, Rücksprungadresse wird vermerkt. | {{ :faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack:stack003.drawio.png |}} | | |
|\\ || | |
| Der erste Aufruf von ''AufWiedersehen'' ist beendet.\\ Der Programmablauf kehrt zum Konstruktor zurück. | {{ :faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack:stack001.drawio.png |}} | | |
|\\ || | |
| Aus dem Konstruktor heraus wird die Methode ''AufWiedersehen'' erneut aufgerufen.\\ Keine Argumente, Die **neue** Rücksprungadresse wird vermerkt. | {{ :faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack:stack004.drawio.png |}} | | |
|\\ || | |
| Der zweite Aufruf von ''AufWiedersehen'' ist beendet.\\ Der Programmablauf kehrt zum Konstruktor zurück. | {{ :faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack:stack001.drawio.png |}} | | |
|\\ || | |
|Der Konstruktoraufruf ist beendet.\\ Der Call-Stack ist leer. | {{ :faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack:stack000.drawio.png |}} | | |