Ist es möglich, dass eine stapelbasierte Programmiersprache gleichzeitig ausgeführt wird?


14

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


5
Wie kann eine imperative Sprache gleichzeitig sein?
Bergi


Meinen Sie wirklich Parallelität (was nicht so schwer zu erreichen ist, verwenden Sie einfach mehrere Threads, die mit unabhängigen Stacks und gemeinsam genutztem Speicher ausgeführt werden) oder Parallelität?
Daniel Jour

@ DanielJour Wenn ich es richtig verstehe, bedeutet Parallelität gleichzeitige Ausführung, während Parallelität unabhängige Ausführung bedeutet. Also, ja, ich meine Parallelität. Können Sie mehr über die unabhängigen Stapel für jeden Thread herausfinden?
Armando H.

Antworten:


16

Können stapelbasierte Programmiersprachen gleichzeitig verwendet werden?

Sicher.

Könnten sie durch die gleichzeitige Verwendung mehrerer Stapel oder ähnliches eine Parallelität erreichen?

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 parAnmerkungen 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 cEntweder 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.

Ist es möglich, Lazy Evaluation in einer Stack-basierten Programmiersprache zu implementieren?

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.


8

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.


4
Msgstr "Um echte gleichzeitige Programme zu haben, benötigen Sie mindestens zwei Ausführungseinheiten". Dies ist lediglich ein Implementierungsproblem. Aus Sicht der Programmiersprache gibt es fast keinen Unterschied zwischen zwei Threads, die auf einer oder zwei CPUs ausgeführt werden. In gewisser Weise kann jeder Thread als "Ausführungseinheit" für sich betrachtet werden.
Diskrete Eidechse

1
Manchmal müssen Implementierungsdetails berücksichtigt werden. Ein Beispiel ist die Schnittstelle zur realen Welt außerhalb eines realen Computers. In harter Echtzeit, da "Richtige Antwort zu spät ist falsch", kann das Timing unterschiedlich sein, wenn Sie das Laufen auf zwei Ausführungseinheiten mit dem Laufen gemischt auf einer Einheit vergleichen.
Ghellquist

Manchmal machen wir. Ich bezweifle jedoch, dass dies ein solcher Fall ist. In der Frage werden beispielsweise keine Anforderungen für die Echtzeitplanung genannt.
Diskrete Eidechse

3
"Concurrency"! = "Parallelität". Man kann sagen, dass mehrere Threads, die auf einem Computer mit einer CPU ausgeführt werden, gleichzeitig ausgeführt werden, obwohl keine parallele Verarbeitung stattfindet.
Solomon Slow

Punkt genommen über Parallelität gegen Parallelen. Ich werde den Text ändern.
Ghellquist
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.