Abschlussarbeiten/Projekte
Die hier aufgeführten Bachelor- und Masterarbeiten können in Absprache auch in Form von Bachelor- bzw. Masterprojekten bearbeitet werden. Dabei wird ggf. der Umfang des Projektes an die Gegebenheiten des Projektes angepasst. Falls Sie sich für andere Themen aus den Bereichen moderne Methoden der Softwareentwicklung, Compilerbau, Programmiersprachen oder Algorithmen interessieren, wenden Sie sich bitte einfach per Mail an mich.
Mining Software Repositories
Eine empirische Untersuchung von Piping in Elm
In dieser Arbeit soll die Verwendung der Operatoren |>
und <|
in Elm-Projekten bei GitHub untersucht werden.
Aus mehreren vorhergehenden Abschlussarbeiten steht bereits eine Anwendung in Haskell zur Verfügung, die Elm-Repos von GitHub klont und für den Quelltext abstrakte Syntaxbäume (AST) erzeugt.
Um die Elm-Anwendungen zu parsen, also einen AST aus dem Quelltext zu erzeugen, wird die Bibliothek elm-format verwendet.
Um einfach Informationen aus dem AST zu extrahieren, nutzt die Haskell-Anwendung die Ideen aus Uniform Boilerplate and List Processing.
Die Informationen, die zu den Operatoren |>
und <|
erhoben werden, können sich an der Publikation An Empirical Study of Method Chaining in Java orientieren.
Es soll zum Beispiel untersucht werden, wie häufig die Operatoren (ggf. im Vergleich zu normalen Funktionsanwendungen) verwendet werden.
Außerdem soll untersucht werden, ob es eher lange Sequenzen von Verwendungen der Operatoren gibt oder ob die Operatoren eher einzeln verwendet werden.
Daneben soll untersucht werden, in welchen Fällen die Operatoren |>
und <|
vor allem verwendet werden.
Zum Beispiel wird der Operator |>
gern zusammen mit Funktionen wie andThen
und andMap
verwendet.
Außerdem wird der Operator <|
gern verwendet, wenn das Argument, auf das die Funktion angewendet wird, mehrere Zeilen überspannt.
Es soll untersicht werden, ob die Operatoren |>
und <|
vor allem in diesen Fällen verwendet werden oder ob es noch weitere wiederkehrende Anwendungsfälle gibt.
Falls die Zeit es erlaubt, kann die Untersuchung auf weitere funktionale Sprachen ausgedehnt werden.
Voraussetzungen: Grundkenntnisse in Haskell, gute Kenntnisse in Elm
Geeignet als: Bachelor- oder Masterarbeit
Replikation einer Studie
In dieser Arbeit soll die Studie Meaningful Identifier Names: The Case of Single-Letter Variables repliziert werden. Die Studie untersucht, wie lang die Bezeichner in den Programmiersprachen C, Java, JavaScript, PHP, und Perl sind und wie häufig Einbuchstabenbezeichner sind. Dazu werden Projekte von GitHub analysiert. Bei GitHub stehen die Programme zur Verfügung, die zur Durchführung der Studie genutzt wurden. Dabei werden kleine Python-Skripte genutzt und ein paar sprachspezifische Skripte zur Extraktion der Variablen aus Programmen in den verschiedenen Programmiersprachen. Bei der Replikation sollen insbesondere die Ergebnisse für die Programmiersprache JavaScript genauer überprüft werden. Die Ergebnisse für die Programmiersprache JavaScript lassen vermuten, dass ggf. minifizierte JavaScript-Dateien mit analysiert wurden. Das folgende Zitat stammt aus der Original-Publikation.
This (together with the fact that single-letter variables are very common as shown in Figure 1) may indicate that the dataset includes some minified code that was not identified correctly and removed by our filter.
Daher soll nach der Replikation insbesondere ein Konzept entwickelt werden, um minifizierte JavaScript-Module auszuschließen.
Voraussetzungen: Kenntnisse in Python
Geeignet als: Bachelorarbeit
Bezeichner in F#
In dieser Arbeit soll eine bestehende Haskell-Anwendung um die Verarbeitung von F#-Programmen erweitert werden. Die Programmiersprache F# ist eine funktionale Sprache, die von Haskell inspiriert wurde und auf der .Net-Platform von Microsoft läuft. Die bestehende Haskell-Anwendung sammelt die 200 Repositories mit dem meisten Sternen von GitHub für die Programmiersprachen Haskell, Elm, PureScript und OCaml. Diese Anwendung soll um die Verarbeitung der 200 Repositories mit den meisten Sternen in F# erweitert werden. Zu diesem Zweck muss im ersten Schritt die Möglichkeit geschaffen werden, F#-Programme in Haskell zu verarbeiten. Dazu soll ein minimales F#-Programm geschrieben werden, das eine Datei mit einem F#-Programm einliest und einen abstrakten Syntaxbaum (AST) auf der Konsole ausgibt. Für diesen abstrakten Syntaxbaum wird dann in Haskell ein Parser mithilfe von Parser-Kombinatoren geschrieben. Der Parser überführt die Ausgabe auf der Konsole in einen Haskell-Datentyp, der den AST darstellt. Wenn auf diese Weise erfolgreich in Haskell ein AST für ein F#-Programm erzeugt werden kann, soll prototypisch gezeigt werden, dass die Bezeichner aus einem F#-Programm gesammelt werden können.
Bei der Umsetzung als Masterarbeit soll die gesamte Integration der Sprache in das bestehende Tool umgesetzt werden. Dazu sollen Build-Dateien der Sprache F# analysiert werden, um die Quelldateien, die ich in einem Repository befinden, zu sammeln.
Voraussetzungen: Gute Kenntnisse in einer funktionalen Sprache
Geeignet als: Bachelor- oder Masterarbeit
Programmiersprachen-Design
Entwicklung einer Sprache für mathematische Beweise
In der Vorlesung Algorithmen müssen die Studierenden kleine Beweise zum asymptotischen Verhalten von Funktionen schreiben. Es ist leider sehr aufwändig, sinnvoll Rückmeldungen zu den Beweisen zu geben. Dieses Problem soll in dieser Arbeit angegangen werden.
Das erste Problem bei der Abgabe der Aufgaben besteht darin, dass die Studierenden Fotos ihrer Beweise oder PDF-Dateien abgeben. Diese Daten lassen sich im Vergleich zum Programmcode, der in den anderen Aufgaben abgegeben wird, nicht gut automatisiert analysieren. Daher soll im ersten Schritt eine Sprache für die spezielle Form von Beweisen, die die Studierenden schreiben, entwickelt werden. Diese Sprache orientiert sich stark an den mathematischen Formalismen, kann aber in Form einer Textdatei verfasst werden.
Wenn die Studierenden ihre Textdatei hochladen, sollten sie eine direkte Rückmeldung zu Ihrer Abgabe erhalten. In den Programmieraufgaben geschieht dies durch Testfälle und statische Analysen, die durch Automatisierung bei jedem Push in ein Git-Repository ausgeführt werden. Im Vergleich zu Programmieraufgaben scheitern viele Studierenden bei den Mathematikaufgaben bereits daran, korrekte Syntax zu verwenden und Variablen korrekt einzuführen, bevor sie verwendet werden. Um Feedback zu den Aufgaben zu erhalten, soll ein Parser für die sehr einfache mathematische Sprache entwickelt werden. Dieser Parser muss berücksichtigen, dass Studierende häufig bereits Probleme mit der Syntax haben und sollte die Ergebnisse nicht nur verwerfen, sondern gute Erklärungen für die Fehler liefern.
Voraussetzungen: Gute Kenntnisse in einer funktionalen Sprache, grundlegende mathematische Fähigkeiten
Geeignet als: Bachelorarbeit
Sicheres Model-View-Update
In dieser Arbeit soll ein Konzept für eine Model-View-Update-Architektur entwickelt werden, die mehr statische Garantien erlaubt. Dabei geht es insbesondere um den Fall, dass in einem bestimmten Modellzustand nur bestimmte Nachrichten an die Anwendung möglich sind. Das Konzept soll prototypisch für die Model-View-Update-Architektur in Haskell umgesetzt werden.
Aktuell lässt sich in Elm nicht ausdrücken, dass nur bestimmte Nachrichten in einem bestimmten Modellzustand erwartet werden. Wenn man etwa das Beispiel eines Spiels nimmt, kann das Spiel laufen oder beendet sein. Während das Spiel läuft ist es beispielsweise möglich eine Spielfigur mit den Tasten zu bewegen. Ist das Spiel beendet, sollen diese Eingaben aber nicht verarbeitet werden. Wenn die Anwendung im Beendet-Zustand eine Nachricht zum Bewegen der Spielfigur erhält, gibt es zwei Möglichkeiten. Die Nachricht kann ignoriert werden, was schnell dazu führt, dass fehlerhafte interne Zustände erhalten bleiben. Alternativ kann die Anwendung in einen Fehlerzustand wechseln, wenn ein inkonsistenter Zustand auftritt. In diesem Fall wird im Grunde ein Laufzeitfehler ausgelöst und es ist wünschenswert, solche Laufzeitfehler durch statische Fehler zu ersetzen.
Als mögliche Lösung für dieses Problem soll der Einsatz von generalisierten algebraischen Datentypen (GADTs) evaluiert werden. Die Programmiersprache Elm stellt keine generalisierten algebraischen Datentypen zur Verfügung, in der Programmiersprache Haskell können diese aber genutzt werden. Daher soll das Konzept mithilfe der Haskell-Bibliothek miso evaluiert werden. Das Framework miso ist eine Implementierung der Model-View-Update-Architektur in Haskell. Zur Illustration der Verwendung von miso enthält das miso-Repository eine Implementierung des TodoMVC.
Im Kontext von Haskell soll evaluiert werden, welche Probleme bei der Modellierung von konkreten Anwendungen im Kontext eines sicheren Model-View-Update entstehen. Während die Verwendung von GADTs zum Beispiel eine höhere statische Sicherheit ermöglicht, werden Programmierer*innen ggf. so stark eingeschränkt, dass es schwieriger ist, eine Anwendung zu strukturieren. Um diesen Aspekt zu evaluieren, sollen verschiedene typische Beispiele aus der Entwicklung von Frontendanwendungen mit der Model-View-Update-Architektur evaluiert werden.
Voraussetzungen: Gute Kenntnisse in einer funktionalen Sprache
Geeignet als: Bachelor- oder Masterarbeit
Programmiersprachen-Migration
Werkzeuge zur Migration von JavaScript nach TypeScript
In dieser Arbeit sollen Werkzeuge evaluiert werden, die genutzt werden können, um JavaScript-Anwendungen nach TypeScript zu migrieren. Zur Evaluation soll eine konkrete JavaScript-OpenSource-Anwendung genutzt werden. Im ersten Schritt muss einer Liste der möglichen Werkzeuge zur Migration erstellt werden. Dabei soll sowohl wissenschaftliche Literatur als auch OpenSource-Anwendungen berücksichtigt werden.
Programmanalyse
Entwicklung eines Identifier Dictionaries für Haskell
Die Publikation Concise and consistent naming stellt das Konzept eines Identifier Dictionaries vor. Diese Anwendung sammelt die Bezeichner, die in einem Software-Projekt verwendet werden und listet sie auf. Die Anwendung soll dabei helfen, ungenaue oder inkonsistente Benennungen zu erkennen.
In dieser Arbeit soll eine vergleichbare Anwendung für die Programmiersprache Haskell entwickelt werden. Die größte Herausforderung besteht dabei darin, Typinformationen für die in einer Haskell-Anwendung verwendeten Variablen zu erhalten. Um dies zu erreichen, muss die Haskell-Anwendung inklusive der Auflösung von Abhängigkeiten gebaut werden. Es soll prototypisch ein Ansatz für ein solches Identifier Dictionary entwickelt werden. Zu diesem Zweck werden Hie-Dateien verwendet. Der Haskell-Compiler ist in der Lage, Hie-Dateien zu erzeugen. Bei diesen Dateien handelt es sich um Beschreibungen des Interface eines Moduls, die zum Beispiel für IDE-Unterstützungen verwendet werden. Diese Hie-Dateien müssen für ein Projekt erzeugt und gelesen werden, um ein Identifier Dictionary zu erzeugen.
Voraussetzungen: Gute Kenntnisse in Haskell
Geeignet als: Bachelor- oder Masterarbeit
Redundante Fälle in case
-Ausdrücken
Um Studierenden Rückmeldungen zur Ihren Programmierabgaben in der Programmiersprache Elm zu geben, wird in einer Vorlesung die Bibliothek elm-review genutzt.
In dieser Arbeit soll eine Regel für die Bibliothek elm-review
entwickelt werden, die anmerkt, wenn ein Fall eines case
-Ausdruckes redundant ist.
Ein Fall ist redundant, wenn man den Fall entfernen kann, ohne dass sich das Verhalten der Funktion verändert.
Die folgende Definition enthält eine Regel, die redundant ist.
snocList : List a -> a -> List a
snocList list element =
case list of
[] ->
element :: []
head :: [] ->
head :: element :: []
head :: rest ->
head :: snocList rest element
Wenn die zweite Regel aus dieser Definition entfernt wird, verändert sich das Verhalten dieser Funktion nicht.
Wenn die Funktion mit einer Liste der Form head :: []
aufgerufen wird, wird die dritte Regeln genommen, falls die zweite Regel nicht existiert.
In diesem Fall wird der Aufruf snocList [] element
durchgeführt, wobei element
ein abstraktes Argument ist, das an die Funktion snocList
übergeben wurde.
Der Aufruf snocList [] element
liefert als Ergebnis element :: []
.
Somit erhalten wir von der gesamten dritten Regel als Ergebnis head :: element :: []
, was identisch zum Ergebnis ist, das die zweite Regel geliefert hätte.
Daher kann in dieser Definition die zweite Regel entfernt werden.
Um zu überprüfen, ob ein Fall entfernt werden kann, muss zuerst überprüft werden, ob es zwei Pattern gibt, die sich überlappen.
In der Funktion snocList
überlappen zum Beispiel die Pattern head :: []
und head :: rest
, da das erste Pattern ein Spezialfall des zweiten Pattern ist.
Aus den beiden Pattern kann nun eine Substitution berechnet werden.
Eine Substitution beschreibt, wie man aus dem einen Pattern das andere Pattern erzeugen kann.
Im Fall von snocList
besteht die Substitution aus rest -> []
.
Das heißt, wenn wir die Variable rest
durch []
ersetzen, können wir aus dem Pattern head :: rest
das Pattern head :: []
erzeugen.
Wenn zwei Pattern gefunden sind, die sich überlappen, kann die Substitution auf die rechte Seite des Falles angewendet werden.
Wir ersetzen in unserem Beispiel also zum Beispiel im Ausdruck head :: snocList rest element
alle Vorkommen von rest
durch []
.
Wir erhalten somit head :: snocList [] element
.
Voraussetzungen: Gute Kenntnisse in einer funktionalen Sprache
Geeignet als: Masterarbeit
Reimplementierungen erkennen
Um Studierenden Rückmeldungen zur Ihren Programmierabgaben in der Programmiersprache Elm zu geben, wird die Bibliothek elm-review genutzt.
In dieser Arbeit soll eine Regel für die Bibliothek elm-review
entwickelt werden, die anmerkt, wenn eine Funktion eine Reimplementierung einer vordefinierten Funktion ist.
Als Beispiel betrachten wir die folgende Funktion, die sich mithilfe von List.map
implementieren lässt.
incAll : List Int -> List Int
incAll list =
case list of
a :: as ->
a + 1 :: incAll as
_ ->
[]
Es ist relativ aufwändig, alle möglichen Varianten dieser Funktion mit der Funktion List.map
zu vergleichen.
Zum Beispiel nutzt die Funktion incAll
im Unterschied zu List.map
ein Unterstrich-_Pattern_.
Außerdem prüft die Funktion List.map
zuerst das Pattern []
.
Daher soll die zu prüfende Funktion zuerst normalisiert werden.
Das heißt, zuerst wird das Unterstrich-_Pattern_ durch ein konkretes Pattern ersetzt.
Wir erhalten also die folgende Definition.
incAll : List Int -> List Int
incAll list =
case list of
a :: as ->
a + 1 :: incAll as
[] ->
[]
Im nächsten Schritt werden die Pattern in eine vorgegeben Reihenfolge gebracht und wir erhalten die folgende Definition.
incAll : List Int -> List Int
incAll list =
case list of
[] ->
[]
a :: as ->
a + 1 :: incAll as
Im nächsten Schritt werden für die Variablen in den Pattern die Namen verwendet, die auch in List.map
verwendet werden.
Das heißt, wir erhalten die folgende Definition.
incAll : List Int -> List Int
incAll list =
case list of
[] ->
[]
head :: rest ->
head + 1 :: incAll rest
Nun kann die Funktion einfacher mit der vordefinierten Funktion List.map
verglichen werden, da zum Beispiel die Pattern einfach der Reihenfolge nach verglichen werden können.
Als Beispiele für die Erkennung von Reimplementierungen können die Funktionen List.length
, List.filter
, List.any
, List.map
und List.concatMap
betrachtet werden.
Voraussetzungen: Gute Kenntnisse in einer funktionalen Sprache
Geeignet als: Bachelorarbeit
Feedback zu Mathematik-Aufgaben
Dieses Projekt ist einer Erweiterung des Projektes Entwicklung einer Sprache für mathematische Beweise. Wenn die Abgabe der mathematischen Beweise syntaktisch akzeptiert wird, sollten die Studierenden auch Rückmeldung zur Korrektheit der Abgabe erhalten. Dazu soll der interaktive Theorembeweiser Coq verwendet werden. Coq stellt eine Programmiersprache zur Verfügung, in der Beweise programmiert werden können. Das Web-Buch Software Foundations bietet eine Einführung in die Programmiersprache Coq. Das Buch führt aber sehr viel mehr Konzepte der Sprache ein als für die Bearbeitung des Themas benötigt werden. Um einen Beweis zu überprüfen, muss die eigene Beweissprache in ein Coq-Programm überführt werden. Das Coq-Programm kann anschließend durch den Coq-Compiler auf Korrektheit überprüft werden. Wenn der Coq-Compiler das Programm akzeptiert, ist der Beweis korrekt. Im ersten Schritt muss erst einmal keine Rückmeldung gegeben werden, warum der Beweis falsch ist.
Zu Anfang der Arbeit muss erst einmal eine Literaturrecherche zum Thema Vermittlung von mathematischen Fähigkeiten mithilfe von Theorembeweisern durchgeführt werden. Einen guten Einstieg bietet Waterproof: Educational Software for Learning How to Write Mathematical Proofs.
Voraussetzungen: Gute Kenntnisse in einer funktionalen Sprache, grundlegende mathematische Fähigkeiten
Geeignet als: Masterarbeit
Web-Anwendungen
Regionale Rezepte
In dieser Arbeit soll ein Prototyp für eine Web-Anwendung für Rezepte mit regionalen Zutaten entwickelt werden. Der durchschnittlichen Bevölkerung ist heutzutage häufig gar nicht mehr klar, dass nicht jedes Lebensmittel zu jeder Jahreszeit in der Nähe angebaut werden kann. Das Ziel dieser Anwendung ist daher, Rezepte zur Verfügung zu stellen, bei denen berücksichtigt wird, dass Zutaten aktuell/zu einem bestimmten Zeitpunkt regional angebaut werden können. Im ersten Schritt muss dazu ein Konzept entwickelt werden. Das Internet bietet bereits zahlreiche Quellen, in denen man sich über die Saisonalität von landwirtschaftlichen Produkten informieren kann. Bei der Nutzung dieser Quellen muss man sich aber aktiv für dieses Thema interessieren und häufig manuell die Zutaten von Rezepten in saisonalen Kalendern suchen. Die Anwendung soll daher möglichst niedrigschwellig dafür sorgen, dass mehr Personen Rezepte auswählen, deren Zutaten saisonal regional angebaut werden können. Bei der Anwendung soll nicht die Vermittlung von Wissen im Vordergrund stehen, sondern die Motivation von Nutzer*innen, die Rezepte zu verwenden.
Im ersten Schritt müssen Datenquellen für landwirtschaftliche Produkte evaluiert werden. Dabei kann es sich sowohl um Onlinedienste handeln, als auch um Quellen, deren Daten statisch in der Anwendung integriert werden. Diese Quellen sollen Daten darüber zur Verfügung stellen, welche landwirtschaftlichen Produkte zu welcher Zeit in Schleswig-Holstein zur Verfügung stehen.
Bei der Bewertung der Nachhaltigkeit von Produkten muss berücksichtigt werden, dass einige Produkte auch als Lagerware zur Verfügung stehen. Die Lagerung von Produkten bedeutet aber in einigen Fällen, dass eine aktive Kühlung durchgeführt werden muss. Einige Produkte werden außerdem in bestimmten Monaten nur aus dem Gewächshaus angeboten. Vor der Umsetzung der Anwendung soll die Nachhaltigkeit dieser Optionen bewertet werden, um zu entscheiden, wie diese Fälle von der Anwendung bewertet werden. Außerdem soll bewertet werden, ob alle Zutaten eines Rezeptes regional sein müssen. Dies würde zum Beispiel alle Rezepte, die Reis verwenden, ausschließen. Ggf. wäre es sinnvoll, um die Ernährung in der breiten Masse nachhaltiger zu gestalten, einen gewissen Kompromiss einzugehen und eine nicht-nachhaltige Zutat in den Rezepten zu erlauben.
Technologisch soll die Anwendung mit Elm im Frontend umgesetzt werden. Zu Beginn des Projektes sollen verschiedene Alternativen für die Umsetzung des Backends evaluiert werden.
Voraussetzungen: Gute Kenntnisse in Elm
Geeignet als: Bachelor- oder Masterarbeit