Frage

Es ist das neue Paradigma der „funktionalen Programmierung“, die eine totale Veränderung der Denkmuster im Vergleich zu prozeduralen Programmierung benötigt. Es nutzt Funktionen höherer Ordnung, Reinheit, Monaden, etc., die wir normalerweise nicht in imperativen sehen und orientierten Sprachen widersprechen.

Meine Frage ist, wie die Implementierung diese Sprachen aus Imperativ oder objektorientierten Sprachen unterscheidet, in Bezug auf zum Beispiel Speicherverwaltung oder Einbauten wie Zeiger etc ..

Es gibt funktionale Sprachen, die auf der JVM ausgeführt werden. Bedeutet dies, dass diese Sprachen intern arbeiten wie die anderen Sprachen auf der JVM?

War es hilfreich?

Lösung

Implementations funktionaler Programmiersprachen verwenden eine Vielzahl von Implementierungstechniken. Eine ausgezeichnete Einführung in die Implementierung von Scheme (ein Lisp-Dialekt) gibt dieses Buch: Lisp in kleinen Stücken von Christian Queinnec.

Andere Tipps

-Code von funktionalen Sprachen resultierenden verwendet viele Funktionen, die Sie in unterschiedlichem Maße in nicht-funktionalen Sprachen zu sehen. Die Garbage-Collection hat sich in den allgemeinen Sprachgebrauch übergeben. Tail-Call-Optimierung ist in GCC und VC ++ getan .

Verschlüsse, jedoch sind ein Markenzeichen der funktionalen Programmierung. Sie sehen nicht ohne das andere. Wenn Sie „funktionalen Sprachen“ definieren sich nur auf rein funktionale Sprachen zu beziehen, die beiden sind nicht synonym sind, wie Sie Verschlüsse in imperativen Sprachen finden, die funktionale Programmierung unterstützen (zB Javascript und Schema (die technisch zwingend notwendig ist, wenn die funktionale Paradigma ist, was meistens ist benutzt)). Verschlüsse können mit einem Spaghetti für den Call-Stack stapeln implementiert werden, oder durch lokale Variablen zu kopieren, wenn Verlassen einen Stapelrahmen oder durch lokale Variablen auf dem Heap Aufteilung und Garbage collection kümmern sich um sie im Stich gelassen.

Wenn Sie Verschlüsse haben, sind anonyme Funktionen relativ einfach (mit einem Dolmetscher, sie sind wirklich einfach). Mit einem Compiler, wird die Funktion zum Bytecode bei der Kompilierung umgewandelt und die Bytecode (besser gesagt, die Adresse des Eintrittspunktes) werden zur Laufzeit mit der aktuellen Umgebung verbunden ist.

Funktions Zusammensetzung kann auf anonyme Funktion verlassen. Wenn ein Compiler eine Funktion Zusammensetzung Operator f . g trifft, erzeugt es eine anonyme Funktion, die zwei Argumente f und g nennt, zum anderen das Ergebnis einer als Argument übergeben.

Monaden kann in OO-Sprachen implementiert werden, sie sind nur nicht so notwendig, wie sie in der reinen funktionalen Sprachen sind. I / O Monaden ist nichts Besonderes, sie auf der Tatsache, nur verlassen, dass er zugrunde liegende Plattform Nebenwirkungen ermöglicht.

Ich denke, es gibt viele Aspekte, die in funktionalen Sprachen von besonderer Aufmerksamkeit profitieren, eine, die in den Sinn kommt, ist:

Funktionale Sprachen verwenden Rekursion viel. So sollte jede Implementierung versuchen, diesen Fall zu optimieren. Z.B. identifizieren Schwanz-Rekursion und verwandeln sich in eine Schleife intern (also Funktionsaufruf Gemeinkosten wie Stapel Speichern Speichern / Wiederherstellen). ( http://en.wikipedia.org/wiki/Tail_recursion )

Die Implementierung einer funktionalen Programmiersprache wie Haskell sind oft ganz anders als jene der imperativen Sprachen. Sie können es über einen Weg zu tun, hier . Auch wenn das Papier einige Jahre alt ist glaube ich die Ideen noch verwendet werden.

Der größte Unterschied in dem Sinne kommt, ist, dass funktionale Sprachen sind in der Regel so ausgelegt sein, dass der Quellcode zu auf eine mathematisch einfache und leistungsfähige Zwischensprache. Diese Sprache enthält in der Regel Lambda, Funktionsaufrufe, wenn / else, Maschinentypen, so etwas wie let, und nicht eine ganze Menge mehr. Der umgewandelte Code wird tief verschachtelt, ausführlich, und nicht realistisch in lesbarer Form. Die Oberfläche Syntax wird weggeworfen.

Ein Compiler für eine Sprache wie diese hat einige inlining und eine paar Schließung Optimierungen zu tun anständigen Code zu produzieren. (Für mich diese Baseline Schließung Optimierungen scheinen nicht trivial - Analyse zu entkommen und so weiter -. Aber es könnte nur mangelnde Vertrautheit sein)

Alles läuft auf dem gleichen Prozessor (und damit die gleiche Montageanleitung), so lange, wie Sie tief genug gehen, alles intern das gleiche ist.

@outis: Während die Sprache sie unterstützen kann, Schließungen Konflikt mit dem mathematischen Begriff einer Funktion in der gleichen Art und Weise, dass Nebenwirkungen zu tun: sie ermöglichen es Ihnen unterschiedliche Ergebnisse aus den gleichen Argumenten zu erhalten. Das macht Schließungen Verfahren, anstatt funktional.

Das heißt, es gibt Effizienz Argumente, die Verschlüsse über Globals (vor allem im Zusammenhang mit der Compiler-Implementierung) begünstigen. [Aber ich weiß von funktionalen Sprachen, die Verschlüsse liefern nicht direkt, auch wenn „Arbeit Doppelgänger“ umgesetzt werden kann.]

(jedoch currying ähneln Schließungen und leidet nicht unter diesem Konflikt, und ist in der Tat routinemäßig in funktionalen Sprachen.)

Wie auch immer, meiner Meinung nach, funktionalen Programmiersprachen sind Sprachen, die großen Anstrengungen unternehmen, um die Berechnung darstellbar zu machen, als ob sie mathematische Funktionen waren. Dies bedeutet, dass Optimierungen bei der Optimierung Funktionen geneigt ist.

Hypothetisch, zumindest, funktionale Sprachen erlauben der Maschine auf tieferen Abstraktionen zu arbeiten, als für einen rein verfahrens Ansatz sinnvoll wäre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top