Gibt es praktische Anwendungen für Nicht-von-Neumann-Programmiermodelle? Was sind die am weitesten verbreiteten Nicht-von-Neumann-Programmiersprachen?
universal-computation
logic-programming
Len Yabloko
quelle
quelle
Antworten:
Wenn ich "von Neumann-Architektur" sage, meine ich Hardware, die durch den "von Neumann-Engpass" begrenzt ist - dh, alle Daten werden über einen schmalen Datenbus übertragen.
Die Nicht-von-Neumann-Programmiersprachen, auf die ich am häufigsten stoße, sind VHDL und Verilog . In VHDL und Verilog geschieht standardmäßig alles zur gleichen Zeit. Der Programmierer muss zusätzliche Anstrengungen unternehmen, um eine Reihe von Ereignissen in sequentieller Reihenfolge aufzurufen. Dies unterscheidet sich stark von den meisten anderen Programmiersprachen, die einen "Anweisungszeiger" implizieren, der standardmäßig zu jedem Zeitpunkt höchstens eine Codezeile ausführt, und der Programmierer muss sich zusätzliche Mühe geben, um mehrere Dinge gleichzeitig zu erledigen Zeit.
Einige Leute würden sagen, dass dies eine natürlichere Voreinstellung ist. Viele Programmieranfänger erwarten eine "while (x> 0) {...}" - Schleife, um den Moment zu beenden, in dem x gleich Null wird, und sie sind überrascht zu erfahren, dass der Computer diesen Zustand nicht kontinuierlich auswertet.
Die meisten Leute, die VHDL- und Verilog-Code schreiben, kompilieren ihre Programme auf FPGAs und erzeugen kleine Aktivitätsblöcke, die alle die ganze Zeit mit voller Geschwindigkeit laufen. Häufig richten solche Leute eine "Pipeline" ein, die Daten von den Eingangsanschlüssen liest, sie durch eine Reihe von Blöcken verarbeitet, die Ausgangsanschlüsse eines Blocks direkt mit den Eingangsanschlüssen des nächsten Blocks verdrahtet und den letzten Block das Ergebnis sendet die Ausgangsstifte. Es erinnert an die Unix-Pipeline , nur dass bei jedem Taktzyklus ein neues Datenelement eingeht und ein neues Datenelement ausgegeben wird.
Die Eingangsstifte, die Zwischenstufen und die Ausgangsstifte sind alle unabhängig voneinander - Sie müssen keinen einzelnen Datenbus wiederverwenden, der zwischen den verschiedenen Datenelementen gemultiplext ist.
Das könnte Sie auch interessieren: Gibt es neben den von neumann / turing-Architekturen noch andere Computerarchitekturen?
quelle
Ich nehme an, mit Nicht-Von-Neumann meinen Sie Sprachen, die den "Von-Neumann-Engpass" umgangen haben, wie in Backus 'Artikel "Kann die Programmierung vom Von-Neumann-Stil befreit werden?". Interessenten finden hier eine Kopie: http://www.thocp.net/biographies/papers/backus_turingaward_lecture.pdf
Die Antwort auf Ihre Frage muss aus mehreren Gründen mehrdeutig sein.
Erstens, welche Sprachen erfüllten die Kriterien in seiner Arbeit? Obwohl es solche gibt, die die funktionale Programmierung in diesem Artikel nachzeichnen, wird dies jetzt als Missverständnis angesehen, da er so etwas wie eine punktfreie Programmierung meinte. Gehen Sie also mit dem ursprünglichen Missverständnis oder der wahren Absicht des Papiers? Weitere Informationen zu seiner Bedeutung finden Sie unter http://en.wikipedia.org/wiki/Function-level_programming
Zweitens, wenn Sie mit dem Missverständnis gehen, wie funktional ist funktional? Sie haben reine Funktionssprachen, unreine Funktionssprachen und Sprachen, die dem Funktionsparadigma relativ nahe stehen. In Anbetracht dessen, dass Sie die Popularität erwähnen und es eine umgekehrte Beziehung zwischen dieser und der funktionalen Reinheit gibt, welche Sprachen sollten eingeschlossen werden? Möchten Sie die populärste reine Funktionssprache (die überhaupt nicht populär wäre) oder eine populärere, die einige Mindestkriterien für "Funktionsfähigkeit" erfüllt? Wenn letzteres, nach welchen Kriterien?
Also je nach Standpunkt:
Haskell ist die beliebteste der vollständig reinen funktionalen Sprachen, die ich kenne, und es gibt darin geschriebene Anwendungen. Obwohl es in der Community der funktionalen Programmierer ein großes Gewicht hat, ist es in der Community der größeren Programmierer nicht beliebt. Nachdem ich es benutzt hatte, fand ich es auch nicht praktisch für die Praxis, und es scheint für theoretische Arbeiten geschätzt zu werden. Es erlaubt einen punktfreien Stil, so dass Sie einige der Ziele von Backus damit erreichen können.
Clojure, Scala und F # sind weniger reine, aber praktischere und beliebtere Funktionssprachen. F # ist auch freundlich zum punktfreien Stil.
Forth mag das prototypische Beispiel einer punktfreien Sprache sein, und es war zu ihrer Zeit ziemlich verbreitet, obwohl jetzt ... Factor ist eine weitere punktfreie Sprache, die einige Aufmerksamkeit erlangt hat, aber ich bezweifle, dass sie zu Forths Popularität in seiner Blütezeit passte .
APL wurde von Backus an einer Stelle (vielleicht nicht in seiner Arbeit) als ein Schritt in Richtung seiner Ziele erwähnt, der jedoch nicht vollständig mit diesen vereinbar war. Zu seiner Zeit war es im Finanzsektor groß. Schauen Sie sich unbedingt seine Nachkommen an, wie z. B. J.
JavaScript ist nicht funktionsfähig, aber es ist ziemlich freundlich gegenüber einem Programmierstil höherer Ordnung, was durch die häufige Verwendung von Closures belegt wird. Aufgrund seiner Beliebtheit erfüllt es möglicherweise nur die Kriterien. Schauen Sie sich unbedingt einige interessante Dinge an, die mit JavaScript gemacht wurden, wie das Einrichten von Currys und die Implementierung von Combinatoren.
Um Ihnen einen besseren Überblick über seine Ziele zu verschaffen, können Sie sich die beiden Sprachen ansehen, die er entworfen hat, um seine Kriterien zu erfüllen. Sie sind überhaupt nicht beliebt AFAIK, also wäre dies nur aus Wissensgründen:
http://en.wikipedia.org/wiki/FP_(programming_language )
http://en.wikipedia.org/wiki/FL_(programming_language )
quelle
Ich denke, Linda und Tuplespace-Programmierung könnten genau das Richtige sein. Assoziativ- / Mustervergleichs-Speicheroperationen bei gleichzeitiger Verwendung bedeuten, dass (konzeptionell) der Von-Neuman-Engpass beseitigt ist.
In dieser Richtung modellieren reine Actor-Modell-Sprachen auch die Kommunikation und nicht die Anweisungssequenzierung. Und obwohl es sich um Formalismen und nicht um tatsächliche Programmiersprachen handelt, modellieren Prozesskalküle wie Pi-Kalkül, CSP und Petri-Netze die Kommunikation auf verwandte Weise.
Unter Wikipedia finden Sie Links (ich bin ein neuer Benutzer und unter Spam-Schutz), aber für ein wenig schlauen Humor in Bezug auf Lindas Namen lesen Sie http://c2.com/cgi/wiki?LindaEtymology .
quelle