/*
Datei............: Aufg0103.java
Projekt..........: Einführung in die Java-Programmierung
Erstellt.........: 04.10.97, Guido Krüger
Geändert.........: --
Aufgabe..........: Musterlösung zu Aufgabe 01.03
Kommentare.......:

Die Portierbarkeit eines Programmes bezeichnet seine Eigenschaft,
auf unterschiedlichen Systemen ausführbar zu sein. Wird ein
Programm auf System A entwickelt, so ist es oft wünschenswert,
daß es auf anderen Systemen B, C, usw. ebenfalls ausgeführt
werden kann. Portierbarkeit kommt in der Regel in zwei
verschiedenen Ausprägungen vor. Sie werden als

- "Quelltextkompatibilität" und
- "Binärkompatibilität"

bezeichnet.

Bei der Binärkompatibilität ist ein bersetztes Programm ohne
weitere Änderungen auf einem anderen System lauffähig. Bei der
Quelltextkompatibilität würde ein Programm zwar prinzipiell
auf einem anderen System laufen, muß aber vorher neu übersetzt
und gelinkt werden. Binärkompatibilität erfordert in der
Regel eine einheitliche (oder zumindest kompatible) Prozessor-
und Betriebssystemarchitektur (z.B. MSDOS -> Windows) oder
eine Emulation derselben, die von der physikalischen Architektur
abstrahiert (z.B. Java-VM). Bei Systemen, die nicht Binär-
kompatibel sind, versucht man durch einheitliche APIs
(Application Programming Interfaces) immerhin noch eine
möglichst umfassende Austauschbarkeit der Quelltexte zu
erreichen. Typische Bestrebungen der letzten Jahre waren die
Versuche verschiedener Anbieter von UNIX-Rechnern, ihre
nicht binärkompatiblen Systeme wenigstens quelltextkompatibel zu
machen (z.B. X/Open, POSIX, etc.).

Mit "Plattformunabhängigkeit" wird beschrieben, wie stark
einzelne Merkmale eines Systems von der zugrunde liegenden
Plattform abhängig bzw. unabhängig sind. Eine hohe
Plattformunabhängigkeit erleichtert in aller Regel die
Portierbarkeit eines Programms. Plattformabhängigkeiten
sind auf verschiedenen Ebenen zu finden:

- Länge elementarer Datentypen
- Byte-Ordering elementarer Datentypen
- Trennzeichen für Pfadangaben
- Verwendete Zeichen für Zeilenende in Textdateien
- Auflösung und Farbtiefe von Bildschirmen
- Anzahl der Tasten auf der Maus
- Funktionstasten auf der Tastatur
- usw.

Java versucht, dem Programmierer in einem umfassenden Ansatz eine
weitgehend plattformunabhängige Architektur zur Verfügung zu stellen
und dadurch eine hohe Portierbarkeit zu erreichen. Die Sprache
beschränkt sich dabei nicht nur auf die Quelltextkompatibilität
(wie beispielsweise die Sprache C), sondern implementiert mit
Hilfe der virtuellen Maschine (des Java-Interpreters) auch
eine weitreichende Binärkompatibilität. Unter Inkaufnahme
eines schlechteren Laufzeitverhaltens bietet Java damit
(als eine der wenigen Programmiersprachen) eine weitgehende
Binärkompatibilität für MS-DOS, OS/2, Mac-OS, Windows und viele
UNIX-Systeme.

Während die maschinennahen Plattformunterschiede dabei
weitgehend durch die VM ausgeglichen werden, erweist es sich
als viel schwieriger, die Unterschiede der verschiedenen
grafischen Oberflächen zu egalisieren. Zu unterschiedlich werden
beispielweise Konzepte wie

- Darstellung und Ansteuerung der Dialogelemente,
- Kommunikation mit der Zwischenablage,
- Kontextmenüs,
- Maustasten und Doppelklicks,
- Ausdruck von Grafik,
- Verfügbare Schriftarten,
- Drag & Drop,
- usw.

gelöst. Der dadurch erforderliche Anpassungsaufwand macht einen
Großteil der Komplexität des AWT (Abstract Windowing Toolkit)
von Java aus und führte in der Vergangenheit zu Anomalien, die
nur auf bestimmten Betriebssystemen auftraten, auf anderen
dagegen nicht.

Die Portierbarkeit von Java-Programmen ist eines der wichtigsten
Unterscheidungsmerkmale zu anderen Sprachen. Sein Gelingen oder
Nichtgelingen wird kritisch für den langfristigen Erfolg von
Java und den mit Java entwickelten Anwendungen sein.
*/
