summaryrefslogtreecommitdiff
path: root/implementation.tex
diff options
context:
space:
mode:
authorGregor Kleen <gkleen@yggdrasil.li>2019-05-30 12:18:08 +0200
committerGregor Kleen <gkleen@yggdrasil.li>2019-05-30 12:18:08 +0200
commitf4c419b9ddec15bad267a4463f0720d6e28042d2 (patch)
tree54a0259116476150247619c4410eae33f8669314 /implementation.tex
parent8afbe1f7df24034dd16fdf2e89b0665b2318ae2a (diff)
downloadincremental-dfsts-f4c419b9ddec15bad267a4463f0720d6e28042d2.tar
incremental-dfsts-f4c419b9ddec15bad267a4463f0720d6e28042d2.tar.gz
incremental-dfsts-f4c419b9ddec15bad267a4463f0720d6e28042d2.tar.bz2
incremental-dfsts-f4c419b9ddec15bad267a4463f0720d6e28042d2.tar.xz
incremental-dfsts-f4c419b9ddec15bad267a4463f0720d6e28042d2.zip
Further work
Diffstat (limited to 'implementation.tex')
-rw-r--r--implementation.tex89
1 files changed, 89 insertions, 0 deletions
diff --git a/implementation.tex b/implementation.tex
new file mode 100644
index 0000000..f5e5e58
--- /dev/null
+++ b/implementation.tex
@@ -0,0 +1,89 @@
1Im Rahmen dieser Arbeit haben wir die in den vorherigen Abschnitten beschriebenen Verfahren und Konstruktionen in Haskell implementiert.
2
3Es hat sich hierbei die oben beschriebene Konstruktion von $\Lleftarrow$ als Komposition algebraischer Transformationen und generischer, wohlbekannter, Algorithmen (Breitensuche auf einem beliebigem Graph) ergeben.
4Unsere vorherigen Versuche $\Lleftarrow$ in einem imperativeren Stil zu implementieren blieben Erfolglos; größte Schwierigkeiten hat bereitet die diversen Randbedingungen (Anfangs- und Endzustand, zu produzierende Ausgabe) innerhalb des Algorithmus zur Breitensuche zu wahren.
5
6\subsubsection{Struktur der Implementierung}
7
8Die Implementierung ist aufgeteilt in zwei Stack\footnote{\url{https://haskellstack.org}}-Pakete: \texttt{edit-lens} und \texttt{interactive-edit-lens}.
9
10Die Module innerhalb von \texttt{edit-lens} entsprechen im wesentlichen den Sektionen dieser Arbeit:
11\begin{description}
12\item[Control.Edit]
13 Definition von Moduln
14\item[Control.Lens.Edit]
15 Definition von zustandsbehafteten Monoidhomomorphismen und, damit, edit-lenses sowohl als Typklasse als auch als existentiell quantifizierter Datentyp
16\item[Control.Edit.String]
17 Eine simple edit-Sprache auf Strings
18\item[Control.Edit.String.Affected]
19 Ein Algorithmus um die von einem edit aus \textbf{Control.Edit.String} betroffene Stelle in einem String einzuschränken
20\item[Control.FST]
21 Datentyp, schrittweise-, und vollständige Auswertung und die algebraischen Konstruktionen aus $\Lleftarrow$ für finite state transducer
22\item[Control.DFST]
23 Datentyp, schrittweise-, und vollständige Auswertung sowie Umwandlung zu einem FST für deterministische finite state transducer
24\item[Control.Lens.Edit.ActionTree]
25 Das beschriebene Verfahren zur Darstellung eines beliebigen DFST als edit-lens für jene edit-Sprache
26
27 Es ist hierbei jedoch der konkrete Typ der Wirkung und das Suchschema für $\Lleftarrow$ als Typklasse abstrahiert
28\item[Control.DFST.Lens]
29 Konkrete Anwendung von \textbf{Control.Lens.Edit.ActionTree} auf DFSTs
30\end{description}
31
32\texttt{edit-lens} enthält zudem eine rudimentäre suite von Tests, die die Korrektheit der FST- und DFST-Implementierung, sowie den Algorithmus zum Anwenden von String-Edits prüft.
33
34\texttt{interactive-edit-lens} besteht aus nur drei Modulen:
35\begin{description}
36\item[Interact]
37 Implementierung des interaktiven Editors als TUI\footnote{\url{https://hackage.haskell.org/package/brick-0.47}}
38\item[Interact.Types]
39 Unterliegende Datentypen für \texttt{Interact}
40\item[Main]
41 Aufruf von \texttt{Interact} und Implementierung der angebotenen DFSTs
42\end{description}
43
44\subsubsection{Verwendung des interaktiven Editors}
45
46\begin{figure}[h]
47 \begin{center}
48 \includegraphics{screenshot}
49 \caption{Der interaktive Editor (im Modus \texttt{json-newl}) nach import einer kleinen JSON-Datei}
50 \end{center}
51\end{figure}
52
53Der interaktive editor kann von der Befehlseingabe gestartet werden wie folgt:
54\begin{lstlisting}[language=bash]
55 $ stack build
56 $ stack exec interact <dfst
57\end{lstlisting}
58Hierbei ist \texttt{<dfst>} einer der in \texttt{Main} implementierten DFSTs:
59
60\begin{description}
61\item[linebreak]
62 Wandelt Zeilenumbrüche und Leerzeichen ineinander um, sodass alle Zeilen mindestens 80 Zeichen enthalten
63\item[json-newl]
64 Normalisiert Whitespace in einem JSON\footnote{\url{https://de.wikipedia.org/wiki/JSON}}-String.
65 JSON ist nicht regulär; Es lassen sich Klammern nicht prüfen und Einrückung nicht in Abhängigkeit der Verschachtelung implementieren
66\item[alternate]
67 Akzeptiert Strings gerader Länge, jeder zweite Buchstabe wird in den entsprechenden Großbuchstaben umgewandelt und verdoppelt
68\item[id]
69 Identität-DFST
70\item[double]
71 Verdoppelt jedes Zeichen
72\end{description}
73
74Alle DFSTs (außer \texttt{json-newl}) akzeptieren nur lateinische Buchstaben, Leerzeichen und das Ausrufezeichen.
75
76Der Text auf beiden Seiten kann frei bearbeitet werden.
77Hierbei wechselt \texttt{tab} zwischen den Seiten.
78
79\texttt{ctrl + p} setzt die Propagation aus, bis sie mit \texttt{ctrl + p} wieder eingeschaltet wird.
80Auf der Konsole werden hinterher Zeitmessungen der ersten Propagation nach dem Wiedereinsetzen ausgegeben.
81
82\texttt{ctrl + o} öffnet eine interaktive Dateiauswahl (\texttt{/} veranlasst eine Suche, \texttt{return} bestätigt die Auswahl).
83Nach Auswahl wird der Inhalt der Datei am Cursor eingefügt.
84
85\subsubsection{Performance}
86
87Bei der Implementierung wurde nicht auf Performance geachtet.
88Es ist daher die Laufzeit des interaktiven Editors bereits bei kleinen Eingabe inakzeptabel lang (mehrere Sekunden für ein Kilobyte JSON).
89Es lässt sich allerdings der Speedup beim Propagieren kleiner edits gut beobachten; die Propagation eines ein-Buchstaben-edits nach rechts ist ca. einen Faktor 200 schneller als das komplett neue Parsen einer Datei (ca. ein Kilobyte JSON).