diff options
Diffstat (limited to 'implementation.tex')
-rw-r--r-- | implementation.tex | 89 |
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 @@ | |||
1 | Im Rahmen dieser Arbeit haben wir die in den vorherigen Abschnitten beschriebenen Verfahren und Konstruktionen in Haskell implementiert. | ||
2 | |||
3 | Es hat sich hierbei die oben beschriebene Konstruktion von $\Lleftarrow$ als Komposition algebraischer Transformationen und generischer, wohlbekannter, Algorithmen (Breitensuche auf einem beliebigem Graph) ergeben. | ||
4 | Unsere 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 | |||
8 | Die Implementierung ist aufgeteilt in zwei Stack\footnote{\url{https://haskellstack.org}}-Pakete: \texttt{edit-lens} und \texttt{interactive-edit-lens}. | ||
9 | |||
10 | Die 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 | |||
53 | Der 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} | ||
58 | Hierbei 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 | |||
74 | Alle DFSTs (außer \texttt{json-newl}) akzeptieren nur lateinische Buchstaben, Leerzeichen und das Ausrufezeichen. | ||
75 | |||
76 | Der Text auf beiden Seiten kann frei bearbeitet werden. | ||
77 | Hierbei wechselt \texttt{tab} zwischen den Seiten. | ||
78 | |||
79 | \texttt{ctrl + p} setzt die Propagation aus, bis sie mit \texttt{ctrl + p} wieder eingeschaltet wird. | ||
80 | Auf 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). | ||
83 | Nach Auswahl wird der Inhalt der Datei am Cursor eingefügt. | ||
84 | |||
85 | \subsubsection{Performance} | ||
86 | |||
87 | Bei der Implementierung wurde nicht auf Performance geachtet. | ||
88 | Es ist daher die Laufzeit des interaktiven Editors bereits bei kleinen Eingabe inakzeptabel lang (mehrere Sekunden für ein Kilobyte JSON). | ||
89 | Es 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). | ||