Diese Masterarbeit wird sich mit dem jungen und modernen Lisp-Dialekt Clojure und seinen Sprachfeatures beschäftigen. Clojure läuft innerhalb der Java Virtuel Machine (JVM) und kann somit nahtlos in objektorientierte Java-Programme integriert werden, um beispielsweise nebenläufige Algorithmen umzusetzen. Daneben existieren alternativ auch eine CLR- sowie JavaScript-Implementierung.
Im Rahmen dieser Arbeit wird neben den Concurrency-Features auch die Technologie Software Transactional Memory (STM) vorgestellt, mit dessen Hilfe sich die ACID-Eigenschaften auf den zu manipulierenden transienten Speicher abbilden lassen. Eine Transaktion bündelt Befehle, die auf gemeinsame Ressourcen zugreifen. Falls zwei Transaktionen auf die gleiche Ressource zugreifen möchten, wird eine der beiden Transaktionen abgebrochen. Die Sprache bietet hierfür die benötigten
Konstrukte. Ein wichtiges Pattern innerhalb der Objektorientierten Programmierung ist die Trennung der Programmierschnittstelle von der Implementierung, realisiert durch Sprachelemente wie Interfaces und Klassen sowie Vererbung und Polymorphie. Clojure kann als funktionale Sprache diesen traditionellen Lösungsansatz nicht verwenden und führt Alternativen ein. Die Sprachelemente Protocols, Multimethods und Datatypes werden hierzu näher beschrieben.
Neben den Clojure-spezifischen Sprachfeatures werden weitere grundlegende Prinzipien und Entwurfsmuster der Funktionalen Programmierung wie z.B. Macros, Lambdas, Currying, Memoization, Closures und Monaden vorgestellt. Um Clojure von anderen funktionalen Sprachen abgrenzen zu können, werden abschließend Alternativen vorgestellt und ein Vergleich bezüglich Funktionsumfang und Performance mit Haskell durchgeführt.
Inhaltsverzeichnis
- 1 Einleitung
- 1.1 Motivation
- 1.2 Zielstellung
- 2 Grundlagen der Funktionalen Programmierung
- 2.1 Eigenschaften Funktionaler Programmierung
- 2.1.1 Werte und veränderliche Objekte
- 2.1.2 First-Class, High-Order und Reine Funktionen
- 2.1.3 Collections und Datentypen
- 2.2 Programmierparadigmen
- 2.2.1 Imperative und Prozedurale Programmierung
- 2.2.2 Objektorientierte Programmierung
- 2.2.3 Deklarative Programmierung
- 2.2.4 Weitere Programmierparadigmen
- 2.3 Funktionale Idiome
- 2.3.1 Lambda und Anonyme Funktionen
- 2.3.2 Closures
- 2.3.3 Currying
- 2.3.4 Memoization
- 2.4 Zusammenfassung
- 2.1 Eigenschaften Funktionaler Programmierung
- 3 Clojure-spezifische Sprachmerkmale
- 3.1 Makros
- 3.1.1 Makros in anderen Sprachen
- 3.1.2 Makros in Clojure
- 3.1.3 Quote und Syntax-Quote
- 3.1.4 Hygiene
- 3.2 Datentypen und Protokolle
- 3.2.1 Definition von Protokollen
- 3.2.2 Erweitern von Datentypen
- 3.2.3 Benutzerdefinierte Typen
- 3.2.3.1 defrecord
- 3.2.3.2 deftype
- 3.2.3.3 Inline Implementierung von Protokollen
- 3.3 Multimethoden
- 3.3.1 Mutlimethoden Type-Dispatch
- 3.3.2 Hierarchien
- 3.4 Ausnahmebehandlung
- 3.5 Clean Code und Entwurfsmuster
- 3.5.1 Dependency Injection
- 3.5.2 Strategy Pattern
- 3.6 Zusammenfassung
- 3.1 Makros
- 4 Sprachfeatures zur nebenläufigen Programmierung
- 4.1 Grundlagen paralleler Programmierung
- 4.1.1 Multitasking und Multithreading
- 4.1.2 Schwierigkeiten der parallelen Programmierung
- 4.1.3 Klassische Lösung der Threading-Probleme
- 4.2 Zustand und Identität
- 4.3 Referenztypen
- 4.3.1 Referenztyp var
- 4.3.2 Referenztyp atom
- 4.3.3 Referenztyp ref und Software Transactional Memory
- 4.3.4 Referenztyp agent
- 4.4 Change Tracking und Validierung von Referenztypen
- 4.5 Futures
- 4.6 Zusammenfassung
- 4.1 Grundlagen paralleler Programmierung
- 5 Erweiterter Einsatz von Clojure
- 5.1 Monaden
- 5.1.1 Definition einer Monade
- 5.1.2 Gesetze der monadischen Operationen
- 5.1.3 Verwendung und Einsatz
- 5.1.4 Weitere Monadentypen
- 5.1.4.1 Zustands-Monade
- 5.1.4.2 Maybe-Monade
- 5.2 core.logic
- 5.2.1 Grundlagen von core.logic
- 5.2.1.1 Einführung in die Logische Programmierung
- 5.2.1.2 Inferenzumgebung run
- 5.2.1.3 Relationen vs. Funktionen
- 5.2.1.4 Fakten und Regeln
- 5.2.1.5 Logische Variablen
- 5.2.1.5 conde und Pattern Matching
- 5.2.2 Anwendung
- 5.2.2.1 Anwendungsfälle
- 5.2.2.2 Praktisches Beispiel
- 5.2.2.3 Logisches Puzzle
- 5.3 Zusammenfassung
- 5.2.1 Grundlagen von core.logic
- 5.1 Monaden
- 6 Alternative Funktionale Sprachen
- 6.1 Vorstellung alternativer Sprachen
- 6.1.1 Objective Caml
- 6.1.1.1 Das Typsystem
- 6.1.1.2 Funktionen
- 6.1.1.3 Pattern Matching
- 6.1.1.4 Rekursion
- 6.1.1.5 Weiteres
- 6.1.2 F#
- 6.1.2.1 F# vs. OCaml
- 6.1.2.2 Weiteres
- 6.1.3 Erlang
- 6.1.3.1 Multithreading-Support
- 6.1.3.2 Das Typsystem
- 6.1.3.3 Pattern Matching
- 6.1.3.4 Funktionen
- 6.1.3.5 Weiteres
- 6.1.1 Objective Caml
- 6.2 Clojure im Vergleich mit Haskell
- 6.2.1 Funktionsumfang
- 6.2.2 Sprachfeatures
- 6.2.3 Performance
- 6.3 Zusammenfassung
- 6.1 Vorstellung alternativer Sprachen
Zielsetzung und Themenschwerpunkte
Diese Masterarbeit befasst sich mit der funktionalen Programmiersprache Clojure und analysiert die Anwendung und Bewertung moderner Sprachfeatures in diesem Kontext.
- Die Arbeit untersucht die Grundlagen der funktionalen Programmierung und ihre Eigenschaften.
- Sie analysiert spezifische Sprachmerkmale von Clojure, einschließlich Makros, Datentypen und Protokollen, Multimethoden, Ausnahmebehandlung und Entwurfsmuster.
- Die Arbeit befasst sich mit Sprachfeatures, die für die nebenläufige Programmierung in Clojure relevant sind, wie z. B. Referenztypen, Futures und Zustandstracking.
- Sie untersucht den erweiterten Einsatz von Clojure, insbesondere Monaden und die Bibliothek core.logic.
- Die Arbeit stellt alternative funktionale Sprachen vor, wie z. B. Objective Caml, F# und Erlang, und vergleicht sie mit Clojure.
Zusammenfassung der Kapitel
- Kapitel 1 bietet eine Einleitung in das Thema der Arbeit, indem es die Motivation und die Zielstellung der Arbeit darlegt.
- Kapitel 2 behandelt die Grundlagen der Funktionalen Programmierung, einschließlich ihrer Eigenschaften, Programmierparadigmen und funktionaler Idiome.
- Kapitel 3 analysiert Clojure-spezifische Sprachmerkmale, darunter Makros, Datentypen und Protokolle, Multimethoden, Ausnahmebehandlung und Entwurfsmuster.
- Kapitel 4 befasst sich mit Sprachfeatures zur nebenläufigen Programmierung in Clojure, einschließlich Referenztypen, Futures und Zustandstracking.
- Kapitel 5 untersucht den erweiterten Einsatz von Clojure, insbesondere Monaden und die Bibliothek core.logic.
- Kapitel 6 stellt alternative funktionale Sprachen vor und vergleicht sie mit Clojure.
Schlüsselwörter
Funktionale Programmierung, Clojure, Sprachfeatures, Makros, Datentypen, Protokolle, Multimethoden, Ausnahmebehandlung, Nebenläufige Programmierung, Referenztypen, Futures, Monaden, core.logic, alternative funktionale Sprachen, Objective Caml, F#, Erlang, Haskell.
- Arbeit zitieren
- Lutz Leonhardt (Autor:in), 2013, Modernes Clojure. Einsatz und Bewertung moderner Sprachfeatures in Clojure, München, GRIN Verlag, https://www.grin.com/document/381390