it-swarm.com.de

Ist ein Call-Stack für eine robuste Computerarchitektur erforderlich?

Ich bin mit der Terminologie der Computerarchitektur noch nicht allzu vertraut. Bitte nehmen Sie Kontakt mit mir auf. Ich scheine zu verstehen, dass von Neumann-Architekturen robuster sind ("universelle Turing-Maschinen") als Harvard-Architekturen, aber noch nicht zu viel über die Details wissen.

Nachdem ich die letzten Nächte damit verbracht habe, in den Call Stack zu schauen, bin ich immer noch verwirrt . Ich habe auch hier und da ein paar Artikel gesehen (nur die Abstracts für den Moment scannen), wie Programmieren ohne Aufrufstapel und andere, weshalb ich mich frage, ob es Systeme/Architekturen zum Definieren einer virtuellen Maschine ohne Aufrufstapel gibt. Ich weiß nicht genau, wie es aussehen würde, aber vielleicht gibt es einige Dinge zu überprüfen. Ich spreche nicht von einfachen Maschinen, wie jenen aus der Zeit vor den 1960er Jahren, die keine Rekursion hatten und daher keine Call-Stacks brauchten, denke ich . Ich spreche von vollständig robusten/vollständigen Computerarchitekturen, die etwas anderes als einen Aufrufstapel verwenden.

4
Lance Pollard

... was mich fragt, ob es Systeme/Architekturen zum Definieren einer virtuellen Maschine ohne Aufrufstapel gibt

Continuation Passing Style aktiviert Tail Call Optimization für alle Funktionsaufrufe - daher wird kein Stack benötigt; Der Heap-Speicher wird jedoch höchstwahrscheinlich verwendet, um die Verschlüsse zu speichern, die Verweise auf lokale Variablen erfassen.

CPS wird in einigen Compilern als Zwischenform (z. B. in einem virtuellen Befehlssatz) verwendet, um den expliziten Kontrollfluss darzustellen, insbesondere was bei Ausnahmen und der Ausnahmebehandlung geschieht.


Der Stapel ist eine sehr effiziente Datenstruktur: Die Oberseite des Stapels befindet sich mit ziemlicher Sicherheit im Datencache, und die Zuweisung und Freigabe erfolgt sehr schnell (d. H. Ein Befehl). Der Stapel ist ein notwendiger Bestandteil für C-Programme, daher ist es unwahrscheinlich, dass ein moderner Computer ohne explizite Unterstützung für einen Stapel hergestellt wird.

Um klar zu sein, MIPS und RISC V verfügen jedoch nicht über separate hardwarespezifische Stapelzeiger oder Push- und Pop-Anweisungen. Die Software verwendet auf diese Weise einfach eines der vielen Allzweckregister.

13
Erik Eidt

Ich denke nicht, dass Robustheit hier ein Thema ist. Funktionalität ist im wahrsten Sinne des Wortes.

Vergessen Sie für einen Moment die Implementierungsdetails und überlegen Sie, was ein Aufrufstapel wirklich ist. Sie können Unterprogramme (Funktionen) aufrufen und von diesen zurückkehren, wo Sie aufgehört haben. Das heißt, es bietet die Möglichkeit, ein Problem in kleinere Teile aufzuteilen und funktionale Bausteine ​​zu erstellen.

Dies ist ein so grundlegendes Merkmal in einer Allzweck-Problemlösungsmaschine, dass man sich ohne es kaum vorstellen kann. Es wäre nutzlos, weil es keine Möglichkeit gäbe, etwas Komplexes zu schaffen.

2
Martin Maat

Was Sie als "robust" bezeichnen, ist eine Frage der Präferenz.

Stapel sind nützlich, aber die Architektur muss sie nicht direkt definieren.
Ein Programm kann immer seine eigenen Stapel erstellen, wenn sie dies wünschen.

Hardware-Unterstützung für etwas macht es schneller, aber weniger flexibel.

Architekturen mit Aufrufstapeln führen Funktionsaufrufe schnell aus, aber nicht sehr schnell, da normalerweise mit Argumentübertragungen zu tun ist.

Auf der anderen Seite sind Sie für Funktionsaufrufe und Rückgaben in eine Last-In-First-Out-Welt eingebunden. Wenn Sie coroutines verwenden möchten, hilft Ihnen der Stapel nicht mehr.

Die Hardware, die wir haben, wirkt sich auf die Programme aus, die wir schreiben. Und die Programme, die wir schreiben, wirken sich auf die gewünschte Hardware aus. Am Ende scheint das, was wir haben, "notwendig" zu sein, auch wenn es nur eine Wahl von vielen ist.

0
Stig Hemmer

Sie brauchen keinen Aufruf Stapel unbedingt auf jeder Ebene, sei es auf Programmiersprachenebene oder auf Hardwareebene.

Aus Sicht der Computerarchitektur muss keine Hardware-Unterstützung für einen gesegneten Stapel vorhanden sein (z. B. ein spezielles Stapelzeigerregister, Anweisungen zum Laden und Speichern von Werten relativ zu diesem Stapel usw.), um eine Sprache mit semi-willkürlichen Eigenschaften zu implementieren Verschachtelung von Funktionsaufrufen wie C oder Schema. Sie können Ihr eigenes Register mit einer Register-Offset-Adressierung implementieren und das Register, das Sie als "Stapelzeiger" bezeichnet haben, manuell inkrementieren und dekrementieren. Die Call-Stack-Unterstützung im Befehlssatz dient der Kompaktheit des Maschinencodes.

Aus Sicht der Programmiersprache ist der Stack nur ein Implementierungsdetail. Der C-Standard nennt es keinen Stapel, er bezeichnet Stapelvariablen als "automatisch" (da ihr Speicher automatisch freigegeben wird, wenn Sie den Bereich verlassen, in dem sie definiert wurden). Die Standardaufrufkonvention in gängigen Betriebssystemen besteht darin, den Stack zu verwenden, sodass die Leute davon ausgehen, dass dies getan werden muss.

Sprachen mit erstklassigen Fortsetzungen funktionieren konzeptionell nicht wie ein Stapel. Bei vierten Implementierungen werden normalerweise zwei Stapel verwendet. CPSd-Code verwendet konzeptionell keinen Stapel. Es gibt viele Möglichkeiten, dies zu tun, von Heap-zugewiesenen Verzweigungsstapeln, die zum Implementieren von Fortsetzungen und Coroutinen verwendet werden, bis hin zu Moorstandard C.

0
Miles Rout