Entwicklung des Model Interchange Formats

Kapitel 2: Die MIFoGenese

Die Entwicklung es Model Interchange Formats (MIF) begann im April 1994. Schon damals war die Idealvorstellung von einem Austauschformat, daß es vom Verwalten der Substanzdatenparameter bis zur Risikoabschätzung verwendbar sein sollte (Beim Projektvortrag wurde an dieser Stelle eine Orginalzeichnung von Herrn Matthies präsentiert.).

2.1: [Phase 1] Planung

2.1.1: Entwicklung der Anforderungen

Erste Anforderungen an das MIF:

Neben diesen recht allgemeinen Anforderungen, muß sich das MIF speziell für die zu lösenden Aufgaben eignen.

Welche Aufgaben sind eigentlich im Bereich von Implementationen von Expositionsmodellen von einem Austauschformat zu übernehmen?

Die nächste Abbildung zeigt, welche Daten fließen, wenn ein Datensatz zu einer Substanz mit Hilfe einer Abschätzfunktion ergänzt wird. Zum Beispiel könnte das Molgewicht der Substanz aus der schon bekannten Summenformel, unter zu Hilfenahme eines Periodensystems, errechnet werden. Nach Einsatz eines Programms, welches die Abschätzung durchführt, werden die ursprünglichen Daten an verschiedenen Stellen ergänzt.

Falls Eingabe und Ausgabe über Dateien erfolgt, ist es eine gute Idee, wenn die Resultatdatei wieder dem gleichen Format entspricht. Verschiedene Abschätzungen können so hintereinander durchgeführt werden.

Kommen wir nun zu dem Durchführen einer Modellrechnung. Eingangsdaten sind eine oder mehrere Substanzen und die Modellparameter.

Das Ergebnis enthält ebenfalls alle Eingangsdaten, sowie die Modellergebnisse. Dabei kann es sein, daß wiederum interne Abschätzfunktionen verwendet wurden.

Schwierig ist an dieser Stelle natürlich die Abgrenzung zwischen Modellparametern und Eigenschaften der Substanzen. Auch eine genaue Trennung von Modellen und Abschätzfunktionen ist so nicht möglich (Das Vorgehen bei CemoS wird kurz in der dortigen MIFDOK.TXT erklärt. ).

Die Resultatdaten eines Modellaufes gehören in natürlicher Weise zu den jeweiligen Parametern. Es ist ja durchaus möglich, mehrere Modelle oder mehrmals Modelle mit anderen Parametern laufen zu lassen. Dies kann auch für ein Ergebnis wichtig sein, wie zum Beispiel bei einer Sensitivitätsanalyse.

Die letzte Grafik stellt dar, wie verschiedene Eingangsdaten genutzt werden, um ein Gesamtergebnis zu erstellen. Als Beispiel dient eine Risikoabschätzung.

Das Endergebnis mit allen Zwischenergebnissen sollte anhand einer Resultatdatei nachvollziehbar sein.

Unser Austauschformat muß also die jeweiligen Eingangs- und Ausgangsdaten speichern können. Bei der obigen Darstellung sind schon einige Schwerpunkte gesetzt. Die Gruppierung der Daten erfolgt nach bestimmten Abschnitten, die Zusammengehörigkeit anzeigen. Weiterhin führt der Wunsch nach einem transparentem Resultat dazu, daß alle Eingangsdaten behalten werden müssen.

Der Einsatz verschiedener Programme führt uns zu weiteren Anforderungen:

2.1.2: Design des Formats

Wie sollte ein neues Format also aussehen?

Schon die Forderung nach Lesbarkeit brachte mich auf die Idee ein Textformat zu wählen. Technischen Inkompatibilitäten verschiedener Rechner und Programme bei binären Formaten wurde auf diese Weise gleich ausgewichen. Textdateien lassen sich für jedes Computersystem zumindest umwandeln und bei Zahlen, die als String gespeichert werden, gibt es erstmal keine Beschränkungen.

Um das Format leicht weiterverarbeiten zu können und es für einen Menschen leicht lesbar zu lassen, enthält jede Zeile eine Einrückung und ein Schlüsselwort. Als Trennzeichen zwischen Teilen einer Zeile wählte ich das Semikolon. In der selben Tiefe eingerückte Zeilen beziehen sich jeweils auf die letzte, um eine Stufe weniger eingerückte Zeile.

Gemäß den Anforderungen ergaben sich drei verschiedene Abschnittypen für das MIF, für die Schlüsselworte erfunden wurden:

Nach den Schlüsselworten folgen auf der Zeile die verschiedenen Daten. Beispielsweise bei substdat ist das der Substanzname und bei substdatchar die Bezeichnung der Eigenschaft, der Status, der Wert und die Einheit.

Die bis jetzt genannten Schlüsselworte kommen alle ohne Einrückung aus. So wird ermöglicht, auch nur einzelne Daten, wie z.B. nur eine Eigenschaft einer Substanz, via MIF auszutauschen.

Die eingrückten Zeilen sollen die gewünschte Funktionalität erbringen. Kommentare und Abhängigkeiten an fast jeder Stelle. Weiterhin Tabellen, Bilanzen und Texte.

Betrachen wir ein paar Beispiele:

Dies letzte Beispiel soll einen Eindruck von der Syntax des Formates geben. Für eine genauere Beschreibung, siehe ebenfalls die Datei MIFDOK.TXT in der CemoS Distribution. An dieser Stelle ist nicht genug Raum für die Vorstellung der Feinheiten.

Anhand des letzten Beispiels ist nochmals zu erkennen, daß mensch sich meist nicht für alle Daten, die einem Programm bekannt sind in voller Genauigkeit interessiert. Später, wenn ein Wert unklar ist und genau nachvollzogen werden soll, ist dies aber von größter Bedeutung.

Im nächsten Kapitel wird die Implemtation eine Compilers beschrieben, mit dem die Daten einer MIF-Datei so extrahiert werden können wie gerade nötig.

Was tut mensch nach dem Erstellen einer Formatspezifikation?

Er entwickelt die Formatdefinition. Dazu wurden mehrmals Ausgabedateien im MIF "per Hand" geschrieben und ein Referenzerkenner entwickelt. Dies ist ein iterativer Prozeß; die Formatdefinition und der Referenzerkenner verbessern sich dabei gegenseitig. Die oben präsentierten Beispiele entsprechen schon dem Ergebnis (Neben der offensichtlich didaktischen Schwäche, wäre es für mich sowieso nicht möglich die Entwicklung von der Rohform des MIF an zu beschreiben.).

2.2: [Phase 2] Implementation des Compilers

Ein Referenzcompiler zum MIF mußte her. Einmal, um die Syntax (und einen Teil der Semantik) automatisch überprüfen zu können. Aber am wichtigsten ist es den Inhalt einer MIF-Datei in verschiedene Formen zu bringen. Zum Beispiel zum Ausdrucken und Lesen durch Menschen oder für das Plotten von Wertetabellen. Dabei werden die ursprünglich vollständigen Informationen in der MIF-Datei meist reduziert.

Also begann ich mit der Implementation dieses Compilers in der vorlesungsfreien Zeit des Sommersemesters 1994.

Aus folgenden Überlegungen heraus entschied ich mich die Programmiersprache AWK zu verwenden.

  1. Die Umwandelungen der Daten in einer MIF-Datei erfordern oft Rechnungen (Beispiel: Das Umwandeln von Werten in andere Einheiten). In meiner Vorstellung sollte sich die Ausgabe in AWK realisieren lassen, nachdem ein vorgefertigter AWK-Teil das Einlesen und Prüfen der Daten übernimmt.
  2. In AWK lassen sich String relativ leicht manipulieren. Sehr genaue Zahlen können notfalls als Strings verarbeitet werden. AWK kennt nur assoziative Felder, die als Indizes Strings verwenden. Dies sollte zu einem einfachen Abrufschema der eingelesenen Daten führen.
  3. Die Programmiersprache AWK ist eine Interpretersprache, die in freien Implementationen auf praktisch allen Rechnerplattformen gleich funktioniert. Zudem ist für die Entwicklung eines AWK-Programmes nur der Interpreter nötig und keine Bibliotheken, Hilfsprogramme, usw.

Ich begab mich auf die Suche nach einer AWK Implemenation, um einer frühen Designentscheidung in der CemoS Entwicklung Rechnung zu tragen. CemoS sollte ohne erweiterten Speicher selbst auf einem XT laufen. Fündig wurde ich mit Mike Brennans AWK (Der mawk erwies sich sogar als schneller als die damaligen gawks.), genannt MAWK, Version 1.14. Er mußte mehrmals recompiliert werden, um die Datensektion an die Größe des MIF Compilers anzupassen.

Entwickelt habe ich unter UN*X. Der original MIF-Compiler erhielt den Namen scan.awk. Der Quellcode wurde mit Hilfe des Revision Control Systems(RCS) verwaltet. Dieses System speichert alle vorgenommenen Änderungen und ermöglicht es alte Versionen wiederherzustellen. Bei Softwareentwicklungen im Team empfehle ich ein solches Werkzeug dringenst.

Hier nun ein Ausschnitt aus dem Log, anhand welchem sich die Entwicklung ablesen läßt:

RCS file: RCS/scan.awk,v Working file: scan.awk head: 1.25 branch: locks: strict access list: breiter jwagner symbolic names: keyword substitution: kv total revisions: 25; selected revisions: 25 description: awk-script to scan the CemoS Exchange Format (it shall hold all information in memory) ---------------------------- revision 1.25 date: 1995/10/04 13:11:51; author: breiter; state: Rel; lines: +37 -30 typo fixed; the var SEPARATOR is now used; some comments improved ---------------------------- revision 1.24 date: 1995/07/04 11:02:39; author: breiter; state: Stab; lines: +21 -3 added check of existence to getvalue() substancechar are not translated if they are not in the stdnames files and will appear in brackets in the output. ---------------------------- revision 1.23 date: 1995/02/06 18:17:29; author: breiter; state: Stab; lines: +7 -4 fixed very small typing bug in getmodel() ---------------------------- revision 1.22 date: 1995/01/14 17:32:35; author: breiter; state: Exp; lines: +9 -3 (bug fix: 'combined' and 'separate' are now local in allnames() !) ---------------------------- revision 1.21 date: 1995/01/10 13:42:09; author: breiter; state: Exp; lines: +19 -7 bug fixed that caused the loss of the cake unit using setcake(). (changed few things in the standard output section threrefor..) added an user BEGIN section (with line-marker). ---------------------------- revision 1.20 date: 1995/01/03 15:46:16; author: breiter; state: Exp; lines: +132 -3 added marker for replacing the outputsection and inserting user-functions. added sdtnames support; the Var STDNAMES_FILENAME can contain the filename on start up. the SUBSTDATCHARs are transferred for example ---------------------------- revision 1.19 date: 1995/01/03 13:15:33; author: breiter; state: Exp; lines: +228 -49 full support of item 'modelinputtable' added. (fixed bugs) ---------------------------- revision 1.18 date: 1995/01/02 17:00:43; author: breiter; state: Exp; lines: +540 -274 fixed typing bug in allnames(), the resultarray gets deleted now !!! all output is done with the "ouput-functions". added a bunch of output functions ---------------------------- revision 1.17 date: 1994/12/19 18:36:02; author: breiter; state: Exp; lines: +111 -51 function allnames() could not handle the comments of double indexed items! the last argument when ask for such comments is now the indexnumber of the indexed item. function getcomsdeps() now gets comments and dependencies for any item. (it is used by getsubstdat() and getsubstdatchar() yet) ---------------------------- revision 1.16 date: 1994/12/19 15:28:37; author: breiter; state: Exp; lines: +221 -172 the scanned items are not represented literally in 'item' anymore.. this shall save some Memory on big inputfiles. ---------------------------- revision 1.15 date: 1994/12/06 12:56:39; author: breiter; state: Stab; lines: +9 -5 fixed bug in function allnames. the bug caused the return number of TABCOLs to be wrong. ---------------------------- revision 1.14 date: 1994/11/02 21:17:13; author: breiter; state: Exp; lines: +9 -3 (corrected small bug) ---------------------------- revision 1.13 date: 1994/11/02 21:13:26; author: breiter; state: Exp; lines: +52 -8 fixed typing bug in errormsg of dependency check modelnames do contain the date and the time now, so it is possible to have more than one run of one specific model in the file! added more comfort to the outputfkts getsubstdat() and getsubstdatchar(). ---------------------------- revision 1.12 date: 1994/10/31 18:13:39; author: breiter; state: Exp; lines: +80 -18 fixed bugs in the regular exprs for checking the date and time format. added code to give errormsgs when item are already known. ---------------------------- revision 1.11 date: 1994/10/28 20:34:24; author: breiter; state: Exp; lines: +276 -97 fixed and upgraded errormsgs of dependency checks. fixed another bug in the dependency checking. fixed bug in allsections() added more comfortable outputfunctions for the SUBSTDATs sections: getsubstdat(), getsubstdatchar() and printdepcoms() . ---------------------------- revision 1.10 date: 1994/09/30 12:42:35; author: breiter; state: Exp; lines: +47 -37 function allsections improved function printarray and allsubstdatchars and setaktivesubstdat added fixed small bug in dependency check ---------------------------- revision 1.9 date: 1994/09/26 16:31:16; author: breiter; state: Exp; lines: +142 -6 dependency checking added. bug with dependencies in same section fixed ---------------------------- revision 1.8 date: 1994/09/26 10:24:20; author: breiter; state: Exp; lines: +46 -7 tabcols are now saved and found "in sequence" ---------------------------- revision 1.7 date: 1994/09/23 23:20:35; author: breiter; state: Exp; lines: +367 -19 function allnames() written and modelltree is writen to stdout as example ---------------------------- revision 1.6 date: 1994/09/23 17:14:20; author: breiter; state: Exp; lines: +100 -32 TABCOLS are now saved normally, because they can have comments and dependencies. (the known MODELS and SUBSTDATS are printed to stdout) ---------------------------- revision 1.5 date: 1994/09/23 15:44:56; author: breiter; state: Exp; lines: +277 -74 saving comments,dependencies,tabcols,tablines and cakeseqs in arrays known. and it is possible to comment items saved in arrays the complete scan works now. ---------------------------- revision 1.4 date: 1994/09/22 20:14:26; author: breiter; state: Exp; lines: +47 -3 wrote enalbecomments and enabledependencies for every known item. ---------------------------- revision 1.3 date: 1994/09/22 19:47:19; author: breiter; state: Exp; lines: +217 -67 comments shall work now dependencies are saved, but not checked ---------------------------- revision 1.2 date: 1994/09/22 16:46:23; author: breiter; state: better; lines: +444 -23 few items are scanned ---------------------------- revision 1.1 date: 1994/09/20 21:37:59; author: breiter; state: Exp; Initial revision =============================================================================

Mit Erreichen von Version 1.23 am 6.2.1995 war scan.awk recht stabil. Version 1.25 vom 4.19.1995 wurde mit CemoS 1.0 "released".

Im Laufe der Zeit entwickelte ich eine Anzahl von Testskripten, die nach einer Änderung an scan.awk einige Standardfunktionalitäten überprüfen.

Als der Parser implementiert war, gab es nur eine rudimentäre Ausgabe. Diese war zwar vollständig, aber recht schlecht zu programmieren. Entgegen meiner Zielvorstellung, daß das Speichern in einem assoziativen Feld die Dinge einfach zu Programmieren mache, mußten jetzt zusätzlich Ausgabefunktionen implementiert werden. Später erkannte ich einen weiteren Nachteil. Wenn in einem assoziativen Feld Strings als Indizies verwendet werden, dann bedeutet Abrufen eines Wertes und Durchgehen des Feldes jedesmal das Suchen nach einem String, was intern wohl mit einer Hashtabelle realisiert wird. Dies ist selbstverständlich ein arger Anschlag auf Ablaufgeschwindigkeit bei großen Eingabedateien (bevor die Abarbeitung aber zu langsam wird, stößt mensch bei kleinen PCs zuerst an die Grenzen des geringen Hauptspeichers von 640KByte).

Mit Hilfe der Ausgabefunktionen ist es, gemessen an der Komplexität, relativ komfortabel eine neue Ausgabe der Daten im MIF-Format zu programmieren. Dabei wird der Standardausgabeteil von scan.awk einfach durch einen neuen ersetzt.

Hier ein schon etwas komplizierteres Beispiel, welches alle Substanzdatenabschnitte durchgeht. Jeweils alle Eigenschaften ansieht und die mit Namen mp, für Schmelzpunkt, umrechnet. Wenn also eine Zeile für eine Substanz einen Schmelzpunkt mit Einheit Kelvin hat, wird dieser in Grad Celsius umgerechnet und ausgegeben. Neben den Substanznamen und den umgerechneten Werten wird sonst nichts ausgeben.

Anzahl_der_Substanzabschnitte = allsections( Art, Substanz, SUBSTDAT_I ); for ( t=1 ; t<=Anzahl_der_Substanzabschnitte; t++ ) { print "Substanz: " Substanz[t]; setactivesubstdat( Substanz[t] ); Anzahl_Eigenschaften=allsubstdatchars( Eigenschaft ); for( i=1; i<=Anzahl_Eigenschaften; i++) { # (nicht elegant, aber einfach) if ( Eigenschaft[i] == "mp" ) { getsubstdatchar(Datum, Anzahl, Kommentar, Abhaengigkeit, "mp" ); # nur ausgeben und umrechnen, falls Schmelzpunkt # auch einen Wert hat also "known" ist # und in Kelvin ("K") angegeben ist if( Datum[I_STATUS] == "known" && Datum[I_UNIT] == "K") { print "Schmelzpunkt: " Datum[I_VALUE]-273.15 " Grad Celsius " } } } } Durch die Schleifen und Abfragen werden die gesamten Möglichkeiten des MIF verfügbar. Für das Schreiben eines neuen Ausgabeabschnittes sind auch Funktionsdefinitionen und damit eine flexible Programmierung möglich. In den Ausgabeteilen zu CemoS werden zum Beispiel Tabellen relativ aufwendig für eine Ausgabe auf einem Textbildschirm aufbereitet.

Vor der letztendlichen Fertigstellung des Compilers begann schon die Verbindung von MIF und CemoS, welche im nächsten Kapitel beschrieben wird.

2.3: [Phase 3] Anpassung an CemoS

Dieser Abschnitt beschreibt die Konzepte und Implementationen der Anpassung des MIF an CemoS. Ich werde hierbei nicht chronologisch aus der Sicht des MIF vorgehen.

Das Importieren und Exportieren in CemoS wurde hauptsächlich von Jan-Oliver Wagner und Guido Baumgarten implementiert. Es wurde auch ein Konvertierungsprogramm für Substanzdatendateien von CemoS und MIF Dateien programmiert.

2.3.1: Mehrsprachigkeit und Standardnamen

Damit eine MIF Datei über Sprachbarrieren hinaus verständlich bleibt, wurde ein Konzept für die verschiedenen Bezeichner eingeführt. Jeder Name der automatisch verarbeitet werden soll, wird sozusagen normiert. Das heißt er ist eine feststehende Abkürzung, ein Standardname.

Durch Nachsehen in einer Tabelle, kann eine textuelle Beschreibung jedes Standardnamen gefunden und angezeigt werden. Wenn die Tabelle verschiedene Sprachen enthält, sogar mehrsprachig. Für die Verarbeitungsskripte bleibt die Bezeichnung konstant.

Die Tabelle, in der die Standardnamen definiert werden, nennt sich Standardnamendatei (stdnames.sn). Das Format dieser Datei wurde von Jan-Oliver Wagner definiert und mit einem Referezscanner versehen(siehe 3.0.1.2).

Hier ein kurzer Ausschnitt, aus stdnames.sn welche mit CemoS(v1.04) erhältlich ist:

Format CemoS english deutsch mp vaSubstanceMP,sbs Melting Point Schmelzpunkt estBCF_Isnard_ws vaBCF_Isnard_ws,mod Estimation by Isnard from water solubility Absch&auml;tzung nach Isnard aus Wasserl&ouml;slichkeit Der Format Abschnitt beschreibt, die Bedeutung der Zeilen. Die erste wird für interne Zwecke von CemoS verwendet, die anderen beiden sind die deutsche und englische Übersetzung (Für die spätere Funkionalität ist die erste Zeile ohne Bedeutung und könnte weggelassen werden). Zu sehen ist ein Standardname f"ur den Schmelzpunkt und für eine Abschätzfunktion. Die Standardnamen, sollten allgemein in Absprache mit dem CemoS-Team gewählt werden, damit eine Kompatibilität zwischen sehr unterschiedlichen Programmen erhalten bleibt.

Die AWK-Scripte für die Ausgabe, welche auf dem Compiler scan.awk aufbauen, lesen also eine Standardnamendatei.

2.3.2: Ausgabeteile

Wie werden denn nun die verschiedenen Bearbeitungen mit Hilfe des Compilers durchgeführt?

Das AWK-Programm scan.awk, enthält Markierungen an Stellen, wo Teile vom Benutzer ausgetauscht werden können. Dies jeweils von Hand zu machen ist etwas zu mühsam; doinsert.bat übernimmt speziell unter M$DOS diese Aufgabe und erstellt eine Datei mit den neuen Teilen eingepflanzt scan.awk.

Anhand der folgenden Skizze läßt sich nun die Steuerung der MIF-Verarbeitung nachvollziehen:

Für die verschiedenen Aufgaben bei CemoS entwickelte ich also Ausgabeteile. Die eine Art der Ausgabeteile, enthält eine Tabelle der Standardnamen, die CemoS pro Modell ausgeben wird. Mit diesem Wissen wird die Ausgabe nach Reihenfolge der Bildschirmausgabe von CemoS formatiert. Die zweite Art glaubt an MIF-Dateien, die denen von CemoS ähnlich sind, versucht jedoch alle Standardnamen die zu finden sind auszugeben. Weiterhin gibt es einen Ausgabenteil, der sich mit der Tabellenformatierung befaßt.

cemos.awk, cemos_u.awk und c_tables.awk sind die wichtigsten AWK-Skripte für CemoS MIF-Verarbeitung und werden bereits fertig mitgeliefert. Diese Verstehen eine umfangreiche Menge von Optionen. Es waren mehrere Möglichkeiten im Gespräch die Bedienung hier freundlicher zu machen. Ein Aufruf der AWK-Skripte aus CemoS heraus scheiterte an Schwierigkeiten mit dem Betriebssytem M$DOS. Ein zusätzliches grafisches Benutzerinterface ist mit einem hohen Aufwand verbunden. Also wurden Kommandozeilenskripte geschrieben.

2.3.3: DOS-Batch Dateien

Die Möglichkeiten der DOS-Batch Sprache sind begrenzt. Mit etwas Aufwand wurden circa dreizehn Batch-Dateien für die Bedienung der MIF-Verarbeitung für CemoS implementiert.

Schwierigkeiten mit dem Kommandointerpreter COMMAND.COM, die es zu Überwinden galt:

Hier eine knappe Tabelle der Batch-Dateien, welche as dem CemoS-Handbuch stammt:

Aufstellung der Weiterverarbeitungs-Skripte =========================================== Kommando Beschreibung LIST mif Zeigt die in der MIF-Datei mif enthaltenen Tabellen an. LISTF mif ausgabe Schreibt das Ergebnis von LIST in die Datei ausgabe. L_SELECT [def] sprache Setzt die angegebene Sprache; entweder als aktuelle, oder (mit def) als Standardsprache. PLOT mif [X Y1 [...]] Die in der MIF-Datei mif zuerst gefundene Tabelle wird &uuml;ber gnuplot auf dem Bildschirm dargestellt. gnuplot muß also installiert sein. X bezeichnet die Nummer der Spalte f&uuml;r die X-Achse, Y1 bis maximal Y6 bezeichnen die auf die Y-Achse aufzutragenden Spalten. Werden X und Y nicht definiert, so ist X=1 und alle &uuml;brigen Spalten entsprechen Y1, Y2 usw. PLOTF mif [X Y1 [...]] ausgabe Schreibt das Bild, welches &uuml;ber PLOT erzeugt wurde, im Postscript-Format in die Datei ausgabe. TABLE [tab] mif Zeigt die Tabelle mit der Bezeichnung tab mit allen Kommentaren und mit einem Leerzeichen als Spaltentrenner an. Den Kommentaren ist ein Lattenzaun (#) vorangestellt. Wird tab nicht angegeben, so wird die erste gefundene ausgegeben. TABLEF [tab] mif ausgabe Schreibt die Ausgabe von TABLE in die Datei ausgabe. RAW [tab] mif Arbeitet wie TABLE, nur das alle Kommentar weggelassen werden. RAWF [tab] mif ausgabe Schreibt die Ausgabe von RAW in die Datei ausgabe. REPORT mif Erstellt einen vollst&auml;ndigen, deutschen Report der in der MIF-Datei mif beschriebenen Modellrechnung. REPORTF mif ausgabe Schreibt die Ausgabe von REPORT in die Datei ausgabe. UREPORT mif Erstellt &auml;hnlich wie REPORT einen Report der in der MIF-Datei mif vorliegenden Daten. Allerdings ist hier keine bestimmte inhaltliche Zusammensetzung, wie z.B. die von CemoS, vorausgesetzt. Es k&ouml;nnen also Reports beliebiger, das MIF einhaltende, Dateien erstellt werden. UREPORTF mif ausgabe Schreibt die Ausgabe von UREPORT in die Datei ausgabe.

Die Sprache wird mit Hilfe einer Umgebungsvariable und einer Konfigurationsdatei eingestellt. Die Texte sind in Deutsch und Englisch in jeder Batch-Datei vorhanden.

Zum Abschluß dieses Kapitels ein Bild, welches mit plotf.bat und gnuplot erzeugt wurde, da mir die im Projektkolloqium gezeigten Textausgaben an dieser Stelle zu umfangreich erscheinen. Die Grafik wurde mit dem Befehl plotf ex8_2.mif 1 2 3 plot.eps direkt als Postscriptdatei erzeugt.

CemoS Ausgabeplot via MIF mit gnuplot