Vorbemerkung:
Die folgenden Themenvorschläge sind unvollständig und naturgemäß oft nicht ganz aktuell! Weitere Themen auch aus anderen Gebieten sind möglich. Kontaktieren Sie bei Interesse daher auf jeden Fall Michael Hanus bzw. die jeweils ausgeführte Kontaktperson.
Implementierung einer Striktheits-Analyse für Curry
Von: Kai-Oliver Prott
Bei der Optimierung von funktionalen Haskell-Programmen ist es häufig nützlich zu wissen, ob bestimmte Argumente einer Funktion garantiert ausgewertet werden müssen. Auch in der funktional-logischen Programmiersprache Curry können solche Informationen bei der Optimierung eines Programms helfen. Einer der Anwendungsfälle wird gerade in einem verwandten Projekt ([1]) betrachtet.
In dieser Arbeit soll eine einfache Analyse von vereinfachtem FlatCurry Code implementiert werden. Dabei soll mit einer einfachen Implementierung begonnen werden, welche bei Bedarf beliebig um die Erzeugung detaillierterer Informationen erweitert werden kann. Die Implementierung soll sich dabei an der von Haskell ([2]) orientieren, darf aber weniger komplexe/gute Ergebnisse liefern.
Eignung: Bachelorarbeit
[1] Siehe unten “Optimierung von monadischem Code via Striktheits-Analyse” [2] https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/using-optimisation.html#ghc-flag--fstrictness
Universelle Instrumentierung von Zwischenprogrammen (in Bearbeitung)
Von: Michael Hanus
In vielen Anwendungsszenarien möchte man Informationen über den Ablauf eines Programms erhalten, z.B. beim Tracen/Debuggen, Profiling, Kontexte fehlschlagender Berechnungen u.ä. Häufig werden für diese Aufgaben spezielle Erweiterungen im Laufzeitsystem einer Implementierung vorgenommen, die schwierig auf andere Implementierungen übertragen werden können. Aus diesem Grund soll in dieser Arbeit ein Konzept entwickelt werden, wie man auf Zwischenprogrammebene Transformationen programmieren kann, die dann mit verschiedenen Backends für diese Zwischensprache implementierbar sind.
Konkret soll hier die Quellsprache Curry und die Zwischensprache FlatCurry betrachtet werden, da hier schon viele Tools vorhanden sind. Für FlatCurry sind verschiedene Backends (z.B. in Prolog, Haskell, Go, Julia) vorhanden, sodass eine geeignete Testumgebung vorhanden ist. Weiterhin wurden schon für einige dieser Backends spezielle Instrumentierungswerkzeuge implementiert, welcher mit dem Konzept dieser Arbeit verallgemeinert und somit für mehrere Implementierungen angeboten werden können. Das genaue Konzept soll durch die Analyse der vorhandenen Tools entwickelt werden. Ein mögliches Vorgehen wäre:
- Entwicklung einer API für Transformationen von FlatCurry-Programmen (Fragestellung: welche Arten von Transformationen sind ausreichend, welche Kontextinformation benötigen diese?)
- Festlegung von Basis-APIs für das jeweilige Tool, die die transformierten Programme verwenden (z.B. Operationen zur Trace-Ausgabe, Sammeln von Profiling-Daten, etc)
Mit Hilfe dieses Konzepts sollen prototypisch die in einigen Curry-Systemen vorhandenen Werkzeuge, wie Tracer/Debugger, Anzeige fehlschlagender Berechnungen [1], strikte Debugger für lazy Berechnungen [2] [3], Profiling [4], umgesetzt werden, oder auch neue Werkzeuge zur Überdeckungsanalyse ausgetestet werden.
Eignung: Masterarbeit
[1] https://doi.org/10.1016/j.entcs.2007.01.002 [2] http://www-ps.informatik.uni-kiel.de/currywiki/tools/oracle_debugger [3] https://doi.org/10.1145/1291151.1291193 [4] https://doi.org/10.1007/11506676_12
Automatische Prüfung nicht fehlschlagender Programme
Von: Michael Hanus
Programme sollten nicht abstürzen, aber sie tun es häufig trotzdem, z.B. auf Grund der Ausführungsumgebung (z.B. Zugriff auf nicht vorhandenen Dateien) oder wegen logischer Fehler (z.B. Zugriff auf das erste Element einer leeren Liste). Während man den ersten Fehlertyp nicht zur Compilezeit prüfen kann und daher z.B. mit Exception Handlern löst, können logische Fehler zur Compilezeit geprüft werden. Obwohl das Auftreten solcher Fehler im Allgemeinen unentscheidbar ist, kann man durch hinreichende Approximationen sicher stellen, dass solche Fehler nicht auftreten. Hierzu wurde in [1] ein Konzept entwickelt, das darauf basiert, bei unvollständigen Funktionen Bedingungen anzugeben, unter denen diese Funktionen nicht fehlschlagen und damit prüft, ob jeder Aufruf solcher Funktionen diese Bedingungen erfüllt. Damit kann entweder nachweisen, dass ein Programm keinen Fehlschlag zur Laufzeit produziert oder, falls dies nicht möglich ist, den Fehlschlag durch Kapselung zur Laufzeit abfängt. Zur Prüfung wurde in [1] ein SMT-Löser verwendet, um auch komplexere arithmetische Funktionen zu prüfen.
In dieser Arbeit sollen diese Ideen zu einem Werkzeug weiterentwickelt werden, um reale Anwendungen als fehlerfrei nachzuweisen. Hierzu kann das existierende Werkzeug verwendet werden, es soll aber auch weiterentwickelt werden:
- Beschreibung von Nichtfehlschlagsbedingungen mittels regulärer Typen, die direkt (ohne SMT-Löser) prüfbar sind.
- Nutzung des SMT-Löser nur für nicht-reguläre Typen, z.B. primitive Integer
- Berücksichtigung von Kapselungsoperatoren
- Überprüfung kompletter Module und Anwendungen
(falls
main
nicht fehlschlägt, ist die Anwendung sicher)
[1] http://dx.doi.org/10.1145/3236950.3236957
Kompakte Repräsentation von Datentermen
Von: Michael Hanus
Viele Daten werden häufig in Baum- oder Termstrukturen dargestellt, um diese z.B. zwischen verschiedenen Systemen auszutauschen, wie z.B. die populären Austauschformate JSON und XML zeigen. Auch bei deklarativen Sprachen dienen Datenterme als Schnittstellen zwischen verschiedenen Programmkomponenten. Z.B. transformieren Compiler Quellprogramme in abstrakte Syntaxbäume oder Zwischencode, Programmanalysatoren stellen Analyseergebnisse als Termstrukturen dar u.v.m. Zur dauerhaften Speicherung dieser Daten oder zum Austausch dieser zwischen unterschiedlich implementierten Programmkomponenten werden diese Daten in einer einfach lesbaren textuellen Darstellung verarbeitet. Das Schreiben und Lesen dieser Daten kann bei großen Datenmengen oder Quellprogrammen viel Zeit kosten. Aus diesem Grund soll in dieser Arbeit eine kompakte Datenrepräsentation entwickelt werden, wodurch viele darauf basierenden Werkzeuge (Compiler, Analysatoren, etc) deutlich beschleunigt werden können.
Zur einfachen Nutzung dieser kompakten Datenrepräsentation für in Curry implementierte Programme soll ein Werkzeug entwickelt werden, das aus gegebenen Curry-Programmen mit Datendefinitionen automatisch Operationen zum Schreiben und Lesen der kompakten Darstellung generiert. Erste manuelle Test zeigen, dass damit die Geschwindigkeit um den Faktor 100 bis 200 gesteigert werden kann. In dieser Arbeit sollen verschiedene Möglichkeiten realisiert und praktisch evaluiert werden. Hierbei kann auf existierende Werkzeuge zur Verarbeitung von Curry-Programmen, wie z.B. AbstractCurry [1] aufgesetzt werden.
Eignung: Bachelorarbeit
[1] https://www-ps.informatik.uni-kiel.de/~cpm/pkgs/abstract-curry.html
Übersicht über Erweiterungen von Haskells Typsystem mit deren Eigenschaften
Von: Kai Prott
Der GHC ist die de-facto Standardimplementierung von Haskell und ist in den letzten Jahren immer um einige Features erweitert worden. Dabei sind einige dieser Erweiterungen für das Typsystem von Haskell gedacht. Während im Typsystem vom 2010er Haskell Standard immer* ein allgemeinster Typ inferiert werden kann, gilt dies mit einigen Erweiterungen jedoch nicht. Auch Andere Eigenschaften wie Entscheidbarkeit und Terminierung gehen bei manchen Spracherweiterungen verloren. In dieser Arbeit soll ein zusammenfassender Überblick über die Typsystem Erweiterungen in Haskell mit ihren Eigenschaften gegeben werden. Dabei sollen auch einige Beweise geführt werden, wobei viele dieser Eigenschaften an verschiedenen Stellen schon bewiesen wurden. Eine neue Eigenschaft zu beweisen ist für eine Bachelorarbeit nicht unbedingt erforderlich
Eignung: Bachelorarbeit/Masterarbeit
*: Außer bei polymorpher Rekursion.
Experimentelle Evaluation eines GHC-Plugins für die Erstellung von DSLs
Von: Kai Prott
Kürzlich wurde auf Basis eines GHC-Plugins prototypisch ein Compiler für die funktional-logische Programmiersprache Curry erstellt. [1] Dieses Plugin wurde dann für andere monadisch modellierbare Sprachen verallgemeinert. Im Zuge dieser Arbeit soll eine “domain specific language” (DSL) mithilfe des Plugins entwickelt werden. Die Semantik der DSL ist noch nicht festgelegt und kann bei Bedarf abgesprochen werden. Interessant ist dabei auch, herauszufinden an welchen Stellen im Plugin eventuelle Änderungen gemacht werden müssen, um die Nutzbarkeit für andere DSLs zu verbessern.
Eignung: Bachelorarbeit/Masterarbeit
[1] https://www.informatik.uni-kiel.de/~mh/lehre/abschlussarbeiten/msc/Prott.pdf
Eigenschaftsbasiertes Testen von Programmeigenschaften
Von: Michael Hanus
Mit CurryCheck [1] steht ein Werkzeug zur Verfügung, mit dessen Hilfe nicht nur Unit-Tests, sondern auch komplexere Programmeigenschaften der deklarativen Programmiersprache Curry automatisiert getestet werden können. Es wird verwendet, um täglich die Korrektheit von Curry-Distributionen und den zur Verfügung stehenden Paketen [2] zu testen. Inbesondere werden auch komplexere Eigenschaften, wie Vor- und Nachbedingungen automatisiert getestet. In dieser Arbeit soll der automatisierte Test weiterer Eigenschaften, wie z.B. Klassengesetze, umgesetzt werden, um die Zuverlässigkeit der zur Verfügung stehenden Pakete zu erhöhen.
Eignung: Bachelorarbeit
[1] https://www.informatik.uni-kiel.de/~mh/papers/LOPSTR16.html [2] https://www-ps.informatik.uni-kiel.de/~cpm/
Implementierung eines einfachen 3D-Druck-Slicers mittels deklarativer Techniken
Von: Niels
Slicer wie PrusaSlicer [1] oder Cura [2] übersetzen ein 3D-Modell in Maschinenanweisungen, ähnlich einem Compiler, der ein Programm in Maschinenanweisungen übersetzt. In dieser Arbeit soll ein einfacher Slicer mittels deklarativer Techniken implementiert werden und daraufhin untersucht werden, ob sich gängige (Optimierungs-)Techniken aus dem Übersetzerbau auf die Erzeugung von Maschinenanweisungen für 3D-Drucker übertragen lassen.
Eignung: Bachelorarbeit/Masterarbeit
[1] https://github.com/prusa3d/PrusaSlicer [2] https://github.com/Ultimaker/Cura
Refactoring-Tool für Curry
Von: Michael Hanus
Beinhaltet:
- Sichere Quellcodetransformationen
- Aufbauend auf Syntaxbäumen mit Positionsinformation und Pretty Printing
Eignung: Masterarbeit
Web-Baukasten für Curry
Von: Michael Hanus
Beinhaltet:
- Definition grundlegender Datenstrukturen: Request, Response, …
- Implementierung von Zugriffsfunktionen auf einzelne Teile, z.B. die Parameter im Query String oder im Request Body
- Entwicklung eines CGI-Servers
- Entwicklung eines FastCGI-Servers
- weitere Middleware wäre auch möglich
- Session Handling
- Routing/Dispatcher
- Anbindung von HtmlCGI/Spicey?
Eignung: Bachelorarbeit
Curr(y)gle 2.0
Von: Kai
Curr(y)gle ist eine Suchmaschine für Curry-Bibliotheken und deren Definitionen nach dem Vorbild von Hoogle [1], eine Suchmaschine aus der Haskell-Community.
Eignung: Bachelorarbeit
[1] https://www.haskell.org/hoogle/
Verbesserung der Arithmetik für KiCS2
Von: Michael Hanus
Beinhaltet:
- Umstellung der Int-Darstellung im Laufzeitsystem auf Haskell-Integer
- Unterstützung von Short_Int, semantisch: type Short_Int = Integer
- Compiler-Transformation: falls explizit Short_Int angegeben, nutze Int auf Haskell-Ebene
- generiere Code für unboxed values, um effiziente rein funktionale Berechnungen zu erzeugen (z.B. durch Ideen aus [1])
Eignung: Masterarbeit
[1] http://doi.acm.org/10.1145/2505879.2505881
Visualisierung von Rewriting/Narrowing-Berechnungen
Von: Michael Hanus
Beinhaltet:
- Visualisierung von Berechnungen als weitere Tools
- Webbasiertes Auswertungstool (Implementierung z.B. mit Purescript [1] für die Clientseite und Curry-basierter Server)
Eignung: Bachelorarbeit (oder mit weiteren Themen evtl. Masterarbeit)
[1] http://www.purescript.org/
Debugging mittels CooSy / BIO für KiCS2
Von: Michael Hanus
Beinhaltet:
- existierende BIO-Implementierung von KiCS [1] auf KiCS2 übertragen
- Neukonzeption der Sourcecode-Positions im Frontend
Eignung: Masterarbeit
[1] http://www-ps.informatik.uni-kiel.de/currywiki/tools/oracle_debugger
Übersetzung FD-Constraints nach SAT
Von: Michael Hanus
Beinhaltet:
- Erweiterung der Masterarbeit von Sven Hüser
- Integration verschiedener SAT-Solver (z.B. Lingeling, Z3) über die von Sven Hüser entwickelten Schnittstellen
- Übersetzung von FD-Constraints in das DIMACS-Format
Eignung: Masterarbeit
[1] https://www.informatik.uni-kiel.de/~mh/lehre/abschlussarbeiten/msc/hueser.pdf
Terminierungsanalyse für Curry
Von: Michael Hanus
Beinhaltet:
- Implementierung von Terminationsprüfern in Curry (mittels CASS)
- auch: Übersetzung nichtterminierender als partielle Funktionen mit Schrittzähler
Eignung: Bachelorarbeit (oder mit Erweiterungen auch Masterarbeit)
[1] http://www2.tcs.ifi.lmu.de/~abel/foetus.pdf [1] http://www.cs.mcgill.ca/~dthibo1/papers/termination.pdf
Übersetzung von Curry-Programmen nach Coq, Why3
Von: Michael Hanus
Beinhaltet:
- analog zur existierenden Agda-Übersetzung
- Beweis nichtdeterministier Berechnungen
- Vergleich Agda/Coq
Eignung: Bachelorarbeit/Masterarbeit
Weitere Abschlussarbeiten:
Abschlussarbeiten mit anderen Kooperationspartnern sind (auch auf eigene Initiative) möglich. Hierzu sollte man Michael Hanus kontaktieren.