Eine der Haupteigenschaften der funktionalen Programmierung ist die Verwendung von Nebenfunktionen. Dies kann jedoch auch in einer imperativen Sprache erfolgen. Dasselbe gilt für Rekursions- und Lambda-Funktionen (zum Beispiel C ++ 0x). Daher frage ich mich, ob imperative Programmiersprachen eine Obermenge von funktionalen Sprachen sind.
Im Allgemeinen, nein; Funktionale Programmierung ist eine Teilmenge der deklarativen Programmierung (die logische Programmiersprachen wie Prolog enthält). Viele imperative Sprachen entlehnen Elemente funktionaler Programmiersprachen, aber einfach lambdas oder referentiell transparente Funktionen zu haben, macht eine imperative Sprache nicht funktional; funktionale Programmierung ist mehr als nur diese Elemente.
Ich kann nicht wirklich sagen, ob sie Teilmenge voneinander sind. Was ich jedoch sagen kann, dass (außer für wirklich esoterische Sprachen) alle Turing-vollständig sind, was bedeutet, dass in Am Ende sind sie alle gleich mächtig, aber nicht unbedingt gleich ausdrucksvoll.
Ein Paradigma ist ein Weg, Dinge zu tun, und es gibt zwei Hauptparadigmen für die Programmierung: imperativ und deklarativ. Die Tatsache, dass einige Sprachen erlauben, beide Paradigmen zu mischen, bedeutet nicht, dass die eine in der anderen enthalten ist, sondern dass die Sprachen Multiparadigma sind.
Um es ein wenig mehr zu verdeutlichen, lassen Sie mich mit Ihrer Analogie fortfahren: Wenn Lisp und OCaml (zum Beispiel) als funktionale Sprachen betrachtet werden und beide einen imperativen Stil zulassen, dann sollte Imperativ als eine Untermenge von Funktional betrachtet werden ?
Es ist möglich, ein bestimmtes Programmierparadigma in einer Sprache zu implementieren, die das Programmierparadigma nicht nativ unterstützt. Zum Beispiel ist es möglich, objektorientierten Code in C zu schreiben, während er nicht für diesen Zweck entworfen ist.
Funktionale Programmierung ist ein gut entwickeltes Programmierparadigma und wird am besten durch Sprachen wie Haskell, LISP usw. gelernt. Und nachdem Sie sie gut gelernt haben, obwohl Sie diese Sprachen nicht regelmäßig verwenden, können Sie anfangen, diese zu benutzen Prinzipien in der täglichen Sprache, die Sie regelmäßig verwenden.
Einige Leute mögen Google für Objektorientierte Programmierung in C
Die meisten imperativen Sprachen haben keine Funktionen als Typ erster Ordnung, während die meisten funktional sind o. (Wie auch C ++, über boost :: function.)
Bei dem Typ erster Ordnung kann dieser meas ein Wert / eine Variable beliebigen Typs sein, ein int, ein bool, eine Funktion von int- & gt; bool. Es enthält normalerweise auch Closures oder gebundene Werte, wo Sie die gleiche Funktion haben, aber einige Argumente sind bereits ausgefüllt.
Bei beiden geht es hauptsächlich um funktionale Programmierung, IMHO.
Ich denke, es könnte hilfreich sein, zwischen Paradigma und Sprache zu unterscheiden.
Für mich repräsentieren Paradigmen "Denkweisen" (Konzepte und Abstraktionen wie Funktionen, Objekte, Rekursion), während Sprachen anbieten "Wege zu tun" (Syntax, Variablen, Auswertungen).
Alle wahren Programmiersprachen sind äquivalent in dem Sinne, dass sie Turing-vollständig sind und theoretisch jede Turing-berechenbare Funktion berechnen oder simulieren können durch eine universelle Turingmaschine simuliert werden.
Interessant ist, wie schwierig es ist, bestimmte Aufgaben in bestimmten Sprachen oder Paradigmen zu erledigen, wie geeignet das Werkzeug für die Aufgabe ist. Sogar Conways Spiel des Lebens ist Turing-vollständig, aber das lässt mich nicht damit programmieren.
Viele Sprachen unterstützen eine Reihe von Paradigmen. C ++ wurde als eine objektorientierte Erweiterung für C entworfen, aber es ist möglich, rein prozeduralen Code darin zu schreiben.
Einige Sprachen leihen / erwerben Features aus anderen Sprachen oder Paradigmen im Laufe der Zeit (schauen Sie sich einfach die Entwicklung von Java an).
Einige Sprachen, wie Common Lisp, sind beeindruckend multiparadigmatische Sprachen. Es ist möglich, in Lisp Code zu schreiben, der funktional, objektorientiert oder prozedural ist. Wohl ist die Aspektorientierung bereits Teil des gemeinsamen Lisp-Objekt-Systems und daher "nichts Besonderes". In Lisp ist es einfach, die Sprache selbst zu erweitern, um alles zu tun, was Sie tun müssen. Daher wird sie manchmal als "programmierbare Programmiersprache" bezeichnet. (Ich werde hier darauf hinweisen, dass Lisp eine Familie von Sprachen beschreibt, von denen Common Lisp nur ein Dialekt ist).
Ich denke, es spielt keine Rolle, welcher der Begriffe, deklarativ, imperativ, funktional oder prozedural, eine Teilmenge davon ist. Was mehr zählt, ist, die Sprachen der Werkzeuge zu verstehen, mit denen Sie arbeiten und wie diese sich von anderen Werkzeugen unterscheiden. Noch wichtiger ist es, die verschiedenen Denkweisen zu verstehen, die die Paradigmen repräsentieren, da dies Ihre Denkwerkzeuge sind. Wie bei den meisten anderen Dingen im Leben, je mehr du verstehst, desto effektiver wirst du.
Eine Möglichkeit, es zu betrachten (nicht zu sagen, dass es der richtige Weg ist, weil ich kein Lang-Designer oder Theoretiker bin) ist, dass wenn die Sprache im Wesentlichen zu etwas anderem konvertiert wird dass "etwas anderes" die Obermenge der Quelle sein muss. Also Bytecode ist notwendigerweise eine Obermenge von Java. .NET IL ist eine Obermenge von C # und F #. Die funktionalen Konstrukte in C # (d. H. LINQ) sind somit eine Teilmenge der imperativen Konstrukte von IL.
Da Maschinensprache zwingend erforderlich ist, könnten Sie die Position einnehmen, dass daher alle Sprachen zwingend notwendig sind, weil sie nur für Menschen nützliche Abstraktionen sind, die dann vom Compiler zu prozeduralem, imperativem Maschinencode verdrängt werden.
Tags und Links programming-languages functional-programming imperative-programming