Nächste Überarbeitung | Vorherige Überarbeitung Nächste ÜberarbeitungBeide Seiten, nächste Überarbeitung |
faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack:start [13.01.2022 08:59] – angelegt sbel | faecher:informatik:oberstufe:algorithmen:rekursion:programmaufrufstack:start [13.01.2022 10:19] – sbel |
---|
====== Der Programmaufrufstack ====== | ====== 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 |}} | |
| |
| ---- |
| {{: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 |}} |