Funktionale Programmierung mit Haskell
-
ähm ... daß java neuerdings von LISP abstammt, ist aber jetzt nicht die gängige Lehrmeinung, oder ?
Ich empfehle da mal, einen Blick auf Smalltalk und dessen VM zu werfen, dann zu vergegenwärtigen, daß Smalltalk in den 70er Jahren entwickelt wurde, und schließlich die Sache mit LISP und java noch mal zu überdenken ... (v)
-
u_ser-l schrieb:
ähm ... daß java neuerdings von LISP abstammt, ist aber jetzt nicht die gängige Lehrmeinung, oder ?
Die Leute die Java entworfen haben, stammen eben aus dem Lisp-Umfeld. James Gosling hat zB einen Emacs geschrieben, Guy Steele hat Scheme erfunden und den Common Lisp Standard initiiert etc.
Da Lisp einfach die erste dynamische Programmiersprache war, kann man Lisp schon als Mutter aller dynamischer Programmiersprachen ansehen. Die meisten früheren "Computer Scientists" sind deshalb auch mit Lisp in Verbindung gekommen. Und viele Techniken wurden ja in den Lispmaschinen entworfen bzw. erforscht.
-
Der Aussage, daß LISP in gewissem Sinne die "Mutter aller dynamischen Sprachen" ist, weil es die erste solche war, kann ich zustimmen.
Dann wäre Assembler im Großen und Ganzen (von Plankalkül, Konsolenschaltern und einigen anderen Ausnahmen mal abgesehen) die "Mutter aller Programmiersprachen", weil es die erste war. Bin mir nicht sicher, ob diese Feststellung einen hohen Erkenntniswert hat
Aber wir sind uns sicher einig, daß die Ähnlichkeiten von java mit Smalltalk und mit C++ die mit LISP überwiegen.
-
Kann man die Frage nach der "Mutter der Sprachen" vielleicht mit diesem PDF zusammenfassen?
-
ja
-
schönes Diagramm. Ein Pfeil von Fortran nach Basic wäre vielleicht nicht verkehrt.
-
Das ist nur die direkte Abstammung. Was ist aber mit dem ganzen Erbgut, das so mal hier mal da verstreut wurde?
Dann wäre Assembler im Großen und Ganzen ...
Nein, Sprache bedeutet Grammatik (am besten keine triviale). Ausserdem: Was haengt ihr euch so an dem Begriff Mutter auf? Normalerweise gibt es da auch noch einen Vater ...
Funktionale Programmierung wird auch heute schon direkt in Firmen eingesetzt.
Schon heute? Hallo, ich glaube bei dir sind die entscheidenen Entwicklungen des Informationszeitalters unbemerkt vorbeigerauscht. Siehe google und amazon.
-
knivil schrieb:
Nein, Sprache bedeutet Grammatik (am besten keine triviale).
Also die Assembler haben ja eine Grammatik. Und mit den meist vorhandenen Makro-Funktionen ist die nun auch nicht gerade als trivial zu bezeichnen. Und die Syntax für die Indizierung ist nun auch nicht unbedingt vom Himmel gefallen. Bloß weil sich die Sprachkonstrukte keine hohe Abstraktion erlauben, sondern meist 1:1 auf Maschinenbefehle abbilden, so unterliegen sie ja doch schon einer Grammatik.
-
Nein, Sprache bedeutet Grammatik (am besten keine triviale).
Die Grammatik einer Sprache ist nicht gleichzusetzen mit einer Sprache, sie ist ein Bestandteil derselben.
Ausserdem: Was haengt ihr euch so an dem Begriff Mutter auf? Normalerweise gibt es da auch noch einen Vater ...
Na sieh mal, daran kannst du doch schon erkennen, dass es nicht um den Begriff als solchen geht, sondern vielmehr um das wofür er sinnbildlich steht.
Ich denke auch nicht, dass man diese Rolle einer einzelnen Sprache zuordnen kann.
bei dir sind die entscheidenen Entwicklungen des Informationszeitalters unbemerkt vorbeigerauscht. Siehe google und amazon.
Könntest du ganz kurz andeuten, was du genau damit meinst? Oder war das einfach nur so dahergeplappert?
-
Nein, das ist nicht nur so dahergesagt. Lisp wurde als eine Grundlagentechnologie (neben anderen z.B. C) bei amazon massiv eingesetzt. Auch googles Suchdienst nutzt funktionale Anseatze. Deswegen hatte es Microsoft nie geschafft, ernsthafter Konkurrent im Bereich Suchmaschinen zu werden, da sie die Moeglichkeiten der Funktionalen Programmierung im Bereich der parallelen Datenverarbeitung nicht erkannten.
-
Was kann man denn mit funktionaler Prog.rung machen, das man mit blockstrukturierter oder OO-Programmierung nicht auch machen kann? Das sind nur verschiedene Notationen für dieselbe Menge berechenbarer Funktionen, nämlich Turing-berechenbare Funktionen.
-
Lisp wurde als eine Grundlagentechnologie (neben anderen z.B. C) bei
amazon massiv eingesetzt.Nun beinhaltet Lisp funktionale Elemente, so wie auch Java, C# und VB.net.
Das allein reicht mir aber noch nicht aus um von funktionale Programmierung zu
sprechen.da sie [Microsoft] die Moeglichkeiten der Funktionalen Programmierung im
Bereich der parallelen Datenverarbeitung nicht erkannten.Das ist falsch. Microsoft forscht schon lange im Bereich funProg. Außerdem
beschäftigt Microsoft viele der führenden Köpfe die hinter der funProg. stehen.
Sicherlich hat Microsoft irgendwo nicht aufgepasst, mit funProg. hat dies aber
nichts zu tun.Um auf u_ser-l's Frage zu kommen. Dadurch das Haskell streng und statisch getypt
ist, sowie ein sehr mächtiges Typensystem besitzt ist es unmöglich einen
Typfehler zur Laufzeit zu bekommen. So gibt es z.B. keine NullpointerExceptions.
Das klingt vielleicht noch nicht so spektakulär, allerdings lassen sich die
meisten Fehler auf Typfehler zurückführen. (Und so philosophisch würde ich sogar
sagen, dass jeder Fehler irgendwo ein Typfehler ist, aber das ist etwas anderes :))Ein weiterer Vorteil ist die Beweisbarkeit von Programmen. Es ist in einem
funProg. möglich zu beweisen, dass es richtig ist. Dies führt z.B. dazu, dass man
das Testen seiner Software größtenteils automatisieren kann (siehe QuickCheck).Und zuletzt gibt es in einem funProg. keinen Kontrollfluss, was bedeutet, die
Reihenfolge in der dein Programm berechnet wird, legt der Compiler selber fest.
Diese Tatsache ermöglicht es, dein Programm automatisch auf mehreren Kernen
gleichzeitig berechnen zu lassen, was in imperativen Sprachen schlichtweg
unmöglich ist.
-
frosch03 schrieb:
Lisp wurde als eine Grundlagentechnologie (neben anderen z.B. C) bei
amazon massiv eingesetzt.Nun beinhaltet Lisp funktionale Elemente, so wie auch Java, C# und VB.net.
Das allein reicht mir aber noch nicht aus um von funktionale Programmierung zu
sprechen.Diese Aussage zeigt mir, dass du noch nie richtig mit Lisp programmiert hast.
edit: Vielleicht hab ich deine Aussage auch falsch aufgefasst. Es klang für mich, als würdest du Lisp mit Java, C# und VB.net in einen Topf werfen, was grundlegende Sprach-Features angeht. Und das stimmt einfach nicht: Lisp ist die "programmierbare Programmiersprache" schlechthin, da können die anderen genannten Sprachen nicht mithalten.
Lisp ist sicher nicht im reinen Sinne funktional, es gibt immerhin überall Seiteneffekte. Der Punkt ist aber, dass Funktionen in Lisp auch nur Werte sind ("first-class values"). Das gibt es z.B. in Java so nicht. Dadurch (und durch Lisp-Makros, die außer von Namen her nichts mit C-Makros zu tun haben) unterscheidet sich Lisp so deutlich von Java, C# und VB.net, dass es IMHO schwer ist, diese in einen Topf zu werfen, nur weil alle diese Sprachen Seiteneffekte an beliebiger Stelle unterstützen.
-
u_ser-l schrieb:
Was kann man denn mit funktionaler Prog.rung machen, das man mit blockstrukturierter oder OO-Programmierung nicht auch machen kann? Das sind nur verschiedene Notationen für dieselbe Menge berechenbarer Funktionen, nämlich Turing-berechenbare Funktionen.
Es geht nicht um das "Was", sondern um das "Wie". Und gerade was Parallelisierung und Stabilität angeht, da hat die funktionale Programmierung so einiges zu bieten, was bei den "klassischen" Programmiersprachen nur schwer zu bekommen ist.
-
Diese Aussage zeigt mir, dass du noch nie richtig mit Lisp programmiert hast.
Was heißt schon Lisp programmiert. Lisp stellt ja mehr eine Sprachfamilie dar.
Ich hab mich mehrere Jahre mit dylan [1] beschäftigt. Allerdings kann ich dir
auch kurz ziegen, was ich meine.(setf *x* 42.1)
Hier definier ich eine Variable und weise dieser einen Wert zu. Das Konzept einer
Variable existiert in der funktionalen Programmierung allerdings nicht. Daher
meine Aussage, dass Lisp funktionale Elemente enthält.[1] http://de.wikipedia.org/wiki/Dylan_(Programmiersprache)
--- edit ---
Ok, auf deinen Edit hin kann ich dir nur voll zustimmen
-
frosch03 schrieb:
Allerdings kann ich dir
auch kurz ziegen, was ich meine.(setf *x* 42.1)
Hier definier ich eine Variable und weise dieser einen Wert zu. Das Konzept einer
Variable existiert in der funktionalen Programmierung allerdings nicht. Daher
eine Aussage, dass Lisp funktionale Elemente enthält.Ich habe meinem Beitrag oben noch zwei Absätze hinzugefügt, wahrscheinlich gerade als du deine Antwort geschrieben hast.
Ich möchte nicht sagen, dass Lisp im reinen Sinne "funktional" ist; wobei die Definition, wo "funktional" beginnt und wo es aufhört, im Grunde etwas schwammig ist. Man könnte auch sagen, dass eine Sprache, die Funktionen als first-class objects hat, "funktional" ist. Und genau das ist eine Eigenschaft, die Lisp von Sprachen wie Java, C# und VB.net unterscheidet.
edit: Ich hätte meinen Beitrag nicht mehr so spät editieren sollen. Sorry für die Verwirrung.
-
frosch03 schrieb:
(setf *x* 42.1)
Hier definier ich eine Variable und weise dieser einen Wert zu. Das Konzept einer
Variable existiert in der funktionalen Programmierung allerdings nicht.In einer bestimmten Auffassung des Begriffes. Allgemeingültig ist das nicht, oder willst du SML den Status einer funktionalen Programmiersprache absprechen? Wenn "funktional" automatisch "streng ohne Zuweisung" heißen würde, bräuchte man den Begriff "rein-funktional" nicht.
-
frosch03 schrieb:
Dadurch das Haskell streng und statisch getypt
ist, sowie ein sehr mächtiges Typensystem besitzt ist es unmöglich einen
Typfehler zur Laufzeit zu bekommen.Die von Dir aufgezählten Argumente zu Gunsten von FP mögen alle richtig sein, nur hat FP den großen Nachteil, daß sie der menschlichen Intuition von "Algorithmus" zuwiderläuft, denn das natürliche algorithmische Denken des Menschen ist prozedural. Niemand schreibt von Natur aus seinen Einkaufszettel als funktionales Programm. Versteht man "Programmieren" als abstrakte, mathematische Tätigkeit, dann ist FP sicherlich ein überlegenes Konzept.
Dennoch kann man alles, was man mit FP programmieren kann, prinzipiell auch prozedural oder mit OOP programmieren, dafür sorgt die Church-Turing-Äquivalenz.
-
u_ser-l schrieb:
Niemand schreibt von Natur aus seinen Einkaufszettel als funktionales Programm.
Wie würde denn das aussehen?
Imperativ wäre das ja so:
1. A 2. B 3. C
-
u_ser-l schrieb:
Die von Dir aufgezählten Argumente zu Gunsten von FP mögen alle richtig sein, nur hat FP den großen Nachteil, daß sie der menschlichen Intuition von "Algorithmus" zuwiderläuft, denn das natürliche algorithmische Denken des Menschen ist prozedural.
Meinst du nicht, dass die vielen FP-Enthusiasten es als natürlicher empfinden, funktional zu programmieren? Oder sind das alles Masochisten? Oder keine Menschen?
Niemand schreibt von Natur aus seinen Einkaufszettel als funktionales Programm.
Ein Einkaufszettel ist aber auch nicht imperativ, da er keine feste Reihenfolge vorschreibt. Man ordnet das dynamisch um, idealerweise so, dass die Laufwege möglichst kurz sind. :p
Dennoch kann man alles, was man mit FP programmieren kann, prinzipiell auch prozedural oder mit OOP programmieren, dafür sorgt die Church-Turing-Äquivalenz.
Ist das ein ernstgemeintes Argument? "Prinzipiell" kann man auch direkt in Maschinencode programmieren.