Teil D:
Berufliche Rückwirkung der Kommerzialisierung auf Informatiker
zurück zu Teil C
7. Gestaltung von HTML-Seiten
HTML-Programmierung war in den Anfängen durch den eingeschränkten
Funktionsumfang noch einfach und auch für Nicht-Informatiker
unproblematisch.
Mit HTML 2 bzw. HTML 3 bieten sich jedoch schon viel mehr Möglichkeiten
zur Gestaltung von Webseiten:
- Tabellen
- Formeln
- Frames
- klientenseitige Maps
Aufbau einer HTML-Seite
Scriptsprachen
Moderne Browser bieten interpretierte Scriptsprachen an, es gibt
hier allerdings keinen Standard!
JavaScript (Netscape Navigator)
für Navigation, Benutzerschnittstelle, Interaktion
http://www.archimedia.khs-linz.ac.at/lora
Portabilitätsproblem
Erst HTML 2 ist genormt, viele Seiten sind jedoch zugeschnitten
auf spezifische Erweiterungen von WWW Browsern (Netscape, Microsoft,
Mosaic).
Der Wettbewerbskampf wird auf den Benutzern ausgetragen, die durch
den nicht vorhandenen Standard nicht alle Seiten mit ein und demselben
Browser optimal angezeigt bekommem.
Logos
- "Best viewed with Netscape Navigator"
- "Designed for Microsoft Internet Explorer"
8. CGI Programmierung
CGI = Common Gateway Interface
Eingaben von Formularen in HTML-Seiten werden über das CGI
an den Server übertragen.
Am Server wird dann ein Programm gestartet, das die übergebenen
Daten auswertet und entsprechend reagiert.
Methoden zur Übermittlung der Eingabedaten
- Get (über den URL)
- Post (über stdin)
Serverseitige Programme
- Perl-Scripts
- C-Programme
- ISAPI-DLLs (für Microsoft Internet Server)
Datenbankanbindung
hier gibt es die verschiedensten Möglichkeiten, unter UNIX
oft verwendet: mSQL.
Beispiel für ein serverseitiges C-Programm
9. Java
9.1 Allgemeines
Java
ist eine objektorientierte Programmiersprache für verteilte
Programmierung.
Java ist zwar ähnlich zu C++, wurde aber typsicher gestaltet.
HotJava
ist ein WWW-Browser, der in der Programmiersprache Java geschriebene
"Applets" ausführen kann. Java-Programme werden
etwa in der Art von Inline-Grafiken in HTML-Seiten eingebunden.
Implementierungen
HotJava und Java wurden von Sun entworfen und programmiert. Momentan
gibt es von Sun vorgenommene Implementierungen für Sun Workstations,
Windows 95+NT und den Mac. Portierungen auf weitere Plattformen
werden von unabhängigen Programmierergruppen vorgenommen
(AIX, Linux, OS/2, SGI IRIX, ...).
Die aktuellen Versionen der wichtigsten Web-Browser enthälten
bereits den Code zur Ausführung von Java-Applets.
Beispiel
9.2 Die Programmiersprache Java
Eigenschaften
Java ist eine C- (C++)-ähnliche objektorientierte Programmiersprache,
hat aber viele Sprachelemente von C++ nicht implementiert, die
nur selten verwendet (und verstanden) werden. Darunter fallen
operator overloading und mehrfache Vererbung.
Für objektorientiertes Programmieren wurde dafür zusätzlich
das "Interface"-Konzept von Objective C übernommen.
Zur Vereinfachung ist ein garbage collector eingebaut,
der Speicherfehler weitgehend ausschließt.
Klassenbibliothek
Die momentane Klassenbibliothek von Java ist noch keineswegs komplett,
sondern deckt vorerst nur die wichtigsten Einsatzgebiete ab: zweidimensionale
Grafik, Netzwerkprogrammierung (Client-/Server-Programme) und
Benutzerinteraktion.
Werkzeuge (Compiler, Tools zum Einbinden von C-Code, ...) und
Klassenbibliothek sind im sogenannten JDK (Java Development
Kit) enthalten.
Zielsysteme
Da Java-Programme über Netzwerke verteilt werden können,
wurde auf eine möglichst architektur-neutrale Implementierung
geachtet.
Der Compiler erzeugt deshalb einen CPU-neutralen Code, der über
ein Runtime-System auf den unterschiedlichsten Systemen abspielbar
ist. Java Programme sollten deshalb in einer einzigen Version
auf allen Plattformen laufen.
Dafür wurde die Sprache genau definiert, es gibt keine implementierungsabhängigen
Details. Beispielsweise sind die Größen der Datentypen
"int" und "float" in C und C++ implementierungsabhängig,
in Java jedoch mit 32 bit bzw. 32-bit IEEE 754 festgelegt.
Die Klassenbibliothek ist ebenfalls ein Teil des Java Standards.
Performance
Der Java Compiler erzeugt einen architekturunabhängigen zu
interpretierenden Bytestrom. Der Code ist mit zusätzlicher
Information zur Laufzeit-Typüberprüfung angereichert.
Der Bytecode basiert auf der Maschinensprache einer virtuellen
Maschine und liefert selbst im interpretierten Ablauf schon eine
gute Performance, da der Compiler selbst schon einige Optimierungen
vornimmt und das Laufzeitsystem einen Registeroptimierung versucht.
Interpretierter Code erreicht etwa 300.000 Methodenaufrufe pro
Sekunde (SPARCStation 10), im Vergleich zu etwa 600.000 auf einem
i486 DX33 mit optimiertem C++ Code.
In späteren Versionen von Java wird ein Codegeneratoren auf
der Zielmaschine den empfangenen Bytecode in native-Code umsetzen.
Solchermaßen erzeugter Code ist von der Performance mit
native C oder C++ Code gleichzusetzen.
Threads
Threads (lightweight processes) teilen sich den globalen Datenbereich
einer Applikation und sind in der Klassenbibliothek von Java festgelegt.
Die Programmiersprache selbst wurde um Konstrukte zur Synchronisation
von Threads erweitert.
Dynamisches Laden
Module werden nicht zu einem großen Programm gelinkt, sondern
zur Laufzeit dynamisch geladen. Dadurch werden wirklich nur die
benötigten Module übertragen. Außerdem können
Bibliotheken so jederzeit erweitert werden, ohne bestehende Programme
zu beeinflußen.
Sicherheit und Robustheit
Der Java Compiler versieht Objekte zur Laufzeit mit Typinformation.
Dadurch kann der Interpreter beispielsweise die Gültigkeit
von type-casts überprüfen.
Statt Pointer-Arithmetik werden in Java Arrays mit überprüfbaren
Grenzen verwendet. Dadurch können alle Speicherzugriffe zur
Laufzeit auf ihre Gültigkeit hin untersucht werden.
9.3 Sicherheit unter Java
Wenn bei einem Laden einer Web-Seite automatisch ein Programm
geladen und gestartet wird, dann ist gesunde Vorsicht durchaus
angebracht (Systembeeinflussung, Virengefahr). Wie geht Java mit
diesem Problem um?
Sprache und Compiler
- Arrays statt Pointer-Arithmetik mit Index-Check,
- Typkonvertierungen werden zur Laufzeit überprüft.
Überprüfung der Bytecodes
Um manipulierten Bytecode oder Code aus einem fehlerhaften Compiler
auszuschließen, führt das Laufzeitsystem (der Verifier,
ein Teil des Loaders) einige Tests aus, um sicherzustellen,
daß:
- keine Zeiger manipuliert werden
- keine Zugriffsbeschränkungen umgangen werden
- Objekte immer in ihrem korrekten Datentyp angesprochen werden
- Methoden mit den richtigen Parameter-Datentypen aufgerufen
werden
- kein Stack-Überlauf stattfindet
- keine illegalen Datenkonvertierungen vorgenommen werden.
Class Loader
Der Class Loader richtet für jede Netzwerkquelle einen eigenen
Namensbereich ein. Wenn eine Klasse auf eine andere Klasse Bezug
nimmt, dann wird diese Klasse zuerst in den eingebauten Klassen
gesucht ("built-in" Klassen) und danach im Namensbereich
der referenzierenden Klasse. So können "built-in"
Klassen nicht von bösartigen Programmen überschrieben
bzw. ausgetauscht werden.
File System und Netzwerkzugang
Hotjava verwaltet eine Liste von Dateien, die von importierten
Klassen gelesen und geschrieben werden dürfen. Wenn eines
dieser Rechte verletzt würde, dann wird der Benutzer um sein
Einverständnis zu der Operation gefragt.
Änliche Mechanismen sind auch für das Ausführen
von geladenem Code implementiert. Das Ausführen von Code
kann entweder ganz untersagt oder auf Programme eingeschränkt
werden, die von innerhalb einer Firewall geladen werden. In Zukunft
ist der zusätzliche Einsatz eines public key Kryptographieverfahrens
zur Identifikation des Senders als auch zur Integritätskontrolle
des Codes geplant.
zurück zu Teil C