Warum soll man die Schätze des Betriebssystems nicht nutzen dürfen?

Aller Anfang war Unix - doch die Wurzeln von C sind viel älter

04.01.1991

Ist C eine "klassische" Programmiersprache? Diese scheinbar harmlose Frage mag manchen "alten EDV-Hasen" in Verlegenheit bringen und ihn nachdenklich stimmen. Dies trifft besonders dann zu, wenn er ein Mann der ersten Computerstunde ist und die rasante Entwicklung der EDV selbst durchlebt hat.

Er erinnert sich an die Maschinen- und Assembler-Sprachen, mit denen er durch eine Haßliebe verbunden war. Das Aufkommen der ersten problemorientierten Programmiersprachen Cobol, Fortran und Algol brachte die große Wende in der Programmierung. Eine Politur erlebten diese Sprachen durch Pascal, dessen Glanz sich auch auf sie übertrug.

Verborgen bleiben der Erinnerung aber auch nicht die Betriebssysteme, die eine ähnliche Entwicklung wie die Programmiersprachen durchließen Eigentlich - so schmunzelt unser EDV-Hase vor sich hin hat C von all meinen Erinnerungen etwas! Verständlich wird dieser Gedanke, wenn man den Werdegang von C verfolgt.

Der Ursprung reicht in das Jahr 1970 zurück. In diesem Jahr wurde das Betriebssystem Unix geboren. Unix und C sind seit dieser Zeit eng miteinander verbunden und werden meist in einem Atemzug genannt. Man übersieht dabei leicht, daß C sich mittlerweile zu einer selbständigen Programmiersprache gemausert hat, die auch losgelöst von Unix ein eigenständiges Dasein führt. Trotzdem ist es sinnvoll, ein paar Worte über Unix zu verlieren, wenn man den historischen Hintergrund richtig ausleuchten möchte.

Ausgelöst wurde die Entwicklung von Unix durch die Unzufriedenheit mit den angebotenen Betriebssystemen für Minicomputer. Unix sollte besonders die folgenden Ziele verfolgen.

- Schaffung eines universellen Betriebssystems mit einer standardisierten Benutzerschnittstelle;

- Erhöhung der Zugänglichkeit des Rechners für den Programmierer durch interaktiven Mehrbenutzer-Betrieb;

- Unterstützung des koordinierten Zusammenwirkens eines Teams von Softwarebearbeitern während einer Produktentwicklung.

Ken Thompson und Dennis Ritchie trieben diese Arbeiten zunächst vorwiegend auf der Basis von Minicomputern voran. Erreicht wurden die Zielvorgaben durch die Einarbeitung einer Vielzahl von neuen, richtungsweisenden Basiskonzepten, die sich in der Shell-Struktur niederschlugen.

Kennzeichnend für diese Struktur ist die hohe Modularisierung des gesamten Systems und die konsequente Anwendung der parallel entwickelten maschinenunabhängigen höheren Programmiersprache C für die Codierung von Unix. Etwa 95 Prozent der Systemsoftware von Unix wurden in C geschrieben, und nur fünf Prozent benötige die jeweils maschinenspezifische Assemblersprache.

Unix setzte sich sehr schnell bei vielen Minicomputeranwendern durch und wurde vor allem an den Universitäten als Geheimtip gehandelt. Neue starke Impulse für die Anwendung von Unix und C gingen ab 1981 von der breiten Einführung sehr leistungsfähiger 16-Bit-Mikroprozessoren, hochintegrierter 64-Kbit-Speicherchips sowie 5?-Zoll- und 8-Zoll-Winchester-Plattenlaufwerken aus.

Genau betrachtet ist C jedoch wesentlich älter als Unix. Viele der wichtigsten Ideen in C stammen von BCPL, einer Sprache, die Martin Richards entwickelt hat. BCPL beeinflußte C indirekt durch die Sprache B, die Ken Thompson 1970 für das erste Unix-System auf der PDP/7 implementiert hat.

Veröffentlicht wurde C im Jahre 1978. Seit dieser Zeit hat sich die Sprache nicht mehr allzu stark verändert. Bedingt durch die Bedeutung, die sie innerhalb kurzer Zeit erwarb, beauftragte das American National Standard Institute (ANSI) im Jahre 1983 ein Komitee, eine "eindeutige und maschinenunabhängige Sprache C" zu erarbeiten.

Das Ergebnis war der erste ANSI-Standard für C. 1988 wurde dieser Standard überarbeitet und den neueren Entwicklungen angepaßt.

Die meisten "klassischen" Programmiersprachen wie Cobol, Fortran, PL/1 und Pascal lassen sich durch ihre Befehle und durch ihre Datentypen beschreiben.

Der genannte Ursprung die Sprache BCPL - und C stellen trotz ihrer Gemeinsamkeiten in einer Reihe von charakteristischen Sprachelementen keine Dialekte dar. BCPL und auch B sind typenlose Sprachen.

Der einzige Datentyp ist ein Maschinenwort, und der Zugriff auf andere Objekte geschieht durch spezielle Operatoren und Funktionsaufrufe. Somit ist die Verwandtschaft zu den Assembler-Sprachen deutlich erkennbar. C jedoch kennt eine Vielzahl von Datentypen. Neben den grundlegenden Datentypen - Zeichen, ganze Zahlen mit unterschiedlichem Speicherbedarf, Gleitkomma-Zahlen gibt es eine Hierarchie von zusammengesetzten Datentypen, die mit Hilfe von Zeigern, Vektoren, Strukturen, Varianten und Funktionen erzeugt werden.

C besitzt die fundamentalen Kontrollstrukturen, die für gut strukturierte Programme notwendig sind:

- Zusammenfassung von Anweisungen,

- Entscheidungen (einseitige und zweiseitige Auswahl),

- zähler- und bedingungsgesteuerte Wiederholungsstrukturen mit Bewertung des Abbruchkriteriums am Anfang und am Ende (abweisende und nicht abweisende Wiederholung),

- Auswahl von einem aus einer Menge von möglichen Fällen (mehrfache Auswahl).

All diese Kontrollstrukturen gab es auch in BCPL, jedoch mit etwas abweichender Syntax. Interessant ist, daß BCPL diese Elemente schon kannte, lange bevor die "strukturierte Programmierung" in Mode kam!

Durch den Geltungsbereich von Variablen werden die Speicherzuordnungen beschrieben. Eine leistungsfähige Sprache gibt hier dem Programmierer viele Möglichkeiten, sein Programm zu modularisieren. In diesem Bereich liegt eine große Stärke von C, die eine enge Verwandtschaft zu "klassisch-modernen" Programmiersprachen wie Pascal erkennen läßt. Diese Verwandtschaft zeigt sich auch bei den Datenstrukturbeschreibungen.

C - eine klassische Programmiersprache? Den letzten Abschnitten zufolge möchte man diese Frage mit ja beantworten. Man darf aber nicht vergessen, daß C

- über Befehle zur Bitverarbeitung verfügt, die den Befehlen einer Assembler-Sprache völlig entsprechen,

- Eingriffe in das Betriebssystem erlaubt, die "normalerweise" nur auf Assembler-Ebene möglich sind.

Verständlich werden diese Möglichkeiten aus der historischen Entwicklung, denn C wurde ja geschaffen, um das zuerst in Assembler geschriebene Unix in eine neue Form zu fassen.

Unser EDV-Hase gerät ins Schwärmen, wenn er an die Zeiten denkt, in denen man als Programmierer noch direkten Zugriff auf das Betriebssystem hatte. Warum auch soll man die Schätze des Betriebssystems nicht im Sinne der modularen Programmierung für sein eigenes Programm nutzen dürfen? Die damals "neuen" Sprachen wie Cobol und Fortran verboten es, C macht es heute wieder möglich! So träumt unser EDV-Spezialist bei C der Jahreszeit entsprechend von einer Fahrt im offenen Geländewagen durch den Matsch von Bits und Bytes, vom Kernel bis hin zur äußeren Schale, freut sich darüber, mit seinem Wagen auch in die entlegensten Winkel zu kommen und stört sich wenig daran, daß er nach der Fahrt unter Umständen entsprechend aussieht und - die Beantwortung der ihm eingangs gestellten Frage über seiner Begeisterung völlig vergessen hat!