# Funktionale Programmierung, OO- Programmierung, ...



## Generic1 (2. Nov 2010)

Hallo,

ich muss mich in nächster Zeit mit Erlang beschäftigen und weiß bis jetzt nur, dass es einen funktionale Programmiersprache ist.
Ich hab mir jetzt den Wikipedia- Artikel über Erlang durchgelesen, bin aber nicht schlauer geworden, was der Unterschied zwischen einer funktionalen und einer oo- Programmiersprache ist,
Könnte das vielleicht jemand erklären, was da der Unterschied ist?
Vielen Dank und lg,
Generic1


----------



## tfa (2. Nov 2010)

Generic1 hat gesagt.:


> bin aber nicht schlauer geworden, was der Unterschied zwischen einer funktionalen und einer oo- Programmiersprache ist,
> Könnte das vielleicht jemand erklären, was da der Unterschied ist?



Das eine schließt das andere nicht aus. Es gibt durchaus objektorientierte, funktionale Sprachen. Objektorientiertheit ist einfach nur ein "Feature", das grundsätzlich imperative und funktionale Sprachen haben können (bestimmt auch logische, aber da kenn ich mich nicht aus).


----------



## Generic1 (2. Nov 2010)

Und was ist jetzt der Unterschied zwischen imperativen, funktionalen und logischen Sprachen.


----------



## Purgator (2. Nov 2010)

Aloha,
ich versuche mich mal an das Semester zu erinnern wo ich prolog (logisch) und haskell (funktional) hatte.

Also bei rein funktionaler programmierung gibt es z.B. keine Schleifen. Du musst alles was du damit machen wollen würdest mit rekursion lösen. und globale Variablen dürfte es imho auch nicht geben, glaube die wurden höchstens als Parameter übergeben... bin mir da aber nicht mehr 100%ig sicher.

Logische Programmierung ist mein Nemesis, habe nie verstanden warum die nicht das machen wollten was ich ihnen sagte... fand mein Quelltext schon logisch. Dazu kann ich dir nicht viel Sagen ausser das die halt nach regeln irgendwas berechnen. Z.b. das Einsteinrätsel kann damit einfach gelöst werden. Du gibst halt die vorbedingungen und dann die Hinweise ein. Mittels logischer Verknüpfungen findet dann das Programm automatisch die Lösung.

Hoffe ich habe nicht irgendeinen Müll erzählt, aber nach meinen Erinnerungen war das alles so...


----------



## Landei (2. Nov 2010)

In funktionalen Sprachen sind natürlich Funktionen die grundlegende Abstraktion (beim grundlegenden Lambda- bzw. SKI-Kalkül gibt es nur Funktionen, nichts anderes, und auch Werte wie Zahlen werden daraus aufgebaut - aber in der Praxis geht das zu weit). Das schließt ein, dass Funktionen selbst Argumente anderer Funktionen sein können, aber das ist nichts besonderes mehr, wo fast alle modernen OO-Sprachen soetwas (meist als "Lambda" oder "Closure") unterstützen -  mit der prominenten Ausnahme von Java.

Funktionen in funktionalen Sprachen sollen möglichst Seiteneffekte (z.B. IO, Systemzeit, Zufallszahlen) vermeiden, also immer dasselbe Ergebnis liefern ("referentielle Integrität"). Sprachen wie Haskell und Clean erzwingen das sogar durch ihr Typsystem ("pure Sprachen"). Damit Hand in Hand geht die Bevorzugung unveränderlicher Datentypen: Einer Liste in Haskell kann man nichts hinzufügen, man lässt sich stattdessen eine neue Liste mit dem zusätzlichen Element zurückgeben. Das hat wiederum weitreichende Folgen für die Optimierung und Parallelität (in Erlang basiert das Aktor-Modell auf der Unveränderlichkeit der Botschaften).


----------



## Geeeee (2. Nov 2010)

Funktional kann man schon einmal "sehr vereinfacht, aber verständlich" so ausdrücken:
Streng funktionale Programme besitzen "nur" Funktionen, die einer Abbildungsvorschrift folgen (ja, wie in der Mathematik)
D.h. eine Funktion X bildet z.B. Integer und Integer auf einen Integer ab (z.b. Addition). Natürlich bleibt es in den Tiefen der Funktionalen Programmierung nicht dabei.
Noch einfacher: Funktionale Programmierung besitzt einen großen Teil an Listenschieben für Fortgeschrittene


----------



## Generic1 (2. Nov 2010)

Ok, Funktionen als Funktionsparameter -> damit hab ich nur in JS gearbeitet -> Prügelt mich wenn das in JS wieder ganz anders funktioniert wie in anderen Programmiersprachen.
Für das kommende Projekt muss ich mich auch in Scala einarbeiten.
Anscheinend bietet Scala auch so was wie Closures und Concurrency out of the Box.
Könnt ihr das bestätigen?
lg


----------



## Andi_CH (2. Nov 2010)

Generic1 hat gesagt.:


> ich muss mich in nächster Zeit mit Erlang beschäftigen und weiß bis jetzt nur, dass es einen funktionale Programmiersprache ist.
> Ich hab mir jetzt den Wikipedia- Artikel über Erlang durchgelesen, bin aber nicht schlauer geworden, was der Unterschied zwischen einer funktionalen und einer oo- Programmiersprache ist,
> Könnte das vielleicht jemand erklären, was da der Unterschied ist?



Meines Erachtens gibt es eigentlich keine OO Programmiersprachen (na ja, es gab mal SmallTalk, aber das Thema lassen wir mal beiseite)
OO Programmierung ist ein Konzept und keine Sprache denn grundsätzlich kann man auch in Assembler objektorientiert programmieren.

Die Aussage: "wir programmieren objektorientiert, wir verwenden einen C++ Kompiler" wurde mir tatsächlich wörtlich so an den Kopf geworfen und ist natürlich falsch - man kann problemlos rein prozeduralen Code von einem C++ Kompiler übersetzten lassen. Auch Javacode ist nicht automatisch objekrorientiert (einfach alles static machen ;-) )

Ich empfehle mal das da zu lesen. Da ist recht genau erklärt was man unter OO versteht.

Zu Erlang kann ich nichts sagen, aber das macht sogar auf mich einen gewöhnungsbedürftigen Eindruck. (Ich hab immerhin schon Chill und Portal programmiert ;-) )


----------



## Sempah (2. Nov 2010)

Man unterscheidet die verschiedenen Paradigmen:


imperativ
prozedural
objektorientiert

deklarativ
logisch
funktional


... wobei auch Paradigmenintegration möglich ist -> sog. Multiparadigmensprache wie Scala, welche OOP + FP vereinigt. Der Einsatz von unterschiedlichen Sprachen wird unter dem Stichwort polyglot programming geführt.


Imperative Sprachen sind zustandsbehaftet, d.h. das ein Programm einen Zustand besitzt, welcher durch Befehle modifiziert wird. Ein Programm ist eine Folge von Anweisungen.

Bei deklarativen Sprachen steht nicht das WIE, sondern viel mehr die Lösung des Problems im Vordergrund (stelle dir SQL vor. SELECT x FROM tableY ...)
- keine Seiteneffekte, da referentiell transparent

Wie bereits gesagt wurde, ist in funktionalen Sprachen die Funktion das höchste Mittel der Abstraktion.
Funktionale Sprachen unterstützen in den meisten Fälle Funktionen höherer Ordnung (= Funktionale).
Diese können als Parameter einer anderen Funktion mitgeliefert werden,  in Datenstrukturen abgelegt werden sowie Funktionen selbst als Ergebnis zurückliefern.

Funktionen werden häufig auch als "first class values" der Sprache bezeichnet.

In Scala ist z.B. so etwas möglich:

```
list = List(1, 2, 3, 4)
list.map(x => x * 2)
```

"map" ist eine Funktion höherer Ordnung, welcher eine anonyme Funktion "x => x *2" mitgegeben wird.
Auf jedes Element der Liste wird "* 2" angewendet. Da Immutabilität in funktionalen Sprachen groß geschrieben wird (Scala unterstützt jedoch auch mutable Datenstrukturen, da oop + fp), bleibt der Inhalt der Liste "list" unverändert. Die zweite Zeile führt zu einer neuen Liste ("list" wird nicht überschrieben!).

Und ja Scala unterstützt Closures. Als Concurrency Modell bietet Scala das Aktoren Konzept (welches aus Erlang bekannt ist) an. Natürlich könnte man aber auch Java's Concurrency Modell verwenden.


----------



## Landei (2. Nov 2010)

Generic1 hat gesagt.:


> Ok, Funktionen als Funktionsparameter -> damit hab ich nur in JS gearbeitet -> Prügelt mich wenn das in JS wieder ganz anders funktioniert wie in anderen Programmiersprachen.


Nö, ist im Prinzip überall ähnlich.



> Für das kommende Projekt muss ich mich auch in Scala einarbeiten.


Gratuliere! Die beste Variante, wenn du schon Java kannst. Scala ist eine Hybridsprache, du kannst OO und funktional mixen, wie du es gerade brauchst. 



> Anscheinend bietet Scala auch so was wie Closures und Concurrency out of the Box.
> Könnt ihr das bestätigen?
> lg



Ja und Jainundeinhalb. Scala hat eine eingebaute Actor-Bibliothek (an Erlang angelehnt, es gibt aber auch alternative Implementierungen wie Akka), und an einer Fork-Join-basierten Bibliothek wird fleißig gewerkelt (das ist das einhalb).

Hier sind ein paar nützliche Links, die ich gesammelt habe: Scala lernen  eSCALAtion Blog


----------

