MAL-Homepage Inhaltsverzeichnis



MAL Dokumentation: Konzepte




Inhalt:

1. ALLGEMEINES
2. ENTSTEHUNGSGESCHICHTE
3. DIE SPRACHE
3.1. Umgekehrt Polnische Notation
3.2. Strukturierung
3.3. Objektorientierte Programmierung
3.4. Codevariable
4. ZUKUNFTSORIENTIERTHEIT
4.1. Erweiterbarkeit
4.2. Portierbarkeit
4.3. Unabhängigkeit
4.4. Das Baukastenprinzip
4.5. Namen
5. EFFEKTIVITÄT
5.1. Interpreter oder Compiler
5.2. Der Falteditor
5.3. Versionskontrolle
5.4. Die Meta Schnittstelle
6. STANDARDISIERUNG
7. SPEICHERVERWALTUNG
8. DIE GRAPHIK
9. DREIDIMENSIONALE GRAPHIK
10. DAS POOLSYSTEM
11. MESSDATENARCHIVIERUNG
12. NEURONALE NETZE
13. DIE DOKUMENTATION
14. DATENSAMMELSYSTEM


1. ALLGEMEINES

Nach langen Überlegungen habe ich mich entschlossen, dieses Kapitel gleich zu Begin anzubringen. Es beschreibt die Bewegründe, warum die einzelnen Programmteile und Konzepte so geworden sind, wie sie sind. Ich mache das nicht, um mich für meine Arbeiten zu rechtfertigen, sondern denke, daß das Verständnis für das Warum auch das Verstehen des Wie fördert. Teilweise will ich auch versuchen, das historische Wachstum des Programms etwas zu durchleuchten.

Das Lesen dieses Kapitels ist nicht zwingend erforderlich. Es wird in den nachfolgenden Kapiteln kein Wissen vorausgesetzt, das hier vermittelt wird. Vielleicht ist es auch interessant, es erst zu lesen oder noch einmal zu lesen, wenn man mit dem System bereits vertraut ist.

Wenn man vor der Entscheidung steht, ob man das MAL-System einsetzen soll, so werden die hier erläuterten Konzepte sicher hilfreich sein, da sie einen guten Überblick über die Möglichkeiten und Grenzen, die Stärken und Schwächen des Systems bieten.

MAL-Homepage Inhaltsverzeichnis


2. ENTSTEHUNGSGESCHICHTE

Die Enstehung der einzelnen Programmteile ist natürlich nicht streng chronologisch zu ordnen. Viele Teile wurden immer wieder überarbeitet. Dennoch mag die Kenntnis der Entstehungsreihenfolge auch hilfreich beim Einarbeiten in das System sein.

Ursprünglich wurde ein befehlsgesteuertes Zeichenprogramm für einen Plotter entwickelt. Das heißt, die Grapik stellt nebst dem Interpreter den ältesten Teil des Systems dar. Für das Skalieren und Vorverarbeiten der Meßdaten waren zumindest einfache mathematische Routinen erforderlich.

Vor der Einbindung statistischer Routinen wurde das noch heute verwendete Datenformat entwickelt, das aufgrund seiner universellen und doch einfachen Struktur ein wesentliches Standbein von MAL darstellt. Zu jener Datenstruktur gehören auch etwa ein Dutzend Befehle zur Handhabung von Datensätzen.

Die erste voll unterstützte Schnittstelle für einen A/D-Wandler war für den Betrieb einer (eigens für die damals noch seltenen Labtop Computer gebauten) Einschubkarte, und wurde als Auftragsarbeit für die Firma LB-Elektronics entwickelt. Dabei entstand das heute noch verwendete Verfahren mit einem Datei-Ringpuffer mit frei definierbaren Triggermöglichkeiten. Bei dieser Gelegenheit wurden auch die ersten Elemente für das Design von Bedienoberflächen eingebaut, nämlich Menüs und Masken. Nebstbei enstand die erste vollständige MAL-Beschreibung.

Im nächsten Schritt wurde ein kleines Datenbanksystem für die Archivierung von Meßdaten eingebaut, das aber mit dem heute verwendeten nur noch das äußere Erscheinungsbild gemeinsam hat.

Nach dem Einbau von Meßroutinen für das A/D-Wandlerboard DT2801 (Data Translation) wurde das System zuerst in der Ganganalyse der Reumasonderkrankenanstalt Baden und später in der Ganganalyse des RZ-Tobelbad installiert.

Dann wurden Befehle und ein Archivierungssystem für die Handhabung von Datensätzen des Systems EMED (Druckverteilungsbilder) eingebaut.

Nach einer längeren Pause wurde dann eine komplette Neuprogrammierung, ausgelöst durch die Anschaffung einer neuen Workstation im RZ-Weißer Hof, begonnen. Bei dieser Gelegenheit wurde das ursprünglich in Pascal implementierte, nur unter MS-DOS lauffähige System in portierfähiger Weise in C++ programmiert.

Als neue Elemente kamen hinzu: das Poolsystem (ein System für die Datenarchivierung), darauf aufbauend die Folder (ein tabellenorientiertes Speicherkonzept) sowie die Metaschnittstelle (eine Schnittstelle für den Datenaustausch zwischen verschiedenen Hardware-Plattformen).

Anschließend wurde ein auf den neuen Speicherungsmöglichkeiten basierendes Meßdatenerfassungs- und -archivierungssystem entwickelt.

In Zuge einer Neuüberarbeitung des bis dahin noch nicht ganz ausgereiften Pool- und Foldersystems wurde eine logbook-basierende Versionsverwaltung, für die Unterstützung der Zusammenarbeit mehrerer Entwickler, eingebaut.

In der Folge habe ich das MAL-System für verschiedenste Projekte außerhalb der Bewegungsanalyse eingesetzt. Für die Bewegungsanalyse sind manche der Entwicklungen aber trotzdem von Bedeutung.

Die stereoskopische 3d-Darstellung und die dazugehörigen Bearbeitungsmöglchkeiten von 3d-Objekten wurden für das Projekt ´Computergestützte Herstellung von Prothesenschäften´ für das Forschungsinstitut für Orthopädietechnik entwickelt. Als Nebenprodukt wurden auch die Animationen auf dreidimensional umgebaut und mit einer vergleichbaren Handhabungsstruktur versehen.

Für das Projekt "Photogrammetric Headshape Digitizer" das in Zusammenarbeit mit der Österreichischen Akademie der Wissenschaften für das Institut für Psychologie der Universität Wien durchgeführt wurde, sind einige fotogrammetrische Funktionen (Kamerakalibrierung, Linsenentzerrung usw.) dazu gekommen, sowie ein System für Computer-Aided-Design von Polyedern.

Die graphische Bedienoberfläche für Windows und die Teile für das Objektorientierte Programmieren sind in einer längeren Projektpause entstanden.

Danach wurden wieder einige bewegungsanalytisch relevante Teile auf der Veterinärmedizinischen Universität entwickelt. Von allgemeinem Interesse sind davon eine objektorientierte Datenbank für die Archivierung von Bewegungsdaten, einige Klassen für die Handhabung von 3d Daten, Schnittstellen für das Einlesen von Daten von Fremdsystemen (Motion-Analysis und Vicon), sowie Treiber für verschiedene A/D-Wandler.

Die klinischen Befunde sowie das Datensammelsystem wurde für das NRZ-Rosenhügel entwickelt.

Schließlich hatte ich Ende 2005 durch einen längerne Krankenstand die Möglichkeit, die in der Zwischenzeit etwas veraltete Graphik auf den neuesten Stand der Technik zu bringen.

MAL-Homepage Inhaltsverzeichnis


3. DIE SPRACHE

Zu der Zeit als ich mit der Entwicklung des ersten MAL-Sprachinterpreters begonnen habe, war ich mit den folgenden Programmiersprachen gut vertraut: Assembler (Siemens AS30), Pascal und Trick (eine Siemens-interne Eigenentwicklung). Weniger vertraut, aber doch von Zeit zu Zeit gezwungen damit zu arbeiten, war ich mit Basic oder Fortran.

Selbstverständlich habe ich versucht, bei der Entwicklung von MAL die Vorzüge der mir bekannten Sprachen zu berücksichtigen. Obwohl ich damals noch nicht mit objektorientierter Programmierung vertraut war (mit C++ habe ich erst bei der letzten Überarbeitung des Systems zu arbeiten begonnen) mögen manche Lösungsansätze durchaus objektorientiert erscheinen. Vom ursprünglichen Konzept her ist MAL jedenfalls eine prozedurale Sprache, die im nachhinein um objektorientierte Teile erweitert wurde.

Den entscheidenden Anstoß für die Entwicklung einer eigenen Programmiersprache gab das Studium eines Buches über die Sprache Forth. Mich hat in erster Linie fasziniert, wie diese Sprache mit ganz wenigen Sprachelementen die in anderen Sprachen üblichen vielfältigen syntaktischen Varianten realisiert. Vereinfachung und Vereinheitlichung ist mir stets ein zentrales Anliegen gewesen.

Gleichzeitig hat Forth den Vorteil, daß es (vor allem aufgrund der einfachen Syntax) besonders leicht ist, einen entsprechenden Interpreter zu entwickeln.

Zufällig hatte ich auch die Gelegenheit das Meßdatenanalyse-System Asyst einige Zeit für Testzwecke zur Verfügung zu haben. Es basiert auch auf der Forth-Syntax und ist in diesem Punkt dem MAL-System verwandt.

MAL-Homepage Inhaltsverzeichnis


3.1. Umgekehrt Polnische Notation

MAL ist eine stackorientierte Sprache. Das bedeutet, der Datenaustausch zwischen den einzelnen Befehlen, Prozeduren usw. erfolgt über einen Stapelspeicher, den Stack.

Das bedingt, daß sich mathematisch Formeln nicht in der gewohnten Weise (zum Beispiel: 3 + 4 = ) schreiben lassen. In MAL muß man zuerst die Operanden anführen, damit sie auf den Stack gelegt werden, und anschließend die Operation aufrufen (zum Beispiel: 3 4 + . ). Diese Notationsweise nennt man die ´Umgekehrt Polnische Notation´.

Ich habe es aufgegeben, Personen, die a priori eine Abneigung gegen diese Notation haben, überzeugen zu wollen. Sie ist kürzer und effektiver aber weniger gewohnt. Es scheint mir aber wichtig darauf hinzuweisen, daß diese Ungewohntheit nur bei der Darstellung von Formeln auftritt, also nur einen Bruchteil des üblichen Programmcodes ausmacht.

Als Beispiel sei folgende Aufgabenstellung angeführt: Man möchte eine Zeitreihe von Meßdaten zuerst glätten, dann begrenzen, dann detrendieren und schließlich den Mittelwert berechnen. In MAL würde das syntaktisch etwa folgendermaßen aussehen:

daten glätten begrenzen detrendieren mittelwert

Man wird mir wohl zustimmen, daß diese Notation übersichtlicher ist als die konventionelle:

mittelwert(detrendieren(begrenzen(glätten(daten))))

MAL-Homepage Inhaltsverzeichnis


3.2. Strukturierung

MAL ist eine sehr streng strukturierte Sprache. Sie hält sich an alle von Nassi und Sneiderman gestellten Forderungen:

Außerdem unterstützt sie die Programmierung nach dem ´Black-Box-Prinzip´. Das bedeutet sinnbildlich, daß man Programmteile (nämlich Unterprogramme) so abschließen kann, daß man sie wie eine schwarze Schachtel, deren Funktion man zwar kennt, deren Inhalt einen aber nicht weiter zu interessieren braucht, verwenden kann.

Ein Unterprogramm, das streng nach dem Black-Box-Prinzip programmiert ist, funktioniert unter allen möglichen Aufrufbedingungen immer gleich. Es kann also nicht durch irgendwelche global definierten Variablen oder das Weglassen von anderen Unterprogrammen in seiner Funktion beeinträchtigt werden. Ebenso darf es nicht irgendwelche fremde Variablenwerte beeinflussen.

Voraussetzung für die Realisierung von Programmen nach diesem Prinzip ist die Möglichkeit, alle Definitionen (Variablen und Unterprogramme) lokal, also innerhalb einer Prozedur durchzuführen, wobei diese Definitionen stets eventuell gleichnamigen bereits global definierten vorzuziehen sind. Die lokalen Definitionen dürfen auch nicht über das Ende der entsprechenden Prozedur erhalten bleiben.

Die Idee zu dieser nützlichen Methode habe ich von der Programmiersprache Pascal übernommen. (In C und auch C++ ist das Black-Box-Prinzip nicht so elegant unterstützt. Es gibt keine Möglichkeit, lokale Prozeduren zu definieren.) Wohl gemerkt: man kann in MAL nach dem Black-Box-Prinzip programmiern, aber man muß nicht!

MAL-Homepage Inhaltsverzeichnis


3.3. Objektorientierte Programmierung

Es hat lange Zeit gebraucht, bis ich mich dazu durchgerungen habe, Objektorientierte Programmierung in der Sprache MAL zu ermöglichen. Das hat mehrere Gründe:

Interessanterweise war die tatsächliche Implementierung dann eine Arbeit von wenigen Tagen (abgesehen von den Raffinessen der menügesteuerten Bedienoberfläche für die Entwicklung von Klassen). Mittlerweile glaube ich zu verstehen, warum es mir so schwer gefallen ist, das OO Konzept zu begreifen: Mein Zugang zu C++ und damit auch zur Objektorientierten Programmierung war das Standardwerk von Bjarne Stroustrup ("Die C++ Programmiersprache", Addison-Wesley). Dieses Buch ist mir tatsächlich im Weg gestanden, weil es ein an sich sehr einfaches Konzept durch die Erläuterung einer Menge von programmtechnischer Details völlig undurchschaubar macht.

Der Begriff Objektorientierte Programmierung ist eine Mischung aus einem Vorstellungsmodell, einer damit verbundenen neuen Terminologie und einer neuartigen Programmstrukturierung.

Die entscheidenste Errungenschaft ist das neue Vorstellungsmodell und nicht die Programmstruktur. Die Programmstruktur hat sich bei genauer Betrachtung nur in zwei Punkten tatsächlich geändert (siehe unten).

Da wir aus der realen Welt gewohnt sind mit Objekten umzugehen, ist die Methode diese Objekte programmtechnisch nachzubilden vor allem bei komplexen Problemstellungen wirklich hilfreich. Besonders gut passt dieses Modell (und ich glaube von dorther kommt auch die Idee) bei der Programmierung graphischer Oberflächen.

Was ist also tatsächlich neu an der Programmstruktur?

Was mich überrascht hat war, daß ich für die Realisierung der Objektorientierten Programmierung in MAL nur ein einziges Wort (das Wort required) dem Interpreter hinzufügen musste, alles andere hat sich in der Sprache MAL definieren lassen. Es sind also de facto nur zwei Dinge neu:
  1. Es ist möglich mehrere Prozeduren mit unterschiedlicher Funktion und gleichem Namen zu deklarieren.
  2. Die Deklarationen der Prozeduren stehen mit den Deklarationen der von ihnen hauptsächlich verwendeten Daten in einer gemeinsamen Einheit (der Klasse).
Obwohl ich sehr gerne in C++ programmiere und diese Sprache die leistungsfähigste ist die ich kenne, stört mich an ihr die Vielfalt von syntaktischen Details, Besonderheiten und Ausnahmen, die das Erlernen und Merken der Spache so schwierig machen. Es war mir daher ein Anliegen, die Definition und Anwendung von Klassen in MAL so einfach wie möglich zu gestalten und alle unnötigen Sonderfälle wegzulassen.

MAL-Homepage Inhaltsverzeichnis


3.4. Codevariable

In der Zeit bevor ich in der Forschung zu arbeiten begann, war ich bei der Firma Siemens beschäftigt und habe dort zu einem Großteil in Assembler programmiert.

Da gab es einen Trick, der strengstens verboten war, weil er Programme einerseits unlesbar macht und andererseits auch das Testen mit dem Debugger nahezu unmöglich macht. Dieser Trick war das dynamische Verändern des Programmcodes. Also ein Programm das Programmteile des eigenen Programms (oder noch schlimmer von fremden Programmen) verändert. Das wird zum Beispiel bei den allseits so beliebten Viren verwendet.

In MAL besteht nun die Möglichkeit, diesen Trick in kultivierter, reglementierter Form anzuwenden. Codevariablen, also Variablen die Programmcode enthalten, helfen mancherorts die Übersichtlichkeit von Programmen zu erhöhen und gleichzeitig den Code zu verkürzen.

Der semantische Unterschied zwischen einer Codevariablen und einem Unterprogramm ist nur sehr gering. Im Wesentlichen beschränkt er sich auf das Lokalitätsprinzip, das ich bereits kurz bei der Erläuterung des ´Black-Box-Prinzip´ (siehe
Strukturierung) gestreift habe.

MAL-Homepage Inhaltsverzeichnis


4. ZUKUNFTSORIENTIERTHEIT

4.1. Erweiterbarkeit

Die Erweiterbarkeit ist ein Eckpfeiler für ein wissenschaftliches System. Ein System, das nicht erweiterbar ist, schränkt den Fortschritt nicht nur ein, es limitiert sogar die Entwicklungen.

Die Struktur der Programmiersprache Forth hat mich gerade wegen ihrer Erweiterbarkeit von vornherein begeistert. Forth bezeichnet sich auch als eine Sprache der vierten Generation, weil sie in Begriffen von sich selbst erweiterbar ist.

Was bedeutet ´in Begriffen von sich selbst erweiterbar´:

Es bedeutet im wesentlichen, daß man die Möglichkeit hat neue Befehle unter Verwendung bestehender zu definieren. Die neuen Befehle unterscheiden sich in ihrem prinzipiellen Erscheinungsbild nicht von den vorher bestandenen.

Ein weiterer Schritt die individuelle Weiterentwicklung des Systems zu ermöglichen ist, stets den Sourcecode und alle für die Übersetzung nötigen Teile mitzuliefern. Dadurch ist es dem Anwender auch möglich, Veränderungen und Erweiterungen im Kern des Systems vorzunehmen (nicht alle Funktionen lassen sich durch Erweiterungen in Begriffen von sich selbst realisieren).

Mir ist es ein ehrliches Anliegen, daß möglichst viele Anwender Erweiterungen am System (auch im Kern des Systems) vornehmen, damit es weiter wächst. Da aber bekanntlich jeder eine gewisse Scheu hat, sozusagen an der Basis zu rütteln, habe ich die Einbindung von neuen Befehlen bestmöglich unterstützt. Eigentlich kann es durch die Einbindung eines neuen Befehls in den Kern nur durch extreme Unvorsicht dazu kommen, daß bestehende Funktionen beeinträchtigt werden.

Leider hat die Erweiterbarkeit und die damit verbundene stetige Veränderung des Systems den Nachteil, daß es fast nicht möglich ist, die Dokumentation auf dem Laufenden zu halten. Es existiert zwar ein Online-Dokumentationsystem in Form von Help-Pages, das in der Regel immer am neuesten Stand ist, aber dieses ist nur bedingt hilfreich, wenn es darum geht, die größeren Zusammenhänge und Konzepte zu verstehen.

Noch eine Bemerkung zu den Grenzen der Erweiterbarkeit:

Jede Systematisierung bringt Einschränkungen mit sich. Es ist vollkommen klar, daß MAL in gleicher Weise wie es manche Entwicklungen unterstützt, andere behindert. Heute ist es allerdings so, daß praktisch bei jeder wissenschaftlichen Arbeit auch auf Standard-Software zurückgegriffen wird. Die Zeiten, wo man alles selbst programmiert hat, sind längst vorbei. Ein Großteil der Standard-Software ist aber, wenn überhaupt, so doch viel schlechter erweiterbar als der MAL-Interpreter.

MAL-Homepage Inhaltsverzeichnis


4.2. Portierbarkeit

Die ersten vier Versionen des MAL-Interpreters (die hier besprochene ist die Version 5) waren in Turbo-Pascal unter MS-DOS programmiert. Aus verschiedenen Gründen war es unmöglich unter diesen Bedingungen ein portierbares System mit den geforderten Leistungen zu programmieren.

Das hätte der Sprache MAL fast das Ende bereitet, nachdem ich von der Veterinärmedizinischen Universität zum Forschungsinstitut für Orthopädietechnik gewechselt habe und dort damit konfrontiert wurde, daß der zentrale Rechner im Ganglabor eine VAX Workstation mit VMS-Betriebssystem war. An eine Portierung des bestehenden Systems war nicht zu denken - und alles neu programmieren?

Der Entschluß alles neu zu programmieren kam, als die Anschaffung einer neuen Workstation bevorstand. Bei dieser Gelegenheit habe ich gleich von vornherein tunlichst darauf geachtet ein portierbares System zu entwickeln. Die Programmiersprache C++ war dafür besser geeignet als das in vielerlei Hinsicht doch sehr restriktive Pascal.

Portierbar zu programmieren ist zum Großteil eine Frage der Selbstdisziplin. Man darf einfach nur Funktionen nutzen, von denen man annehmen kann, daß sie auf allen möglichen Betriebssystemen existieren. Die Versuchung ist stets groß, den ständigen Forderungen nach mehr Leistung nachzugeben und die gerade gebotenen Möglichkeiten auszunutzen. Ich habe mir auch einige Kritik eingehandelt, weil ich in diesem Punkt niemals nachgegeben habe.

Die Vorteile, die sich aus einer leichten Portierbarkeit ergeben, sind folgende:

MAL-Homepage Inhaltsverzeichnis


4.3. Unabhängigkeit

Ich habe es tunlichst vermieden, irgendwelche Standard Softwarepakete zu verwenden oder genauer gesagt, den Betrieb des MAL-Interpreters von Standard Software abhängig zu machen. Die Computer-Brache ist eine schnellebige Branche und Software-Pakete kommen und gehen. Die Entwicklung eines derart umfangreichen Systems braucht aber Zeit. Um den Aufwand rechtfertigen zu können, muß das Produkt auch eine möglichst lange Lebensdauer haben und darf daher nicht von Modeströmungen abhängig sein.

Selbstverständlich bedingt das zum Teil auch Einschränkungen im Leistungsumfang. Vor allem im äußeren Erscheinungsbild wirkt das MAL-System bescheiden. Als Gegenwert bietet es Zukunftssicherheit (soweit das eben garantierbar ist).

Das MAL-System in der hier vorgestellten Form benötigt für den Betrieb ausschließlich das jeweilige Betriebssystem und den entsprechenden C++-Compiler für das Neuübersetzen bei Erweiterungen oder Veränderungen.

MAL-Homepage Inhaltsverzeichnis


4.4. Das Baukastenprinzip

MAL ist ein Software-Baukasten. Zu einem guten Baukasten-System gehören einerseits brauchbare Bausteine und andererseits eine elegante Methode diese miteinander verbinden zu können.

Die Verbindung zwischen Softwareelementen ist die Datenübergabe, also die Technik mit der Ausgangsdaten des einen Moduls an ein oder mehrere andere weitergegeben werden können. Zu diesem Zweck habe ich eine Datenstruktur entworfen, die verblüffend einfach und dennoch universell anwendbar ist.

Sie beruht auf zwei elementaren Datentypen (Zahlen und Strings) und der Möglichkeit diese zu ´Verbunden´, also Arrays zusammenzufassen. Durch die Möglichkeit verschiedenste Datentypen (auch Verbunde) als Komponenten von Verbunden zu definieren, können mit diesen wenigen Sprachelementen tatsächlich alle in Programmen üblichen Datentypen realisiert werden.

Der einzige Grund, warum ich später noch weitere Datentypen eingeführt habe ist, daß Verbunde in manchen Fällen zu speicherplatzintensiv oder zu langsam in der Handhabung werden. Für alle zusätzlichen Datentypen gibt es aber immer entsprechende Befehle, um sie in Verbunde oder umgekehrt umzuwandeln.

MAL-Homepage Inhaltsverzeichnis


4.5. Namen

Die Wahl der Namen für Funktionen, Befehle oder Prozeduren ist für die Lesbarkeit einer Programmiersprache und somit auch für das Arbeiten damit von entscheidender Bedeutung.

Ich habe mich entschlossen für die Namen von Funktionen, Befehlen und Prozeduren des Kernels englischsprachige Begriffe zu verwenden, da dies so gut wie bei allen gängigen Programmiersprachen üblich ist. Soweit wie möglich decken sich die Bezeichnungen auch mit jenen wie sie zum Beispiel in C, Pascal oder Basic üblich sind. Dazu kommen die vielleicht etwas weniger geläufigen Konventionen aus Forth.

Leider sind mir, da Englisch nicht meine Muttersprache ist, auch immer wieder Fehler unterlaufen, die sich zum Teil so gut wie nicht mehr korrigieren lassen, da einmal vergebene Namen nicht mehr zu widerrufen sind, wenn sie einmal häufig in verschiedenen Programmen und womöglich von verschiedenen Anwendern verwendet werden.

Ein weiteres Problem ergibt sich aus der Erweiterbarkeit der Sprache. Namen die Anfangs kurz und prägnant waren, können später zum Problem werden, wenn sie durch hinzukommende neue Befehle ihre Eindeutigkeit verlieren.

MAL-Homepage Inhaltsverzeichnis


5. EFFEKTIVITÄT

5.1. Interpreter oder Compiler

Bei Computersprachen (oder besser gesagt bei deren programmtechnischen Realisierung) unterscheidet man zwischen Compilersprachen und Interpretersprachen. Compilersprachen werden von einem Übersetzerprogram (dem Compiler) in Maschinensprache übersetzt, während bei Interpretersprachen ein Interpreter den Sprachcode zur Laufzeit Stück für Stück abarbeitet und die entsprechenden Befehle ausführt.

Ursprünglich waren ausschließlich realisierungstechnische Gründe ausschlaggebend dafür, daß ich MAL in Form einer Interpretersprache und nicht in Form einer Compilersprache entwickelt habe. Das hat sich aber schließlich auch von der praktischen Handhabung her als der bessere Weg erwiesen. In der wissenschaftlichen Datenanalyse ist man oft gezwungen, werschiedene Methoden auszuprobieren, bevor man sich für eine entscheidet. Gerade das schrittweise, interaktive Testen wird aber von einem Interpreter besser unterstützt als von einem Compiler, bei dem ja ein Programm immer erst übersetzt werden muß, bevor es getestet werden kann. Außerdem sind manche sprachtechnische Tricks bei Compilersprachen nicht möglich.

Die entscheidenden Nachteile einer Interpretersprache sind, daß zur Laufzeit immer der Interpreter erforderlich ist, daß sie langsamer ist und daß es nicht möglich ist, Programme direkt mit anderen Sprachen zu verbinden (zu linken).

MAL-Homepage Inhaltsverzeichnis


5.2. Der Falteditor

Die Idee des Falteditors habe ich bei einer Vorführung des Betriebssystems Occam, welches speziell für den Betrieb von Transputern entwickelt wurde, gesehen.

Ein Falteditor hat die Möglichkeit, Programmblöcke, die eine logische Gesamteinheit darstellen (also Unterprogramme), komprimiert darzustellen. Das heißt, anstelle des Programmcodes wird der Name des Unterprogramms eingeblendet. Bei Bedarf kann man den Code expandieren, oder man ruft ein eigenes Editorfenster, das nur den Code des gewünschten Unterprogrammes enthält, auf.

Diese Methode erhöht die Übersichtlicht beim Programmieren gewaltig. Man kann sich wahlweise auf den groben Überblick ohne Details beschränken oder auf ein Detail konzentrieren, ohne den Balast des Gesamtprogramms zu sehen.

MAL-Homepage Inhaltsverzeichnis


5.3. Versionskontrolle

Eines meiner Hauptziele bei der Neuprogrammierung des MAL-Systems war die Unterstützung von Kooperation, sowohl innerhalb eines Teams als auch von Teams untereinander.

Bei der Zusammenarbeit mehrerer Programmierer an der Entwicklung eines Programms tauchen zwangsläufig von Zeit zu Zeit Konflikte durch Parallelentwicklungen an gleichen Modulen auf.

Das Problem ist vollkommen identisch mit dem Problem der Zugriffskontrolle bei Multiuser-Datenbanken. Dort kennt man die folgenden beiden Verfahren:

  1. Record- oder File-Locking, also das Sperren von Teilen der Daten für weitere Zugriffe.
  2. Das Zeitstempel-Verfahren, also eine nachträgliche Bereinigung eventuell aufgetretener Konflikte.
Wenn zwei Entwickler am gleichen Modul zur gleichen Zeit unterschiedliche Weiterentwicklungen vornehmen, so ist immer einer gezwungen, die Entwicklungen des Anderen in seiner Version nachzuziehen, um die Einheit des Gesamtprodukts wieder herzustellen. Das Verfahren des Record-Locking verhindert diesen Fall von vornherein, indem es vermeidet, daß mehrere gleichzeitig an ein und demselben Modul arbeiten. Das Zeitstempel-Verfahren gibt jedem die Möglichkeit, seine private Version weiter zu entwickeln, und entscheidet nach dem Abschluß beider Transaktionen, welche Version als Endgültige zu betrachten ist.

Die im MAL-System realisierte Variante orientiert sich an dem Zeitstempel-Verfahren, baut aber noch zusätzlich darauf auf, daß man bei gutem Willen auch aus zwei widersprüchlichen Versionen stets eine Version konstruieren kann, die alle Vorteile in sich vereinigt. Ich habe mich in diesem Zusammenhang ein wenig an dem Fortpflanzungsprinzip der Natur orientiert. Wenn zwei Lebewesen zusammentreffen, so gibt es mehrere Möglichkeiten:
  1. Man verhindert das Zusammentreffen von vornherein (entspricht dem Record-Locking-Verfahren).
  2. Einer schlägt den anderen tot (entspricht einer nachträglichen Entscheidung, welche Version weiter zu verwenden ist).
  3. Sie leben in friedlicher Koexistenz (entspricht dem Nichtlösen des Konfliktfalls und der Beibehaltung verschiedener Versionen).
  4. Sie paaren sich und bekommen Nachkommen (entspricht dem Zusammenführen der beiden Versionen zu einer ´Superversion´).
Die ersten drei Varianten lassen sich alle durch programmtechnische Methoden in den Griff bekommen. Die Version der ´Paarung´ erfordert aber immer den Eingriff eines intelligenten Betreuers.

Wo liegt nun der Unterschied zum völligen Weglassen einer Versionskontrolle? Der springende Punkt ist, daß das Zusammenführen von parallel gemachten Entwicklungen besonders kompliziert wird, wenn die Module oder die Änderungen groß sind. Die Schwierigkeiten steigen nicht linear, sondern wesentlich rasanter mit der Anzahl der gemachten Korrekturen. Daher ist es notwendig, das Gesamtsystem in kleine Module zu zerlegen und in möglichst kurzen Abständen nachzuprüfen, wo Zusammenführungen erforderlich sind.

Bei einer großen Zahl von Modulen ist die Wahrscheinlichkeit, daß zwei Programmierer gleichzeitig an ein und demselben Modul entwickeln gering, sodaß es in der Regel erst gar nicht zu dem Konfliktfall kommt.

Es ist dafür nicht erforderlich, daß die Entwickler ständigen Kontakt haben, also über ein Netzwerk verbunden sind. Außerdem wird niemals jemand in der Weiterarbeit behindert, indem er warten muß, bis ein gesperrtes Modul frei gegeben wird.

Als Nachteil mag man empfinden, daß auf diese Weise nicht klar definiert ist, wo man nun eigentlich nach der neuesten Version des Gesamtsystems zu suchen hat. Man erhält es dann, wenn man die einzelnen Versionen der Entwickler jeweils paarweise zusammenführt.

Zusammenfassend läßt sich über die unter MAL realisierte Versionskontrolle sagen, daß sie keine hundertprozentige Lösung darstellt, also immer noch auf die Intelligenz und den Kooperationswillen der Mitwirkenden angewiesen ist, dafür aber nicht entwicklungshemmend sondern entwicklungsfördernd ist.

MAL-Homepage Inhaltsverzeichnis


5.4. Die Meta Schnittstelle

Ich war praktisch in jedem bewegungsanalytischen Projekt damit konfrontiert, daß verschiedene Softwareteile auf verschiedenen Hardware-Plattformen liefen. Während der Datenaustausch zwischen den unterschiedlichen Plattformen auf physikalischer Ebene in der Zeit der lokalen Netzwerke kein Problem mehr darstellt, ist er auf logischer Ebene nach wie vor problematisch.

Der Vollständigkeit halber sei erwähnt, daß zum Beispiel die Binärformate von Realzahlen auf unterschiedlichen Maschinen keineswegs ident sind, daher der Datenaustausch in Binärformat in der Regel nicht zum Erfolg führt.

Die weit verbreitete Methode, die Daten zum Transferieren auf ASCII-Format umzuwandeln hat mehrere Nachteile. Zum einen erkauft man sich einen Genauigkeitsverlust durch Rundungsfehler und zum anderen muß man praktisch bei jeder Gelegenheit neue Ausgabe- und Einleseroutinen schreiben, um die jeweils unterschiedlichen Datenstrukturen zu transferieren. Und letztlich ist das ASCII-Format auch nicht immer einheitlich (man denke nur an die verschiedenen Zeilenabschluß-Varianten oder die Frage, ob man führende Nullen vor dem Komma weglassen darf oder nicht). Außerdem wollte ich auch die Möglichkeit auf EBSDIC-Maschinen zu transferieren nicht außer acht lassen.

Es war mir also ein Anliegen, dieses Problem auf elementarer Ebene ein für alle mal zu beseitigen. Und zwar so, daß man nicht immer neue Routinen schreiben muß. Das heißt, die Datenkonvertierung durfte nicht direkt von einer Maschine zur anderen vorgenommen werden, sonst hätte man für jede neu einzubindende Rechnertype in alle bestehenden Systeme neue Konvertierungsroutinen einbauen müssen, wie das folgende Bild zeigt:

Ein maschinenunabhängiges Datenformat (das Metaformat) hat den Vorteil, daß auf jedem System nur eine Konvertierungsroutine erforderlich ist, wie das folgende Bild zeigt:

Schließlich ist die Konvertierungsroutine sogar so programmiert, daß ihr Sourcecode auf allen Maschinen gleich ist. Das wurde erreicht, indem ich mich bei der Konvertierung ausschließlich auf die (stets garantiert gleichen) mathematisch logischen Funktionen des C-Compilers verlassen habe. Somit ist nach einer korrekten Portierung des MAL-Interpreters auf eine neue Hardware-Platform automatisch garantiert, daß mit allen bestehenden Systemen Daten ausgetauscht werden können.

Das Meta-Datenformat ist ein Fremdkörper im MAL-System. Es kann daher nur auf Dateien existieren, niemals in MAL-internen Datensätzen.

MAL-Homepage Inhaltsverzeichnis


6. STANDARDISIERUNG

Eines meiner Hauptanliegen ist, die Kooperation im Bereich der wissenschaftlichen Bewegungsanalyse zu unterstützen.

Um Kooperationen zu ermöglichen sind gewisse Standardisierungen erforderlich. Daten und Programme können nur problemlos ausgetauscht werden, wenn sie gleiche Schnittstellen besitzen. Andererseits sind Standards immer eine Belastung für Entwickler. Nicht zuletzt bewirken zu starke Restriktionen, daß keiner bereit ist sich daran zu halten und womöglich von vornherein eine Kooperation ablehnt.

Ich habe mich daher bemüht, nur an den unbedingt notwendigen Punkten Standards einzuführen. Außerdem sind in vielen Fällen die Standards als Vorschläge zu verstehen, die zwar empfohlen, aber nicht zwingend einzuhalten sind. Dadurch besteht zwar die Gefahr, daß sich vielleicht viele Anwender finden, diese aber trotzdem nicht zusammenarbeiten können, weil jeder seine individuellen Lösungen bevorzugt, aber ich rechne grundsätzlich mit dem guten Willen aller.

Vor allem möchte ich jedem die Möglichkeit anbieten, das System schrittweise kennen zu lernen, ohne sich erst mühsam durch einen Berg von Restriktionen arbeiten zu müssen. Es ist aber vollkommen klar, daß ohne Lernbereitschaft und ohne Willen zur Selbstbeschränkung das beste Softwaresystem nicht helfen kann.

Zum Vergleich möchte ich den Straßenverkehr heranziehen: Das Lernen von Verkehrsregeln macht sicher einen Großteil der Arbeit für eine Führerscheinprüfung aus. Und doch ist jeder bereit, diesen Aufwand auf sich zu nehmen, weil er weiß, daß ein effektiver Straßenverkehr ohne Regeln völlig undenkbar wäre.

MAL-Homepage Inhaltsverzeichnis


7. SPEICHERVERWALTUNG

Ich habe es irgendwann aufgegeben, mich darum zu kümmern, daß reservierte Speicherbereiche stets in umgekehrter Reihenfolge wieder freigegeben werden. Das führt natürlich dazu, daß der Speicher im Laufe einer MAL-Session immer mehr zerstückelt wird, was in weiterer Folge dazu führt, daß immer mehr Speicherbereich benötigt wird.

In der Regel ist das kein großes Problem. In Zeiten wo Speicher ohnehin nurmehr in Megabyte gehandelt wird, und außerdem manche Compiler über eine virtuelle Speicherverwaltung verfügen, stoßt man hier selten an Grenzen. Man muß sich nur darüber im klaren sein, daß die Laufzeit des MAL-Interpreters grundsätzlich begrenzt ist, da ja auch der virtuelle Speicher nur eine endliche Größe besitzt.

MAL-Homepage Inhaltsverzeichnis


8. DIE GRAPHIK

Bis vor Kurzem waren die Softwareteile für die Aufbereitung und Ausgabe von Graphiken die ältetsten Teile des Systems. Der erste MAL-Interpreter war im Prinzip ein befehlsgesteuertes Plotprogramm. Auch heute noch sind die Befehle für die Graphikaufbereitung sozusagen simulierte Plotter-Steuerbefehle. Es mag also für das Verstehen der Funktionen durchaus hilfreich sein, sich einen virtuellen Plotter vorzustellen.

Bei der ersten Überarbeitung wurde allerdings die direkte Ausgabe der Befehle auf die Graphikgeräte durch die Erzeugung eines Graphikdatensatzes ersetzt. Das heißt, die Graphikbefehle erzeugen einen Datensatz, der im Anschluß von einem Graphiktreiber auf das jeweilige Gerät ausgegeben wird. Diese Umstellung ermöglicht es nun, fertige Graphiken zu speichern, neu zu skalieren, zu kombinieren und dergleichen.

Ursprünglich war die Schnittstelle zwischen MAL und den Geräten zur Ausgabe der Graphik auf Linen beschränkt (auch Schriftzeichen sind Polygone), damit die Einbindung neuer Graphikgeräte einfach bleibt. Nun haben sich aber in der Zwischenzeit pixelorientierte Graphiken weiter verbreitet als linienorientierte. Außerdem sind die meisten Geräte RGB-tauglich und schließlich ist das Erscheinungsbild der rein linienorientierten Graphiken heutzutage nicht mehr qualitativ ausreichend.

Ein Redesign wurde also erforderlich, sollte jedoch abwärtskompatibel sein, damit nicht alle bestehenden Graphikprogramme neu überarbeitet werden müssen. Folgende Punkte wollte ich verbessern:

Naheliegender Weise hat sich die Implementierung der Graphik- Ausgabe als eigene Klasse empfohlen (sozusagen ein virtuelles Graphikgerät). Intern bleibt die Liniengraphik erhalten, nur gibt es einen Linienalgorithmus, der eine Funktion 'setpixel(x,y)' aufruft. Die gleiche Funktion wird auch für das Füllen von Polygonen verwendet und stellt somit eine einfache und effektive Schnittstelle für alle pixelorientierten Graphikgeräte dar.

Nachdem die Liniengraphik intern nach wie vor existiert, können auch linienorientierte Graphikgeräte (z.B. Postscript-Treiber) einfach eingebunden werden.

Noch ein Wort zu den Schriften:
Bei der letzten Überarbeitung hatte ich ursprünglich vor, Standardfonts für die Darstellung von Schriftzeichen zu verwenden. Dann war es aber nicht möglich geeignete Beschreibungen der Datenformate der Font-Dateien bzw. Sourcecodes für deren Aufbereitung aufzutreiben. Nun ist es erfahrungsgemäß nicht günstig, den Graphikgeräten die Aufbereitung der Schrift zu überlassen. Jedes Graphikgerät hat andere Beschränkungen betreffend der Positionierung, der Schriftgröße (Drehen der Schrift ist manchmal gar nicht möglich). Ich habe mich daher entschlossen, den fürs erste sehr mühsamen Weg zu gehen, die einzelnen Schriftzeichen als MAL-Polygone zu definieren (das geht nur, indem man sie Strich für Strich nachzeichnet). Nachteil ist, das es jetzt nur wenige (derzeit zwei) Fonts zur Auswahl gibt. Vorteil ist jedoch, dass beliebige Graphikgeräte betrieben werden können und die Portierung auf andere Betriebssysteme problemlos ist.

MAL-Homepage Inhaltsverzeichnis


9. DREIDIMENSIONALE GRAPHIK

Die 3d-Graphik wurde primär für ein vom Forschungsinstitut für Orthopädietechnik betriebenes Projekt ´Computergestützte Fertigung von Prothesenschäften´ entwickelt. Die Verwendung einer Rot/Grünbrille hat sich als die unkomplizierteste Methode für die räumliche Darstellung der Freiform-Oberflächen angeboten.

Es war naheliegend, die Routinen für die 3d-Darstellung auch gleich für die Animation von Bewegungsdaten zu verwenden.

Für die Handhabung von 3d-Objekten habe ich sogenannte Animations- und Polarobjekte eingeführt. Diese Objekte können leider nicht so wie andere MAL-Datensätze am Stack geholt werden.

Das hat folgenden Grund: Die in MAL verwendete Datenstruktur ist für eine rasche Adressierung schlecht geeignet. Ich war also gezwungen, Datensätze die 3d-Objekte beschreiben vor der Verarbeitung in ein internes Datenformat umzuwandeln. Dieses Datenformat nutzt aber, um den Zugriff auf C++ Ebene einfach zu gestalten, Pointer mit Absolutadressen für die Verknüpfung von dynamisch angelegten Teildatensätzen. Es ist daher nicht möglich, diese Datensätze einfach im Speicher zu verschieben oder zu duplizieren, ohne ihre Verweisstruktur zu zerstören.

Aus diesem Grund habe ich mich zunächst entschlossen, Animations- und Polarobjekte ausschließlich im Vokabular zu speichern, das ist neben dem Stack der zweite dynamische Speicherbereich für die Datenübergabe zwischen Prozeduren. Die Einträge des Vokabulars müssen niemals verschoben oder dupliziert werden. Sie werden aber dem Black-Box-Prinzip entsprechend beim Verlassen eines Programmblocks automatisch gelöscht. Das bringt zwar gewisse Einbußen in der Handlichkeit mit sich, erspart aber dem Programmierer das explizite Löschen von eingerichteten Animations- oder Polarobjekten (was vor allem im Fehlerfall immer schwierig ist) und macht somit die Programme robuster.

Viele Jahre später habe ich die 3d-Darstellung nochmals komplett überarbeitet und Open-GL für die Ausgabe verwendet. Bei dieser Gegenheit habe ich den oben erklärten Mangel auch gleich behoben, indem die Objekte, wenn sie vom Stack geholt werden in das interne Format konvertiert werden und nach der Darstellung/Bearbeitung wieder zurück konvertiert und auf den Stack gelegt werden. Außerdem habe ich dann noch auf MAL-Ebene Klassen für die Handhabung der 3d-Objekte definiert.

Lieder geistern in dem mittlerweile doch sehr umfangreichen MAL-Programm noch ein paar alte Strukturen herum, die das Arbeiten mit 3d-Objekten etwas unübersichtlich machen.

MAL-Homepage Inhaltsverzeichnis


10. DAS POOLSYSTEM

Schon sehr bald im Zuge der Entwicklung eines universellen Meßdaten-Analysesystems ist das Problem der Archivierung von Meßdaten aufgetaucht. Erste Versuche mit verschiedensten datei- oder in der ersten Zeit sogar diskettenorientierten Archivierungsmethoden haben sich immer wieder nach einiger Zeit als unzureichend herausgestellt. Die zentrale Problematik ist, daß sich mit den ständig wechselnden Anforderungen, die Forschungsarbeit nun einmal mit sich bringt, auch die Speicherungsstrukturen ändern müssen.

Auch kommerzielle Datenbanksysteme können dieser Anforderung nicht gerecht werden. Jede Datenbank erfordert zuerst ein Datenbankdesign, das man aber bei Forschungsprojekten immer erst am Ende, wenn man genug Erfahrung gesammelt hat, wirklich erfolgreich durchführen kann. Ja schon die Auswahl der Art des Datenbanksystems, ob hierarchisch, relational oder objektorientiert erfordert, daß man nicht nur über die anfallenden Daten, sondern auch über die voraussichtlich zu machenden Analysen, bescheid weiß.

Ich habe mich daher auf die Suche nach einer, wie ich es für mich genannt habe, ´amorphen Datenbank´ gemacht. Einer Datenbank, deren Speicherstruktur man festlegen kann, nachdem die Daten bereits gespeichert sind. Das Poolsystem ist die Realisierung solch einer ´amorphen Datenbank´. Ein Pool ist sozusagen ein großer Topf, in den man vorerst einmal die anfallenden Daten einwerfen kann. Danach kann man sich über die Strukturierung, also die möglichen Suchwege nach den Einträgen, Gedanken machen. Selbstverständlich wird man in den meisten Fällen die Strukturierung unmittelbar nach dem Schreiben der Daten vornehmen, aber es ist nicht erforderlich. Vor allem kann man eine gewählte Adressierungsstruktur verwerfen und durch eine neue ersetzen oder sogar mehrere Adressierungsstrukturen parallel verwenden. Eine Möglichkeit, die zum Beispiel bei der Adressierung von archivierten MAL-Unterprogrammen genutzt wird.

Die Definition der Archivierungsstrukturen kann vollständig auf MAL-Ebene, also in Form von MAL-Programmen und unter Nutzung der MAL-Datenstrukturen, erfolgen. Für das am häufigsten gebräuchliche Adressierungsmodell, die relationale (=tabellenorientierte) Datenbank, habe ich entsprechende Programme entwickelt. Ich habe für diese Speicherstruktur den Begriff ´Folder´ gewählt, weil ich eine deutliche Unterscheidung von vollständigen relationalen Datenbanken haben will. Folder sind natürlich in ihrer Leistungsfähigkeit, vor allem was die Adressierung von Daten per Query-Language betrifft, nicht mit kommerziell erhältichen Datenbanksystemen zu vergleichen.

Eine weitere Motivation, ein eigenes Archivierungssystem zu entwickeln, war die Zugriffsgeschwindigkeit. Wie bereits angedeutet, wollte ich nicht nur Meßdaten, sondern auch Programmcode oder sonstige Datensätze damit speichern. Ein Sprachinterpreter benötigt aber den Programmcode zur Laufzeit, das bedeutet, daß jedesmal, wenn ein archivierter Programmteil aufgerufen wird, ein Lesezugriff auf das Archiv erforderlich ist. Das Poolsystem ist auf unterster Ebene um ein vielfaches schneller, als ein Datenbanksystem. Es benötigt in der Regel nur einige wenige, oftmals sogar nur einen einzigen, Dateizugriffe, um eine Datensatz zu lesen.

Um das Kapitel des Poolsystems abzuschließen, möchte ich noch die Frage der Datensicherheit und im speziellen des Recovery (der Datenrekonstruktion nach Systemabstürzen) behandeln:

Ich habe bevor ich die Entwicklung des Poolsystems begonnen habe, verschiedene Vorlesungen über Datenbanksysteme auf der TU besucht. Mit Entsetzen habe ich feststellen müssen, daß Recovery ein schier unlösbar komplexes Problem ist. Es wird aber erheblich einfacher, wenn man sich auf die Erfordernisse der Bewegungsanalyse, oder der wissenschaftlichen Meßdatenerfassung im allgemeinen, beschränkt.

Kommerzielle Datenbanksysteme sind primär für das Bankwesen oder Geschäftswesen entwickelt. In diesen Bereichen mag eine halb durchgeführte oder verlorene Transaktion eine Katastrophe sein. Wenn bei einer wissenschaftlichen Messung der Strom ausfällt und die Daten der letzen Messung verloren gehen, so stellt das ein eher marginales Problem dar, solange die Datenbankstruktur nicht Schaden leidet.

MAL-Homepage Inhaltsverzeichnis


11. MESSDATENARCHIVIERUNG

Ein universelles Softwaresystem für die Messung, Archivierung und Analyse von Bewegungsdaten sollte meiner Ansicht nach folgende Eigenschaften haben:

Kombinierbarkeit
Die Forderung nach Kombinierbarkeit verschiedenster Mess-Systeme mag auf den ersten Blick unrealisierbar erscheinen, nicht zuletzt, weil es aufgrund von Laufzeit und Speicherplatzgrenzen nicht möglich ist, alle Messdaten in einem einheitlichen Format abzuspeichern. Noch dazu kann man nicht voraussehen, welche Mess-Systeme in Zukunft einzubinden sein werden.

Einen großen Fortschritt hat in diesem Zusammenhang die objektorientiete Programmierung gebracht. Das Konzept für ein objektorientiertes Datenbanksystem für die Messdaten-Archivierung ist sehr naheliegend: man definiert für jedes Mess-System eine eigene Klasse. Diese Messklassen müssen gewisse Funktionen (wie z.B. 'messen') besitzen, die sinngemäß für alle verschiedenen Systeme gleiches bewerkstelligen. Archiviert werden Instanzen dieser Klassen.

In Zuge meiner jüngsten Arbeiten an der Veterinärmedizinischen Universität habe ich mich spontan entschlossen, diese Archivstruktur zu realisieren, weil mit der alten Struktur (archivierung physikalischer Größen) die Datenanalyse zum Teil sehr viel komplexer geworden wäre. Der Entwicklungsaufwand war enorm, der Fortschritt aber auch.

Im Gegensatz zur alten Messdaten-Archivierung werden nun die Rohdaten so wie sie gemessen wurden gemeinsam mit den dazugehörigen Konfigurationsdaten abgespeichert. Die Fertigwerte werden erst beim Auslesen aus der Datenbank berechnet. Natürlich erhöht das die Programmlaufzeit bei der Datenanalyse, hat aber einige entscheidende Vorteile:

Die Kombinierbarkeit von verschiedenen Meßgeräten hat in der Praxis meistens große Schwierigkeiten verursacht, weil die Meßgrößen unterschiedliche Bezugskoordinatensysteme, unterschiedlichen zeitlichen Bezug oder unterschiedliche Einheiten hatten. Letzteres ist zwar eher ein marginales Problem, kann aber auch lästig sein. Unterschiedliche Bezugskoordinatensysteme oder unterschiedlicher zeitlicher Bezug verursachen aber nicht nur erheblichen Aufwand beim Programmieren von Analyse-Routinen, sondern sind oft auch Ursache von Berechnungsfehlern.

Ergo: es ist erforderlich die Meßdaten aller Meßgeräte auf ein einheitliches Bezugssystem zu bringen.

Bei der Definition der Bezugssysteme habe ich mich bemüht, ausschließlich auf Fixpunkte zurückzugreifen, die mit großer Gewißheit bei allen denkbaren Messungen anzutreffen sind. Schließlich habe ich die Praktizierbarkeit mit verschiedenen Probemessungen geprüft.

Programmaustausch
Wenn die verschiedenen Bewegungslabors gleiche Archivierungsformate verwenden, ergibt sich die Möglichkeit des Programmaustauschs automatisch.

Datenaustausch
Auch der Datenaustausch wird einfach, wenn die Archivierungsformate übereinstimmen. Die Datenkonvertierung zwischen unteschiedlichen Hardware-Plattformen ist durch die Konvertierung auf Metaformat realisiert.

Von einer Archivierung der Meßdaten in einer Standard-Datenbank habe ich Abstand genommen, weil sie die Weitergabe der Meßdaten an ´Heimarbeiter´ erschwert. Unter Heimarbeitern verstehe ich Mitarbeiter, die sich das MAL-System und die Meßdaten auf ihrem Privatcomputer installieren wollen, um dort Datenanalysen durchzuführen oder Softwaremodule für die Datenanalyse zu entwickeln.

Außerdem bietet die Archivierung der Meßdaten im Poolsystem nicht nur einen einfacheren und schnelleren Zugriff, sondern gestattet auch einen Wechsel in der Struktur der abzuspeichernden Daten, ohne daß die Struktur des Archivs oder bereits gespeicherter Datensätze verändert werden muß. Man kann also den Meßaufbau verändern (auch Meßgeräte dazunehmen oder weglassen), ohne Gedanken über die Archivstruktur verschwenden zu müssen. Das ist möglich, weil die Struktur jedes gespeicherten Datensatzes unmittelbar mit diesem abgespeichert wird.

MAL-Homepage Inhaltsverzeichnis


12. NEURONALE NETZE

Die initiale Idee, Algorithmen der Artificial Inteligence für Zwecke der Bewegungsanalyse zu nutzen, geht auf jene Zeit zurück, wo ich noch an der Veterinärmedizinischen Universität beschäftigt war. Dort war das Projektziel, bewegungsanalytische Methoden für die Lahmheitsdiagnose bei Pferden einzusetzen.

Die Erfolge mit den gängigen Methoden der Biomechanik oder Statistik haben mich nicht zufrieden gestellt. Ich bin nach eingehenden Betrachtungen zu dem Schluß gelangt, daß das Wissen, ob eine Lahmheit vorliegt und welche Lahmheit vorliegt, nicht aus den Bewegungsdaten selbst gewonnen werden kann. Schließlich haben wir den Erfolg oder Mißerfolg unserer Messungen immer durch Vergleich mit den Beurteilungen der Tierärzte gemessen. Und mein Vertrauen in deren Urteil war stets größer als das in unsere, damals noch völlig in den Kinderschuhen steckende, meßtechnische Beurteilung.

Ein wesentlicher Gedankenschritt war schließlich die Loslösung von dem Willen, ein objektives Meßsystem zu entwickeln, was gleichbedeutend ist mit: sich von dem Zwang zu befreien, die Berechnung der Resultate logisch begründen zu können.

Unter diesen Hintergründen hat mich dann ein Artikel in einer Computerzeitschrift angesprochen, der sich mit Selbstorganisierenden Systemen von Teuvo Kohonen befaßte. Den vorgestellten Algorithmus habe ich seinerzeit programmiert und getestet. Er war aber für unsere Zwecke wenig geeignet. In der Folge habe ich lange nach Experten auf diesem damals noch sehr wenig bekanntem Fachgebiet gesucht und bin schließlich erst einige Jahre später auf Monika Köhle gestoßen, die mir geraten hat, mit Backpropagation zu arbeiten. Als Ergebnis unserer gemeinsamen Arbeit ist 1993 ein Artikel im Journal of Biomechanics erschienen (Holzreiter S., Köhle M., ´Assessment of Gait Patterns Using Neural Networks´, J. Biomechanics Vol. 20, No.6, pp 645-651, 1993).

Der Anwendung von Mustererkennungsverfahren in der Ganganalyse liegen zum Teil auch philosophische Überlegungen zugrunde. Der Versuch den Menschen als rein mechanisch funktionierendes ´Objekt´ zu sehen ist meiner Ansicht nach von vornherein zum Scheitern verurteilt. Man ignoriert auf diese Weise die Existenz des freien Willens und den Einfluß der menschlichen Psyche. Der Mensch ist kein Objekt sondern ein Subjekt. Daher kann man ihn niemals objektiv, sondern immer nur subjektiv, beurteilen.

Die Anwendung von Mustererkennungsverfahren spiegelt diesen Sachverhalt sehr gut wieder. Sie geben niemals vor objektiv zu sein, da sie ja nur Erfahrungen, die sie anhand von Beispielen gelernt haben, zu extrapolieren versuchen.

Nachdem die Erfolge mit Backpropagation Netzen überraschend gut waren, habe ich jenen Algorithmus, den ich ursprünglich für die Tests verwendet habe etwas flexibler gestaltet und in das MAL-System eingebunden. Man muß bei der Anwendung von Neuralen Netzen mit verschiedensten mathematischen Datenaufbereitungsmethoden experimentieren, wozu der MAL-Interpreter bestens geeignet ist.

MAL-Homepage Inhaltsverzeichnis


13. DIE DOKUMENTATION

Wie bereits erwähnt sind die Help-Pages zu den einzelnen Befehlen die jeweils aktuellste und auch detailierteste Dokumentation. Sie werden praktisch ständig auf dem neuesten Stand gehalten. Das bedeutet aber auch, dass in den Help-Pages manche Teile dokumentiert sind, die nicht fertig entwickelt oder nicht getestet wurden.

Nach verschiedenen Anläufen mit diversen Textverarbeitungsprogrammen, die entweder unpraktisch oder bald veraltet (oder beides) waren, habe ich mich nun entschlossen alles direkt in HTML-Code zu dokumentieren, wobei ich mir einige Hilfsmittel für die Strukturierung und das Editieren direkt in MAL programmiert habe. Das scheint mir eine zukunftssichere Methode zu sein, denn HTML ist nicht mehr auszurotten und ohne MAL ist auch keine MAL-Dokumentation erforderlich.

Eine wesentliche Hilfe bei der Erprobung von Modulen sind die sogenannten ´Environments´. Das sind Aufrufumgebungen, also Aufrufbeispiele, der entsprechenden Module, die bei deren Entwicklung vom Entwickler zum Testen verwendet werden. Environments existieren aber nur zu den in MAL geschriebenen Modulen und nicht zu Befehlen, die im Systemkern, also in C++ realisiert sind.

MAL-Homepage Inhaltsverzeichnis


14. DATENSAMMELSYSTEM

Die frühere Primarärztin vom NRZ-Rosenhügel, Doz. Dr. Pinter, wollte eine Datenbank in der alle medizinisch relevanten Patientendaten für wissenschaftliche Analysen gespeichert sind. Die naheliegende Variante, nämlich alle Daten, auch jene von den verschiedensten Meßsystemen, ins Krankenhaus-Informationssystem (KIS) zu speichern hat zwei entscheidende Nachteile: Zum Einen unterliegt jedes KIS gesetzlichen Bestimmungen und praktischen Notwendigkeiten, die die für die Forschung erforderliche Flexibilität in der Programmentwicklung verunmöglichen. Zum Anderen verbaut man sich damit die Möglichkeit, das System Betriebsfremden, also zum Beispiel Diplomanten, für die Datenanalyse außer Haus zur Verfügung zu stellen.

Schließlich war es auch in meinem Interesse, diese Daten MAL-intern zu verwalten, um das MAL-System von Fremdprodukten unabhängig zu halten. Aus diesem Grund habe ich auch keine SQL-Datenbank, sondern die MAL-
Folderstruktur für das Speichern der Daten verwendet.

Die Datensammlung ist also ein MAL-Pool, in den die Meßergebnisse verschiedener klinischer Meßsystem patientenorientiert zum Zwecke wissenschaftlicher Analysen abgespeichert werden. Informationen aus dem KIS werden sinngemäß wie Daten aus einem Meßsystem integriert.

Obwohl es eine Vielzahl leistungsfähiger Statistikprogramme gibt, habe ich mich entschlossen der Datensammlung ein eigenes Statistikprogramm anzuschließen, um den erfahrungsgemäß sehr mühsamen Weg der Datenaufbereitung zu automatisieren. Damit ist es nun möglich, statistische Analysen inklusive der entsprechenden Datenvorverarbeitung zu definieren und bei Bedarf mit neuen Daten zu versorgen.

Damit die Rechenzeit bei der Auswertung der gespeicherten Daten in vertretbaren Grenzen bleibt, werden Fertigwerte und nicht Rohwerte in die Datensammlung gespeichert. Nachdem die Umrechnung von Rohwerten auf Fertigwerte auch für die Generierung der Befunde benötigt wird war es naheliegend, den Code für das Sammeln der Meßdaten in die jeweilige Meßklasse zu integrieren.

Aus der praktischen Erfahrung im wissenschaftlichen Bereich wusste ich, dass zumindest in der ersten Zeit nach der Einbindung neuer Meßsysteme immer wieder mit Änderungen, sowohl im Meßablauf als auch bei der Berechnung der Meßgrößen zu rechnen ist. Aus diesem Grund ist die Struktur der gespeicherten Daten zwar für jedes Meßsystem vorgegeben, die Inhalte (und dazu gehört in diesem Fall auch die Anzahl und Namen der Variablen) werden aber vom jeweiligen Meßsystem selbst definiert. Damit nun nach dem Einbringen neuer Meßgrößen keine Programmänderung im Analyseprogramm erforderlich wird, habe ich dem Anwender die Möglichkeit gegeben, dem Analyseprogramm das Extrahieren einer neuen Meßgröße anhand eines Beispiels zu lernen.

MAL-Homepage Inhaltsverzeichnis