Also, dein Prozessor ist Hardware, da hast du recht. Aber der Prozessor ist der Teil deines Computers, der deinen Code ausführt. Und um dein Programm auszuführen, benötigt er einen Ablaufplan, bzw eine Arbeitsanweisung, eben dein Programm. Aber dein Prozessor ist keine Wundermaschine, du kannst ihm nicht sagen "Rechne mal Pi aus". Im Grunde kann man ihm nur recht wenig Befehle geben, wovon jeder eine Eindeutige Nummer hat(Damit wären wir wieder bei den Zahlen). Ein Befehl alleine macht kein Programm aus, sondern erst die Kombination dieser.Assembler ist eine Programmiersprache, Prozessor aber eine Hardware. Welcher Zusammenhang besteht zwischen den beiden (Assembler und Prozessor) und dem Stack? Wie sieht überhaupt eine Datenstruktur aus? Welche Aufgaben hat diese und wie arbeitet sie?
Und wenn du eben direkt mit diesen Befehlen programmieren willst, nutzt du Assembler. In Assembler bekommt jeder Befehel einen sehr verkürzten Namen, z.B "mov", was kurz für "move" ist und Werte "verschiebt", also kopiert. Diese Befehle werden von einem "Assembler" genannten Programm direkt in eben die Hardwarebefehle umgesetzt, ohne Umwege. Damit ist Assembler die "Maschinensprache", weil das was du an Anweisungen hinschreibst auch so ausgeführt wird.
Assembler nutzt aber keiner zum Programmieren(es gibt einige Ausnahmen), da selbst einfacher Code viel zu viel Assemblercode bedeutet. Ein Hello-World in Assembler wäre sehr viel mehr Code als ein Hello-World in C.
Was eine Datenstruktur ist, hatten wir hier schon einmal. Eine Datenstruktur ist ein Überbegriff für die Organisation von Daten in einer gewissen Struktur.
Daten an sich können einfach nur Zahlen sein, aber z.B auch Messwerte wo du sehr viele Zahlen mit einem Zeitpunkt zu einem Datensatz verknüpfst.
Eine einfache Datenstruktur wäre z.B schon ein Array, es liegen alle Daten hintereinenader im Speicher, man kann auf alle zugreifen. Das Problem ist, wenn du zur Laufzeit noch nicht wissen kannst, wie viele Datensätze du hast und man mal nicht eben für 1000 Elemente Speicher reservieren kann, dann braucht man Datenstrukturen die dynamisch Speicher allozieren und alle Elemente verwalten.
Bekannte Datenstrukturen wären Listen, Bäume, Steaks, Heaps, Hashtabels, sortiere Listen, etc.
Dann geht es nicht nur darum, Daten irgendwie zu speichern und zu verwalten, sondern auch um Sortierungen und Zugriffsbeschränkungen zu geben. So kann man aus einer sortierten Liste sehr viel schneller die Elemente der Sortierung nach zu Bearbeiten, als sie erst zur Laufzeit aus einem Array heraus zu sortieren und dann zu verarbeiten.
Dann gibt es nicht DEN Stack, ein Stack ist auch NUR eine Datenstruktur, dein Beispiel ist z.B eine Implementation eines Stacks für beliebige Daten.
Worüber du redest ist der Programm-Stack, das muss klar sein. Der Programm-Stack(ich nenne es einfach mal pStack) ist ein essenzieller Teil eines Programms. So essenziell, dass man Funktionalität des pStacks direkt in den Prozessor gepackt hat, um Programme schneller auszuführen. Daher gibt es auch entsprechende Register im Prozessor, die eben Daten des pStacks enthalten, um nicht dauernd Daten aus dem Ram laden.
Ein Register ist ein Stück RAM, dass in der CPU direkt mit den funktionalen Komponenten verbunden ist.Was ist ein Register, wie funktioniert es und wofür brauche ich das für den Stack?
Ganz wichtig: Kein Speicher, keine Werte, keine Pointer, keine Zahlen, keine Register sind irgendwie besonders. Erst in den Moment, wo man sowas in einen Kontext setzt, wird es wichtig und besonders. Ein Pointer ist nichts besonderes, im Ram ist das auch nur eine Zahl, eine von vielen. Aber in dem Moment, wo ich sage, dass dies eine Rücksprungadresse ist, in diesem Moment ist diese Zahl von Bedeutung, weil es einen Kontext hat.
Und so ist es auch mit den Registern. Das ist alles "nur" Ram. Aber im Prozessor sind bestimmte Register mit bestimmten funktionalen Komponenten verbunden. So gibt es ein Register "PC"(Program Counter), welches die aktuelle Adresse des auszuführenden Befehls beinhaltet. Es ist nichts besonders, nur ein Stückchen Speicher. Aber dadurch, dass dieser Speicher im Kontext des Prozessors einen wichtigen Wert beinhaltet, ist es wichtig.
Der Stack wurde nicht "erfunden", das Konzept gab es schon bevor es Computer gab, aber es wurde genutzt, weil es sich als Sinnvoll erwiesen hat.Warum reichen die Rücksprungadressen nicht aus – warum muss man noch zusätzlich die Parameter sowie lokale Variablen einer Funktion sichern? Warum musste man eine ganze Datenstruktur (Stack) dafür erfinden und warum hat ein Prozessor sogar spezielle Stapelregister, die anscheinend nur dazu da sind, um die Daten im Stack zu verwalten/verarbeiten? Würde das nicht mit temporären Variablen ohne Stack funktionieren, die notwendige Informationen für den Funktionsaufruf temporär speichern?
Du redest von temporären Variablen und sprichst damit das Kernproblem an, warum man hier eine Datenstruktur nutzt. Wie groß sind denn deine Temporären Daten? Das weißt du nicht und daher brauchst du eine Struktur, die Dynamisch wachsen und schrumpfen kann: Der Stack.
Der Stack erfüllt auch ein weitere Kriterium: Sicherheit. Erst wenn alle Variablen, die beim Funktionsaufruf auf den Stack gelegt wurden herunter genommen wurden, kann das Programm nach der Funktion richtig weiter machen. Ist dem nicht der Fall, wird dein Programm crashen. Damit ist sichergestellt, das sich um alle Variablen gekümmert wird.
Der Prozessor hat entsprechende Stapelregister für den pStack, weil man so Zeit spart und schneller Rechnen kann.
Weil Prozessoren kompliziert sind. Generell besteht ein Problem: Wenn du Zahlen berechnen willst, die außerhalb der vom Prozessor definierten Grenzen liegt(32/64) Bit, wird es rechen aufwendig. Um zwei 64-Bit Zahlen zu multiplizieren braucht man auf einem 32-Bit System viele Operationen, auf einem 64-Bit System nicht.Warum ist Integer bei den 64 bit Systemen größer? Warum hat man das nicht einheitlich gemacht und für 64 bit Systeme spezielle Datentypen eingeführt z.B. int64 ?
Zum anderen ist der Datentyp "int" noch nie fest Definiert gewesen. Auf alten Prozessoren kann er nur 16-Bit breit sein, auf modernen System kann er 64-Bit breit sein. Es gibt die Typen "long" und "long long", die etwas strikter definiert sind.
http://www.proggen.org/forum/viewtopic.php?f=21&t=2126 und http://www.proggen.org/forum/viewtopic.php?f=21&t=372 haben wir mal getestet, wie groß die einzelnen Variablen sind. Lies dir das mal durch und nimm es erstmal hin.
Bitte auch hier wieder Unterscheiden: Ein Stack ist eine Datenstruktur, der pStack ist ein essentieller Teil eines Programms, dass von deinem Compiler erzeugt wird.Wie bzw. warum muss man Stack implementieren? Ich habe es so verstanden, dass der Stack essentiell ist und IMMER verwendet wird, wenn man eine Funktion aufruft – also so gut wie immer, da die meisten Programme nur aus Funktionen bestehen – ohne globalen Variablen. Werden nur globale Variablen ohne Stack verwaltet bzw. irgendwo willkürlich an beliebigen Stellen im Arbeitsspeicher gespeichert?
Listen sind Datenstrukturen. Die Register gehören zum pStack, haben also nichts damit zu tun, dass es eine Datenstruktur ist, sondern für den Programmfluss wichtigSind Listen also eine andere Datenstruktur? Gibt es dafür auch ein Register im Prozessor? In dem Beispiel oben aus dem Youtube-Video werden aber die Daten mittels von Listen auf den Stack geschrieben, deshalb dachte ich, dass Listen bzw. Strukturen genau so wie Funktionen auf dem Stack liegen? (total verwirrt )
MfG cloidnerux.