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). | ||
