7 Stimmen

Was ist der Unterschied zwischen dynamischen und funktionalen Sprachen?

Ich finde oft, dass Entwickler die Begriffe funktionale Sprache und dynamische Sprache zusammen verwenden und frage mich, warum sie immer zusammen verwendet werden. Was sind die Unterschiede zwischen ihnen? Kann eine Sprache gleichzeitig dynamisch und funktional sein? Ergänzen sie sich? Warum brauchen wir sie überhaupt? Ich bin ein C#-Programmierer und verstehe dieses ganze Dynamik-/Funktionsding noch nicht ganz (C# wird in Version 4 einige dynamische Funktionen haben. Wird es auch funktional sein? Was ist hier los?).

Danke, Abraham

0 Stimmen

Antwortete auf Kommentar. - finde die kostenlose Version von Practical Common Lisp im Web und schau dir das Beispiel an, in dem der Autor eine Datenbank von MP3-Titeln mit 'nur Funktionen' erstellt. Ein kleines Beispiel, aber vermittelt die Möglichkeiten recht gut.

8voto

xtofl Punkte 39285

Die dynamische Typisierung, ein Typsystem, ist orthogonal zu 'funktional', einem Programmierparadigma.

Dynamische 'Sprachen' sind tatsächlich dynamisch typisiert. Das bedeutet, dass Sie keine Überprüfung der Variablentypen zur Kompilierzeit haben.

Funktionale Sprachen bieten eine Menge Unterstützung z.B. für die Lambda-Kalkül - anonyme Funktionen.

Ein Beispiel für eine Sprache, die dynamische Typisierung hat und anonyme Funktionen unterstützt: JavaScript. Auch Ruby bietet einige funktionale Unterstützung. Und es gibt noch andere.

0 Stimmen

Nicht alle dynamischen Sprachen sind zwangsläufig dynamisch typisiert. Verwechsele nicht den Wortschatz.

1 Stimmen

@jitter: Es kommt darauf an, was Sie wirklich mit "dynamische Sprache" meinen. Ich denke, es ist ein etwas mehrdeutiger Begriff.

0 Stimmen

@Nikhil: Fühlen Sie sich frei, jede funktionale Sprache hinzuzufügen, die Sie kennen :) Persönlich habe ich bisher wenig Erfahrung mit Lisp.

8voto

Gishu Punkte 130442

Um es in einer einfachen (aber nicht genauen) Antwort zu verdeutlichen

  • Dynamische Sprachen sind solche, in denen der Typ (Name der Klasse) nicht so wichtig ist im Vergleich zu ihrem Gegner, den statisch typisierten Sprachen. Einer Variablen können beliebige Objekte verschiedener Typen jederzeit zugewiesen werden. Methodenaufrufe werden zur Laufzeit aufgelöst. Dies bedeutet, dass man die Vorteile der statischen Typisierung verliert (Compilerwarnungen), dafür aber einfache Methoden generisch werden - sort(list) funktioniert sowohl für eine Liste von Strings als auch für eine Liste von Ganzzahlen. z. B. Ruby et. al.
  • Funktionale Sprachen legen Wert auf Unveränderlichkeit. Programme werden in immer größeren Funktionen geschrieben (normalerweise von unten nach oben). Der Begriff des Objektzustands und der Veränderlichkeit wird missbilligt. Eine Funktion in diesem Kontext ist selbstsufficient (Der Begriff ist pure laut Wikipedia): alles, was sie zum Ausgeben benötigt, liegt in der Eingabe, die sie erhält. Sie erzeugt auch keine Seiteneffekte (es sei denn, sie werden explizit erwähnt) und liefert konsistente Ausgaben für eine gegebene Eingabe. Dies kann zu elegantem Code führen (siehe: Fluent Interfaces), bei dem Eingabedaten durch verschiedene Funktionen geleitet werden, um die endgültige Ausgabe zu erzeugen, z. B. LISP et al.

Allerdings verschwimmen die Grenzen mit Sprachen, die das Beste aus allen Welten aufgreifen... Sie könnten eine Sprache haben, die sowohl das eine als auch das andere ist, oder keines von beiden.
z.B. überwiegend statisches C#, das in 3.0 lambda-Ausdrücke übernimmt und mit 4.0 dynamische Fähigkeiten einführt

0 Stimmen

Wenn funktionale Sprachen aus Funktionen bestehen, sind sie dann nicht ein Rückschritt zu den Tagen der prozeduralen Sprachen? Wie können groß angelegte Anwendungen nur aus Funktionen erstellt werden?

1 Stimmen

Ein GROßES Problem mit prozeduralen Sprachen war der globale Zustand und dass jeder über jeden hinwegtrampelt, 'Funktionen' in funktionalen Sprachen sind "Rein", da sie keinen Zugriff auf einen Zustand/Daten haben, außer ihren Eingaben. Wikip macht einen guten Job mit dem Abschnitt über 'Reine Funktionen'. Aber guter Punkt... Ich werde meinen Beitrag klären.

0 Stimmen

Funktionalen Sprachen könnten als das Gegenteil von prozeduralen Sprachen betrachtet werden. Die meisten beliebten Sprachen heutzutage sind im Wesentlichen prozedural mit einigen OO-Funktionen. Funktionale Sprachen sind etwas ganz anderes, mehr wie Mathematik und weniger wie Maschinenanweisungen.

4voto

John Smith Punkte 4285

Das dynamische Typisieren und funktionale Programmieren sind unabhängige Konzepte. Sie können entweder, weder oder beides in einer Sprache haben.

Statische Typisierung bedeutet, dass die Typen von Objekten zur Kompilierungszeit bekannt sind. Bei dynamischer Typisierung sind sie zur Laufzeit bekannt.

Funktionales Programmieren bedeutet Programmierstil, bei dem Berechnungen durch Auswerten von Funktionen durchgeführt werden, wobei Zustandsänderungen vermieden werden. (Beispiel: Sie verwenden Rekursion anstelle von for-Schleifen, weil eine Schleife eine Änderung einer Zählervariable erfordern würde usw.) Dies hilft, Fehler zu vermeiden und das parallele Programmieren zu erleichtern. Reine Sprachen erfordern, dass Sie im funktionalen Stil programmieren, andere ermöglichen es nur.

Beispiel-Sprachen:

|----------------+---------+---------|
|                | Dynamisch | Statisch |
|----------------+---------+---------|
| Funktional     | LISP    | Haskell |
| Nicht funktional | PHP     | Java    |
|----------------+---------+---------|

Dynamische Sprachen sind hingegen ein breiteres Konzept. Es gibt keine genaue Definition, aber in der Regel je mehr Funktionen des Compilers zur Laufzeit verschoben werden, desto dynamischer ist die Sprache. Das bedeutet, dass in dynamischen Sprachen in der Regel Ausdrücke ausgewertet, die Objektstruktur geändert usw. werden können zur Laufzeit.

3voto

Pete Kirkham Punkte 47746

Wenn Sie sich für Paradigmen interessieren, behandelt das Papier Programmierparadigmen für Dummies: Was jeder Programmierer wissen sollte sie.

In der funktionalen Programmierung ist der Zustand implizit - das Programm wird ausgeführt, indem Funktionen aufgerufen werden, die andere Funktionen aufrufen. In der imperativen Programmierung und der objektorientierten Programmierung ist der Zustand explizit - Sie ändern den Wert einer Variablen oder eines Objektfelds.

Functional und imperative Systeme können in gewisser Weise als Duale betrachtet werden - was in einem fest ist, ist in einem anderen ein dynamischer Wert.

Closures - die einige explizite, veränderbare Zustände in einem Objekt einfangen, das als Funktion aufgerufen werden kann - liegen irgendwo dazwischen, sind weder reine funktionale Programmierung noch ganz ausgereifte Objekte; sie ähneln eher anonymen Objekten als Funktionen.

'Dynamische Sprachen' ist ein vager Begriff, der in der Regel eine der folgenden Bedeutungen hat:

  • Dynamisch typisierte Sprachen - Sprachen, bei denen die Bestimmung des Typs zur Laufzeit verzögert wird, wobei jedoch die Menge der Typen festgelegt ist. Beispiele sind Smalltalk, Lisps und aktuelle Fortress-Implementierungen. Einige ansonsten statisch typisierte Sprachen erlauben auch einige dynamische Typüberprüfungen - Java, C#, C++ und Ada. (Es war ein fehlgeschlagener dynamischer Typumwandlung von float zu int in Ada, der die Ariane 5 zum Absturz brachte)

  • Sprachen mit dynamischen Typen - Sprachen, in denen neue Typen zur Laufzeit erstellt werden können. Die bekannteste ist JavaScript. Da das Programm ausgeführt werden muss, um die Typen zu bestimmen, ist es schwieriger, für diese Typ-erkannte Vervollständigung zu erstellen.

  • Sprachen, die dynamisch kompiliert werden - Sprachen, in denen neue Skripte zur Laufzeit kompiliert werden können. Dies trifft auf Bash, JSP, PHP und ASP auf Seitenbasis zu und in feinerer Skala für Lisps und JavaScript, die eine 'eval'-Funktion unterstützen, die einen Ausdruck kompiliert und ausführt.

Funktionale Sprachen, die stark typisiert sind, führen oft eine große Menge an Typanalyse durch, sodass es in ihren Programmen üblich ist, weniger explizite Typanweisungen zu haben als in schlecht implementierten statisch typisierten Sprachen. Dies kann Menschen verunsichern, die nur die fehlende explizite Typanweisung in dynamisch typisierten Sprachen gesehen haben und glauben, dass Typanalyse dasselbe wie dynamische Typanalyse ist.

2voto

Jon Skeet Punkte 1325502

Xtofl hat bereits ein gutes Gesamtbild angeboten. Ich kann zum C#-Punkt sprechen.

C# wird seit einiger Zeit auf funktionale Weise einfacher zu handhaben:

  • C# 2 führte anonyme Methoden ein, die es erleichterten, Delegaten zu erstellen, die Zustand verwendeten, der ansonsten lokal für eine Methode war
  • C# 3 führte Lambda-Ausdrücke ein, die weitgehend anonymen Methoden ähneln, aber noch kompakter sind
  • Die LINQ-Unterstützung sowohl in C# 3 als auch in .NET 3.5 vereinfachte es, Daten auf funktionale Weise abzufragen, Prädikate, Projektionen usw. miteinander zu verketten
  • Meiner Meinung nach trägt kein Feature von C# 4 direkt zur funktionalen Programmierung bei, obwohl benannte Argumente und optionale Parameter es möglicherweise erleichtern, unveränderliche Typen zu erstellen/verwenden, was meiner Meinung nach eines der wichtigsten fehlenden Features im funktionalen Bild ist.

(Funktionale Sprachen haben oft andere Funktionen wie Musterabgleich und beeindruckendere Typinferenz, aber in C# können Sie relativ einfach viele funktionale Code schreiben.)

C# 4 wird einige dynamische Fähigkeiten durch den dynamic-Typ erlangen (der selbst effektiv ein statischer Typ ist, mit dem Sie alles machen können). Dies wird etwas "opt in" sein - wenn Sie den dynamic-Typ nie verwenden, bleibt C# weiterhin eine vollständig statische Sprache. Es gibt keine sprachliche Unterstützung für dynamische Reaktionen, aber der DLR hat dafür Unterstützung - wenn Sie z. B. IDynamicMetaObjectProvider implementieren oder von DynamicObject abgeleitet sind, können Sie dynamisches Verhalten hinzufügen.

Ich würde sagen, dass C# nicht zu einer funktionalen Sprache oder einer dynamischen Sprache wird, sondern zu einer, in der Sie in einem funktionalen Stil coden und mit dynamischen Plattformen interoperieren können.

0 Stimmen

Nun, es hört sich irgendwie so an, als ob der dynamische Teil der Sprache die Sorge des Compilers oder seiner Ausführungsumgebung ist, während der funktionale Teil die Sorge des Entwicklers ist, da er auf eine bestimmte Art und Weise, eine funktionale Art, programmieren muss (obwohl nicht ganz, da es mir so aussieht, als ob eine dynamische Sprache es ermöglicht, auf generische Art und Weise zu programmieren, was auch ein Paradigma ist, denke ich). Übrigens klingt es ein wenig lustig, eine Sprache eine 'Funktionale' Sprache zu nennen. Ist eine Sprache, die nicht funktional ist, keine gute Sprache, also nicht 'funktional'? Nicht pragmatisch :)

0 Stimmen

Ich denke, Entwickler verstehen, dass "funktional" ein überladener Begriff ist :) Ich denke heute könnte es als "funktionsorientiert" bezeichnet werden - bäh!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X