Programmiersprachen
LVA 185.208, VL 2.0, 2010 S
3. Übungsaufgabe
Überblick:
Entwickeln Sie ein
Workflow-Werkzeug
zur automationsgestützten Bearbeitung vieler Dateien nach einem festlegbaren einheitlichen Schema.
Schreiben Sie einige Programmteile (zumindest einen) in einer stark typisierten Sprache wie C, C++, Java, Haskell, ... und andere Teile (ebenfalls zumindest einen) in einer dynamisch typisierten Scripting-Sprache wie Perl, Python, PHP, Ruby, ..., sodass Sie wo sinnvoll von statischen Typüberprüfungen profitieren können, andererseits aber unnötige Einschränkungen durch Typen vermeiden.
Daneben können Sie auch Shell-Scripts verwenden.
Das Workflow-Werkzeug:
Dieses Werkzeug soll einen in einer Konfigurationsdatei festgelegten Workflow abarbeiten und dabei vorgegebene Programme auf Dateien anwenden, die einem vorgegebenen Muster entsprechen.
Folgende Aktionen sollen in der Konfigurationsdatei festlegbar sein:
- Eine primitive Aktion ruft ein Programm auf bzw. setzt ein (Unix-)Kommando ab, möglicherweise mit Argumenten, die auch benannte Teile eines Musters enthalten.
Die Ausführung einer primitiven Aktion ist erfolgreich, wenn der Programmaufruf mit dem Wert 0 terminiert, sonst ist sie gescheitert.
Alle anderen (= nicht-primitiven) Aktionen erweitern oder kombinieren einfachere Aktionen.
- Eine Sequenz besteht aus mehreren Aktionen, die in der gegebenen Reihenfolge hintereinander ausgeführt werden.
Wenn eine Ausführung einer Aktion scheitert, werden die weiteren Aktionen nicht mehr ausgeführt, und die Ausführung der Sequenz gilt als gescheitert, sonst als erfolgreich.
- Eine Mengen-Aktion besteht aus einem Muster und einer Aktion.
Das Muster spezifiziert eine Menge von Dateien (siehe unten), und die Aktion wird für jede Datei in der Menge in beliebiger Reihenfolge einmal ausgeführt.
Falls eine Ausführung der Aktion scheitert, wird die Aktion auf keine weitere Dateien mehr angewandt, und die Ausführung der Mengen-Aktion gilt als gescheitert.
- Eine Schleife beinhaltet eine Aktion, die ständig wiederholt ausgeführt wird, solange die Ausführung der Aktion erfolgreich ist und dabei zumindest eine primitive Aktion ausgeführt wird.
Die Ausführung einer Schleife terminiert nur dann erfolgreich, wenn die Aktion nur aus Mengen-Aktionen besteht deren Muster in einem Durchlauf keine Dateien spezifizieren.
- Eine Fehlerbehandlung kombiniert zwei Aktionen A und B.
Falls die Ausführung von A erfolgreich ist, ist auch die Ausführung der ganzen Fehlerbehandlung erfolgreich, und B wird nicht ausgeführt.
Falls aber die Ausführung von A scheitert, wird B ausgeführt, und die Fehlerbehandlung ist genau dann erfolgreich, wenn die Ausführung von B erfolgreich ist.
Muster in Mengen-Aktionen sollen Pfade im Dateisystem darstellen, die benannte Wildcards enthalten können.
Beispielsweise könnte
Bilder/2010-04-$tag$/$name$.jpg
für alle Dateien entsprechend dem Unix-Pfad
Bilder/2010-04-*/*.jpg
stehen, wobei
%tag%
und
%name%
im Argument einer primitiven Aktion oder im Muster einer anderen enthaltenen Mengen-Aktion für die beiden Zeichenketten stehen, die im Unix-Pfad durch die beiden Wildcards (*) dargestellt werden.
Die genaue Syntax für Muster (so wie in diesem Beispiel oder anders) sollen Sie selbst festlegen, genauso wie die Syntax zur Festlegung von Workflows in der Konfigurationsdatei.
Ein Workflow ist in gewisser Weise ein einfaches Programm mit bedingten Anweisungen und Schleifen.
Ihre Aufgabe besteht also darin, die Syntax und einige semantische Details der Sprache festzulegen und einen einfachen Interpreter dafür zu implementieren.
Bitte halten Sie Syntax und Semantik tatsächlich so einfach, dass Sie die Aufgabe leicht ohne spezielle Compilerbau-Werkzeuge lösen können.
Anwendungsbeispiele:
Obige Beschreibung des Workflow-Werkzeugs ist sehr abstrakt gehalten.
Hier werden einige Anwendungsbeispiele angerissen, die den Zweck klarer umschreiben und auch als Testfälle dienen können.
- Das Werkzeug überprüft in regelmäßigen Abständen, ob neue Dateien in einem Eingangs-Ordner erstellt wurden, verschiebt Dateien mit bestimmten Endungen im Namen in entsprechende andere Ordner, und führt ein Protokoll über alle verschobenen Dateien.
- Angenommen, Sie sollen mehrere Texte, die Sie von Kollegen per Mail bekommen und in einem Verzeichnis abgelegt haben, zu einer Einheit zusammenfügen.
Das Werkzeug kann Sie dabei unterstützen, indem es aus jeder Datei alle mit
From:
, To:
und >
beginnenden Zeilen mit Hilfe eines Skripts entfernt, die geänderten Dateien nacheinander in einem Editor für weitere Korrekturen öffnet, die korrigierten Dateien zu einer großen Datei zusammenfasst, und schließlich die zusammengefasste Datei im Editor anzeigt.
- Das Werkzeug erstellt für alle Bilder in einem Ordner je zwei Kopien in unterschiedlichen Größen in anderen Ordnern und fügt für jedes Bild eine passende Zeile in eine bestehende HTML-Datei ein, sodass die Bilder in einer Übersichtstabelle und im Detail auf einem Web-Browser betrachtet werden können.
Diese Beispiele zeigen einerseits, dass es zahlreiche Einsatzmöglichkeiten gibt, andererseits aber auch, dass der Einsatz sehr oft spezielle Scripts bzw. Programme als primitive Operationen benötigt.
Suchen Sie eine gute Antwort auf die Frage, mit welchen Werkzeugen und Programmiersprachen solche Scripts bzw. Programme am einfachsten zu erstellen sind.