Ansicht umschalten
Avatar von UNIX_rules!
  • UNIX_rules!

299 BeitrÀge seit 18.12.2020

Vergebene LiebesmĂŒh' Cloud Anwendungen programmiert man besser - nur funktional!

Warum bringt Funktionale Programmierung sehr viel mehr Sicherheit?

Aus der Bool'schen Algebra und PrĂ€dikatenlogik ist bekannt, dass man damit nicht nur beliebige Sachverhalte in der Welt beschreiben, sondern komplexe AusdrĂŒcke auch durch einen mathematischen Formalismus vereinfachen kann. Bedingung dafĂŒr aber ist, dass die Funktionen 'pure', also wechselwirkungsfrei, 'side effect free' sind.

Hierzu ein Beispiel. Ich definiere:

f(t): Programmierer hat Funktionale Programmierung am Zeitpunkt t verstanden.
h(t): Programmierer hat zum Zeitpunkt t Hunger.
d(t): Zeitpunkt ist am Tag.
n(t): Zeitpunkt ist nachts.
t₁ < t₂: Zeitpunkt t₁ trat irgendwann vor t₂ ein.

Interessanterweise kann man nur damit - also mit nur ganz wenigen, prĂ€dikatenlogischen Formeln - erstaunliche Sachverhalte des tĂ€glichen Lebens damit ausdrĂŒcken:

1. Immer wenn der Programmierer Hunger hat, versteht er nichts von Funktionaler Programmierung.

2. Es kommt vor, dass der Programmierer nachts Hunger hat.

3. Es gibt einen erleuchtenden Moment, ab dem der Programmierer Funktionale Programmierung fĂŒr immer verstehen wird.

4. Zwischen zwei bestimmten Zeitpunkten hat der Programmierer ein Funktionales Blackout (versteht also nix mehr), aber vorher und auch hinterher versteht er schon.

Hier nun die Übersetzung obiger Phrasen in die 'mathematische Sprache':

∀t: h(t) => ÂŹf(t) (FĂŒr alle Zeiten gilt: Wenn Hunger, dann nix funktional!)

∃t: n(t) ^ h(t) (Es existiert eine Zeit t, wo "Nacht und Hunger" zusammenfallen!)

∃t₀: ?t : (t₀ < t) => f(t)

∃t₀: ∃t₁: ∀t: (t₀ < t) ^ (t < t₁) <=> ¬f(t)

Funktionale Programmiersprachen enthalten eine ganze Reihe von Reduktionsmechanismen, entlang des griechischen Alphabets bezeichnet. Die Einfachste ist die sogenannte "ÎČ reduction". Sie wird, wie alle anderen Reduktionen auch, mit dem λ Operator (oft auch als "\" geschrieben) angewendet und beschreibt schlicht das von der Mathematik her bekannte "Einsetzen" eines Wertes in eine Formel:

(λx -> 2*x*x + y)

λx definiert hier eine anonyme Funktion, die allerding zwei Platzhalter (x und y) fĂŒr 2 Werte zum Einsetzen bereit hĂ€lt, die - wegen 'pure' der Reinheit und KompossibilitĂ€t (math. Zusammensetzbarkeit) - nacheinander ĂŒbergeben werden mĂŒssen. Das bezeichnet man als "Currying". Wir ĂŒbergeben als erstes mal die 7:

(λx -> 2*x*x + y)(7)

Mit dem Resultat:

2*7*7 + y

Hoppla, das ist aber nicht das Endergebnis, sondern wieder eine Funktion, die ich weiter reduzieren kann:

(λy -> 2*7*7 + y)(2)

mit dem erwarteten Endergebnis 100. Der λ Calculus ist zur Ruhe gekommen und hat seinen finalen Status erreicht. Vgl. der 'fleissige Biber':

https://de.wikipedia.org/wiki/Fleißiger_Biber

Man kann aber die beiden Schritte aber auch zusammenfassen:

(λx.λy -> 2*x*x + y)(7)(2)

Das λ-KalkĂŒl ist also ein riesiger Legobaukasten, aus dem man mit wohldefinierten Bausteinen - den wohlbekannten, gut untersuchten Gesetzen und Formalismen der Mathematik, PrĂ€dikatenlogik und Bool'schen Algebra folgend - besonders in großen Teams - hoch komplexe Programme in nur kurzer Zeit bauen kann. Alles ist additiv im mathematischen Sinne, alles folgt 'generischen Regeln'. Es gibt in Haskell eine ganze Reihe von 'Reductions', die alle - auf magische Weise - miteinander kombinierbar sind. Siehe Quellcode des GHC Compilers.

Das bezeichnet man als 'OrthogonalitÀt': Alles ist mit allem kombinierbar. Voraussetzung allerdings ist, dass sich alle daran halten und nur reine, also 'pure functions' verwenden. Zudem laufen die so entstandenen Programme zumeist beim ersten Anlauf bereits - fehlerfrei.

Eine - vielleicht noch sehr viel wichtigere - Eigenschaft angesichts des Cloud - Zeitalters, in dem wir uns befinden:

Die Programme sind mathematisch/formal verifizierbar. was bei anderen Programmiersprachen (imperativ / prozedural / objektorientiert) wegen der 'Side effects' prinzipiell unmöglich ist.

Was fĂŒr Überraschungen Interpreter allgemein so bereit halten, hierzu das berĂŒhmte, sehr lustige Video 'WAT!" von Gary Bernhardt:

https://www.destroyallsoftware.com/talks/wat

Ein einziger Schrotthaufen! Alles außerhalb funktionaler Programmierung kann man getrost als 'unproduktiven und extrem fehleranfĂ€lligen MĂŒll' bezeichnen.

Pure Zeitverschwendung, weil man sich zu 90% in der Fehlersuche befindet, ProduktivitÀt -> Null!

Meine Empfehlungen:

https://elm-lang.org/docs/syntax
https://jordanmartinez.github.io/purescript-jordans-reference-site/
https://haskell-miso.org/

Have fun!

Bewerten
- +
Ansicht umschalten