Was ist eine praktische Nicht-von-Neumann-Architektur?

16

Gibt es praktische Anwendungen für Nicht-von-Neumann-Programmiermodelle? Was sind die am weitesten verbreiteten Nicht-von-Neumann-Programmiersprachen?

Len Yabloko
quelle
6
Was ist ein Programmiermodell, das nicht von Neumann stammt?
Suresh Venkat
Ich verstehe die Frage auch nicht. Vielleicht können Sie der Frage einen Hintergrund hinzufügen, damit Sie besser verstehen, was Sie fragen.
Kaveh
3
von neumann architecture hat eine CPU. daher ist eine Parallelverarbeitungsarchitektur wohl nicht von Neumann (Neumann-Architektur wurde vor der Parallelverarbeitung erfunden). aber einverstanden scheint die Frage mehrdeutig oder verschwommen definiert. von neumann bezieht sich auf eine computerarchitektur, nicht wirklich genau ein programmiermodell. das Programmiermodell und CPU / Computer - Architektur existiert in einer Art von Synergie / Symbiose, sondern auch etwas unabhängig voneinander .... verschiedener Architekturen können unterschiedliche Programmiermodelle ohne das Programmiermodell implementieren ist „gekoppelt“ , um die Architektur ...
vzn
1
Was ist eine nicht-von - Neumann - Programmierung Sprache ? Was ist eigentlich eine von Neumann-Programmiersprache? (Ich finde Backus 'Definition nicht - im Wesentlichen "imperative Sprachen" - auch nur ein kleines bisschen zwingend.)
Jeffs
1
@Ronny: Die Wikipedia-Seite zeigt nur den Artikel von Backus.
Jeffs

Antworten:

12

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?

David Cary
quelle
11

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:

  1. 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.

  2. Clojure, Scala und F # sind weniger reine, aber praktischere und beliebtere Funktionssprachen. F # ist auch freundlich zum punktfreien Stil.

  3. 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 .

  4. 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.

  5. 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 )

Ronny
quelle
1
Es scheint nun so, als ob er eher eine punktfreie als eine funktionale Programmierung meinte - gibt es einen Hinweis auf eine Diskussion darüber? klingt interessant.
Suresh Venkat
Das Programmiermodell von Backus heißt "Function-Level Programming" und es gibt einen Artikel hier: en.wikipedia.org/wiki/Function-level_programming . Ich kenne keine wirklich guten Links (ich würde gerne wissen, ob Sie welche finden!), Aber Googeln auf Funktionsebene bringt einige interessante Links hervor, einschließlich eines Videos.
Ronny
1
@SureshVenkat: Die Sprachen FP und FL wurden von Backus speziell entwickelt, um seine Idee der Programmierung auf Funktionsebene zu unterstützen. Siehe auch "Stillschweigende Programmierung" und genauer gesagt die J-Sprache , die APL und FP / FL kombiniert, um die möglicherweise kryptischste und aussagekräftigste Allzwecksprache für den tatsächlichen Gebrauch zu erstellen. Ich erinnere mich auch an einen Artikel über die Verwendung von impliziter Programmierung in funktionalen Sprachen auf SO .
CA McCann
Übrigens scheint die Chronologie in diesem Beitrag deutlich abzulehnen. Funktionale Programmierung (sowohl in der Lisp- als auch in der ML-Tradition) geht Backus 'Vortrag über den Turing-Preis wie die meisten oder alle bestehenden Programmierparadigmen voraus - einschließlich der Programmierung auf Funktionsebene in Form der kombinatorischen Logik , die sowohl der Lambda-Rechnung der Kirche als auch der von Turing vorausgeht Arbeite an der Theorie der Berechnung! (Oh, und ich würde Haskell viel lieber für praktische Zwecke als eine Gräueltat wie Javascript verwenden.)
CA McCann
@camccann Ich habe noch nie eine Chronologie in der Post gesetzt. Lisp ist auch zu breit, um Ansprüche zu stützen. Zum Beispiel sind nicht alle Lisps funktionsfähig, da nicht alle rekursiv sind. Ich mag Ihren Hinweis auf Combinatory Logic, aber ich denke, Backus meinte eine Sprache, mit der man einen Computer programmieren kann, der das Paradigma unterstützt. Während Combinatory Logic seine Argumentation beleuchtet, hat dies letztendlich keinen Einfluss auf seinen Standpunkt.
Ronny
2

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 .

Jim Meier
quelle