An sechs Kriterien zur Beurteilung von Programmiersprachen gemessen

30.07.1993

Cii gilt nicht als reine Lehre,

ist aber ein tragfaehiger KompromiWelche Rolle die Sprache bei der Implementierung eines objektorientierten Systems spielt, darueber streiten sich die Experten. Einig sind sie sich immerhin darin, dass eine geeignete Sprache die Umsetzung des objektorientierten Entwurfs vereinfacht. Werner Achtert* stellt Kriterien dafuer auf, inwieweit sich eine Sprache fuer die objektorientierte Programmierung eignet, um anschliessend das weitverbreitete Cii an dieser Latte zu messen.

Objektorientierte Programmierung ist eine logische Weiterentwicklung bisher verwendeter Techniken. Ausgangspunkt einer systematischen Software-Entwicklung war in den siebziger Jahren die strukturierte Programmierung, mit deren Regeln sich Programme besser aufteilen lassen. Die Ablaeufe werden auf diese Weise uebersichtlicher und leichter zu pflegen.

Der naechste Schritt war in den achtziger Jahren die Postulierung der modularen Programmierung. Die Trennung in Algorithmen und Datenstrukturen wurde durch die Bildung von Modulen aufgehoben.

Alle Phasen des

Projekts sind betroffen

Das Schlagwort der neunziger Jahre ist die objektorientierte

Programmierung (OOP). Objektorientierung ist allerdings mehr als nur eine neue Programmiertechnik zur besseren Strukturierung von Quellprogrammen. Es handelt sich bei ihr vielmehr um einen Denkansatz, der sich auf alle Phasen des Entwicklungsprozesses auswirkt und damit ein Umdenken nicht nur der Programmierer erfordert, sondern aller Personen, die an der Entstehung von Softwaresystemen beteiligt sind.

Der Begriff der objektorientierten Programmierung ist irrefuehrend, da er den Eindruck erweckt, allein durch die Verwendung einer anderen Programmiersprache und neuer Regeln fuer die Programmierung liessen sich objektorientierte Systeme entwickeln. In Wirklichkeit umfasst Objektorientierung alle Phasen eines Softwareprojekts von der Analyse ueber Spezifikation und Entwurf bis zur eigentlichen Programmierung.

Es wird oft behauptet, man koenne mit jeder Sprache objektorientiert programmieren. Dies mag zwar prinzipiell richtig sein, fuer eine gute Umsetzung eines objektorientierten Entwurfs ist allerdings auch eine adaequate Programmiersprache noetig. Da im Moment viele Hersteller ihre Produkte mit dem offenbar verkaufsfoerdernden Attribut "objektorientiert" versehen, benoetigt der Entwickler Massstaebe, um die tatsaechliche Eignung einer Sprache beurteilen zu koennen.

Dazu werden zunaechst Forderungen aufgestellt, die objektorientierte Programmiersprachen erfuellen muessen. In einem zweiten Schritt wird die Programmiersprache Cii anhand dieser Kriterien bewertet.

Anforderungen an eine

OO-geeignete Sprache

Ausgangspunkt der objektorientierten Programmierung ist der sogenannte abstrakte Datentyp (ADT). Ein ADT ist die formale Beschreibung der Eigenschaften, die eine Menge von Gegenstaenden aus der Anwendungsumgebung hat. Ein objektorientiertes System ist eine Zusammenstellung solcher ADTs. Aus der Notwendigkeit, einen ADT in die Syntax einer Programmiersprache umzusetzen, ergeben sich die folgenden Forderungen:

1. Kapselung: Die Programmiersprache muss die Moeglichkeit bieten, Daten, Methoden und Regeln zu einer syntaktischen Einheit zusammenzufassen. Diese Komponenten eines ADTs werden in der Programmiersprache zu einer Klasse zusammengefasst.

2. Instanzierung: Es muss moeglich sein, Objekte als konkrete Realisierung einer Klasse zu definieren. Ein Objekt ist ein Element aus der Menge der Gegenstaende, die durch den ADT beschrieben wird, und muss alle Eigenschaften haben, die dabei festgelegt wurden.

3. Schutz: Einzelne Komponenten einer Klasse muessen gegen den unkontrollierten Zugriff geschuetzt werden koennen. Der Zustand eines Objekts darf nur veraenderbar sein durch die Anwendung einer Methode der entsprechenden Klasse.

4. Trennung von Spezifikation und Implementierung: Es muss moeglich sein, die Eigenschaften einer Klasse getrennt von deren Implementierung zu definieren. Hierzu ein Beispiel: Ein Stack laesst sich durch einen ADT beschreiben. Eine Push-Operation bedeutet zum Beispiel, dass aus einem Stack und einem Element ein neuer Stack gebildet wird. Die naechste Pop-Operation liefert bei einem nichtleeren Stack das letzte Element, das mit "push" auf den Stack gelegt wurde. Ob die Elemente des Stacks in der Implementierung als Vektor mit fester Anzahl von Elementen oder als verkettete Liste gespeichert werden, hat keine Auswirkung auf die Eigenschaften. Diese Forderung ist deshalb so wichtig, weil damit die Trennung zwischen der Entwurfsphase und der Realisierung sauber vollzogen werden kann. Der Entwurf definiert Eigenschaften, die bei der Realisierung in ein Programm umgesetzt werden. Durch die Trennung ist es moeglich, zu einem spaeteren Zeitpunkt die Realisierung ohne Auswirkung auf die Eigenschaften zu veraendern.

5. Vererbung: Eine Klasse muss ihre Eigenschaften an andere Klassen weitergeben koennen. Dies bedeutet, dass die Eigenschaften einer Basisklasse in einer davon abgeleiteten Klasse verfuegbar sind. Auch dazu ein Beispiel: In einer Verwaltung gibt es verschiedene Kategorien

von Personen, naemlich Kunden, Lieferanten und Mitarbeiter. Die gemeinsamen Eigenschaften werden in einer Basisklasse zusammengefasst, in den davon abgeleiteten Klassen werden jeweils nur die zusaetzlichen Eigenschaften definiert. Es muss moeglich sein, dass eine Klasse durch Mehrfachvererbung von mehreren Basisklassen Eigenschaften uebernimmt.

6. Verzicht auf ein Hauptprogramm: Ein objektorientiertes System besitzt kein Hauptprogramm im herkoemmlichen Sinne. Es besteht vielmehr aus einer Menge von Objekten, die untereinander Nachrichten austauschen, neue Objekte erzeugen und Objekte vernichten koennen. Der Ablauf der Bearbeitung ergibt sich aus dem Datenaustausch zwischen den Objekten. Die Zielsetzung der Nebenlaeufigkeit fordert sogar, dass gleichzeitig mehrere Objekte Aktionen ausfuehren koennen, was im Idealfall in einem Mehrprozessor-System zu einer echten Parallelverarbeitung fuehren koennte.

Eine ganze Reihe

von Schwachpunkten

Und nun die Bewertung von Cii: Diese Sprache hat mittlerweile eine ziemlich grosse Bedeutung im Bereich der objektorientierten Programmierung gewonnen. Bei der Neuentwicklung von Systemen nimmt Cii im Moment den groessten Anteil innerhalb der objektorientierten Sprachen ein. Trotz dieser weiten Verbreitung gibt es eine Reihe von Schwachpunkten gegenueber anderen Systemen.

Zu Forderung 1: Das Klassenkonzept von Cii bietet die Moeglichkeit, Daten und Funktionen zu kapseln. Die Funktionen einer Klasse haben den direkten Zugriff auf die Daten. Es gibt allerdings keine Moeglichkeit, Regeln zu formulieren, deren Einhaltung vom System automatisch ueberwacht wird.

Zu Forderung 2: Klassen koennen in Cii benutzt werden, um Objekte zu definieren. Ein Objekt wird syntaktisch wie eine Variable behandelt, der Zugriff auf die Bestandteile eines Objekts erfolgt also wie in C.

Zu Forderung 3: Eigenschaften koennen in einer Klasse als geschuetzt definiert werden. Solche Bestandteile sind nur noch innerhalb der Klasse sichtbar und verfuegbar. Eines der Hauptprobleme in Cii ist die Moeglichkeit, trotzdem ueber Pointer- Operationen auf fast jeden Speicherbereich zugreifen zu koennen. Dies widerspricht eindeutig der Zielsetzung der Objektorientierung, wonach der Inhalt eines Objekts nur durch Benutzung einer Methode veraenderbar sein darf. Der Friend- Mechanismus gestattet einer Funktion den Zugang zu allen Bestandteilen eines Objekts, obwohl sie nicht Bestandteil der Klasse ist. Auch dies ist ein Verstoss gegen das Schutzziel der Objektorientierung.

Zu Forderung 4: Die Trennung von Spezifikation und Implementierung ist in Cii zumindest ansatzweise realisiert durch das Konzept der "Pure-virtual"-Funktionen. In einer Klasse koennen Funktionen definiert werden mit Festlegung der Schnittstelle fuer den Aufruf, aber ohne die Definition des Funktionskoerpers innerhalb dieser Klasse. In davon abgeleiteten Klassen lassen sich dann jeweils passende Funktionsdefinitionen anschliessen. Damit besteht die Moeglichkeit, fuer mehrere Klassen in einer Basisklasse eine einheitliche Schnittstelle zu bestimmen. Durch Ueberladen von Funktionen und Operatoren kann der Entwickler fuer eine Schnittstellen-Definition unterschiedliche Implementierungen definieren.

Zu Forderung 5: Eine Klasse kann in Cii die Eigenschaften einer oder mehrerer Basisklassen erben. Der Zugriff auf alle Komponenten ist transparent - egal, ob auf Bestandteile der eigenen Klasse oder auf die einer Basisklasse.

Zu Forderung 6: In Cii ist wie in C ein Hauptprogramm noetig. Ein Programm kennt nur einen Ablauf; eine gleichzeitige Steuerung mehrerer Vorgaenge ist nicht moeglich. Die Nebenlaeufigkeit von Objekten ist damit nicht realisierbar.

Cii ist eindeutig eine Hybridsprache, die aus der Erweiterung einer ablauforientierten Sprache entstanden ist. Damit kann die Sprache nur ein Kompromiss zwischen mehreren Konzepten sein, was sich zum Beispiel bei den Schutzmechanismen deutlich zeigt. Alle Pruefungen von Zugriffen auf Objekte nimmt der Compiler vor, daher sind zur Laufzeit unerlaubte Zugaenge beispielsweise durch Pointer- Operationen, nicht zu verhindern.

Ein weiterer Mangel ist das Fehlen von automatischen Regelmechanismen, die in anderen Sprachen, zum Beispiel Eiffel, die Programmierung erheblich vereinfachen. Dem steht der Vorteil der hohen Effizienz gegenueber; verglichen mit C gibt es kaum einen Laufzeitverlust. Der Verwaltungsaufwand zur Laufzeit ist zudem erheblich geringer als bei den rein objektorientierten Systemen wie Eiffel oder Smalltalk. Trotz aller Defizite gegenueber den Forderungen der Theorie ist Cii also fuer die objektorientierte Programmierung geeignet.

*Werner Achtert ist der Autor des

Nachschlagewerks "Das grosse Buch zu Cii", das voraussichtlich im September dieses Jahres bei Data Becker in

Duesseldorf erscheinen wird.