Ich habe über Stack-basierte Programmiersprachen wie FORTH und Cat gelesen , und es scheint, dass sie aufgrund ihrer Natur immer nur eine Aktion gleichzeitig ausführen können, unabhängig von ihrem Paradigma (FORTH ist unerlässlich, während Cat funktionsfähig ist).
Eine imperative Sprache würde den Stapel modifizieren und eine rein funktionale Sprache wie Joy würde einen neuen Stapel zurückgeben, aber der Punkt ist, dass nur jeweils ein Stapel verwendet wird.
Können stapelbasierte Programmiersprachen gleichzeitig verwendet werden? Könnten sie durch die gleichzeitige Verwendung mehrerer Stapel oder ähnliches eine Parallelität erreichen?
Ist es möglich, Lazy Evaluation in einer Stack-basierten Programmiersprache zu implementieren?
Bitte korrigieren Sie mich, wenn ich etwas über die oben genannten Sprachen und Konzepte falsch verstehe
quelle
Antworten:
Sicher.
Bereits für normale Sprachen bedeutet Multithreading in der Regel mehrere "Aufruf" -Stapel. Es wäre völlig natürlich, jedem Thread einen eigenen Datenstapel zuzuweisen. Es wäre unkompliziert, einen Schauspieler zu haben, dessen Hauptteil durch Code in einer stapelbasierten Sprache implementiert wurde. Explizite Parallelität a la GHCs
par
Anmerkungen sollten relativ einfach sein. Das Hauptproblem bei der parallelen Ausführung ist, dass Sie nicht wissen, wie sich der Code auf den Stapel auswirkt, bis Sie ihn ausführen. Wenn man jedoch eine Joy-ähnliche Syntax verwendet, könnte man sich vorstellen[a b c] par
, dass sie ausgeführt wirda b c
Entweder gegen einen leeren Stapel oder eine Kopie des Stapels und nur das oberste Element des Stapels nach Abschluss behalten (oder einen Dummy-Wert drücken, wenn der Stapel leer ist). Sie können sich Variationen vorstellen. Implizite Parallelität wäre naiver schwieriger als etwa eine rein funktionale Sprache, könnte aber sicherlich auch gemacht werden. Der kompilierte Code eines benutzerdefinierten Kombinators unterscheidet sich häufig nicht zu sehr vom "normalen" Code.Unbekannte Stapeleffekte sind wieder der schwierige Teil. Wenn Sie die Sprache so gestalten, dass alle Stapeleffekte statisch bestimmt werden können, ist dies keine allzu große Herausforderung. Wenn Sie Faulheit haben, dann scheint es auch relativ einfach zu sein und würde ungefähr wie Joys Zitate und aussehen
i
. Eine Sprache , die sich faul als verkettete Sprache bezeichnet, scheint eine Mischung aus beiden oben genannten Ansätzen zu machen, soweit ich das beurteilen kann. Ich sehe nicht wirklich ein, wie eine implizit träge verkettete Sprache angesichts dynamischer Stapeleffekte funktionieren würde, zumindest nicht auf vage brauchbare Weise, aber das könnte nur ein Mangel an Vorstellungskraft meinerseits sein.Übrigens ist es bei stapelbasierten Sprachen nicht ungewöhnlich, dass mehrere Stapel vorliegen, z. B. verfügt Forth über einen Datenstapel und einen Rückgabestapel, auf denen Sie auch beliebige Daten ablegen können.
quelle
Ich weiß ein bisschen über FORTH Bescheid und werde mich darauf beschränken. Es ist eine einfache Sprache, mit der Sie als Programmierer auf alle Hardwareressourcen zugreifen können. Sie können also tun, was Sie möchten.
Parallelität
Um Parallell-Programme zu haben (edit: wird verwendet, um echte parallele Programme auszudrücken), benötigen Sie mindestens zwei Ausführungseinheiten (CPU). Es wäre ziemlich trivial, ein Wort in FORTH zu implementieren, das beispielsweise lautet: "Führen Sie dieses Wort mit diesen beiden Argumenten auf Prozessor 2 aus". Das Wort würde die zwei benötigten Stapel auf Prozessor 2 zuordnen und die Ausführung des Wortes starten. Sie müssen sich darauf beschränken, welche Konstrukte Sie in diesem Programm verwenden können.
Wenn die Anzahl der gleichzeitigen Programme größer ist als die Anzahl der Ausführungseinheiten, würden Sie "Pseudo-Parallell" -Programme wählen. Grundsätzlich gibt es zwei Möglichkeiten, dies zu tun: Coroutinen oder präventives Multitasking. In jedem Fall ist es möglich (nicht einfach, aber in der Literatur gut beschrieben), dies zu erreichen, und FORTH ermöglicht Ihnen den Zugriff auf alle benötigten Inhalte auf niedrigem Niveau.
Faule Bewertung
Natürlich können Sie dies in FORTH wie in fast jeder Programmiersprache tun. Es wird nicht so elegant oder "eingebaut" sein wie in Haskell. Ich werde ein sehr naives Beispiel verwenden.
Die Idee ist, dass Sie eine "Funktion" definieren (die hier lose verwendet wird), die eine Reihe von Dingen zurückgibt. Ein Beispiel wäre eine Funktion, die alle ganzen Zahlen zurückgibt. Sie führen dann Operationen an diesem Set durch und geben das Ergebnis aus, wenn Sie fertig sind. Beispielsweise möchten Sie möglicherweise alle Ganzzahlen summieren, bis die Summe größer als 1000 ist. Bei einer nicht verzögerten Auswertung werden zunächst alle Ganzzahlen als eine Menge zugeordnet, was unmöglich ist, da es unendlich viele Ganzzahlen gibt. Es würde dann anfangen, an diesem Set zu arbeiten. Eine faule Implementierung hätte die Möglichkeit, "mir den nächsten Wert in der Menge zu geben". Dazu wird in der Funktion "last value give" wirklich nur eine Variable benötigt.
Haskell macht die Dinge so. Natürlich behandelt es kompliziertere Situationen, aber die Idee ist dieselbe. Es beschönigt die Auswertung auf eine Weise, die es Ihnen als Programmierer ermöglicht, sich auf das Problem zu konzentrieren und nicht darauf, wie es zu lösen ist.
quelle