Immer mehr ernsthafte Programmierer wählen die Sprache "C" zur Entwicklung von Software. Der Grund liegt mit Sicherheit in den starken Leistungsmerkmalen dieser Sprache. Gerade für ST-Besitzer ist diese Sprache von großer Bedeutung, weil das Betriebssystem zu einem großen Teil in "C" geschrieben ist.
Wir möchten mit diesem Artikel einen Überblick über "C" geben. Was macht eine Programmiersprache beliebter als die andere? Welches sind die Kriterien, unter denen die Programmierer eine Sprache auswählen? Um eine einigermaßen objektive Antwort zu erhalten, sollte man möglichst vermeiden, engagierte Programmierer einer bestimmten Sprache zu fragen. Mit Sicherheit sind fast alle Probleme der Informatik auf verschiedene Arten zu lösen und somit auch durch verschiedene Sprachen, ohne Rücksicht auf Faktoren wie Zeit, Aufwand, Länge usw. Allerdings ist bei der Entwicklung von professioneller Software nicht nur die Endlösung von Bedeutung, sondern auch Form und Aufwand spielen eine wichtige Rolle.
Da man in der Computerwelt mit der Tatsache leben muß, daß es verschiedene Computer-Typen gibt, die sich nicht vertragen, ist es von großer Bedeutung, eine gemeinsame Sprache zu finden, die eine Art Brücke bildet.
Die Sprache "C" wurde 1972 von Denis Ritchie am Bell Laboratories entwickelt. Grund dafür war das bis zu diesem Moment in Assembler PDP 11 geschriebene Betriebssystem UNIX umzuschreiben, um es auch für andere Maschinen lauffähig zu machen. Ken Thompson, der Schöpfer dieses Betriebssystems, entwarf zu diesem
Zweck eine Sprache mit dem Namen "B", welches die Basis von der heutigen "C" war. So wurde im Jahre 1974 ein in "C" geschriebenes UNIX in eine PDP 11 Anlage installiert. Ohne Zweifel, und das ist ungemein wichtig, sind die Entwicklung von "C;" und die Entwicklung des Betriebssystems UNIX untrennbar.
Später, im Jahre 1978, schreibt Denis Ritchie zusammen mit Brian Kernigham ein Buch über "C", das als Standardwerk zu der Definition dieser Sprache gilt. Dieser Standard (an den sich die verschiedenen Compiler-Entwickler im wesentlichen halten) hat dazu geführt, daß die verschiedenen Versionen einheitlicher bleiben als bei anderen Sprachen, wie z. B. bei PASCAL.
auto,double,if,static,breack,eise,int,struct,case,entry,long,switch, char,extern,register,typedef,continue,float,return,union,do,goto,short,while
Bei der Entwicklung von "C" wurde besonders darauf geachtet, eine Sprache zu schaffen, die so unabhängig wie möglich von jeder Hardware-Architektur bleibt. So gehören zur tatsächlichen Sprache keine Anweisungen für Einund Ausgabe, Dateizugriff und Speicherverwaltung. Alle diese Funktionen werden in externe, sogenannte CLibraries, implementiert. Damit erreicht man eine fast absolute Portabilität von Programmen aus verschiedenen Rechnern. Die eigentlichen Anweisungen, Operanden und Operatoren beschränken sich bei "C" auf ein paar Dutzend. Damit vereinfacht sich das Erlernen der Sprache und der Compiler selbst kann sehr kompakt sein. Eine Darstellung von "C"-Anweisungen sehen Sie auf Bild 1. Bei der C-Biblio
OPERATOREN | |||
---|---|---|---|
+ | Addieren | * | multiplizieren / dividieren modulo |
Nicht Standard Bibliotheksfunktionen
Cconin Pterm Dosound
Fdup Getshift Initmous
Setscreen Vslide Hslide
Upparrow , Dnarrow Root
Small Tochexit Edstart
Bild 2: Einige Standardroutinen
Bild 3: Einige Nicht Standard Routinen
thek verhält sich dies etwas anders.
Einerseits tendiert man dazu, zu jedem Compiler eine Standard-Library mitzuliefern. Andererseits berücksichtigt man die-einzelnen Eigenschaften von eigenen Betriebssystemen und versucht, den Compiler so auszurüsten, daß das Betriebssystem optimal ausgenützt werden kann. Gerade diese beliebige Anzahl von Routinen macht aus "C" eine besonders leistungsfähige Sprache.
Bild 2 zeigt einige Standardroutinen.
Bei den ST-Rechnern gibt es einige Compiler, die schon eine Sammlung von Routinen anbieten, und die die Nutzung von fertigen Prozeduren, bei GEM wie auch bei TOS, ermöglichen. Bild 3 veranschaulicht einige dieser Spezial-Routinen.
Ein C-Programm besteht in der Regel aus einer Sammlung von Funktionen, die voneinander unabhängig sind. Eine dieser Funktionen muß den Namen "Main" tragen, die andere kann jeden beliebigen Namen tragen. Die "main ()"Funktion signalisiert die Stelle, an der ein Programm beginnt und darf logischerweise innerhalb eines Programms nur einmal erscheinen. Die Funktionen werden durch zwei runde Klammern angedeutet. So ist Plot () nicht gleich plot. Die Klammern dienen außerdem dazu, die formalen Parameter zu umfassen. Wenn keine Parameter existieren, dürfen die Klammern leer bleiben.
Jede Funktion kann sowohl andere Funktionen wie auch sich selbst (Rekursion) aufrufen.
Sehen wir uns ein Beispiel eines kleinen C Programms an:
main ()
printf ("ST-COMPUTER MAGAZIN\n");
Das Programm enthält nur die Funktion main (), die keinen Parameter besitzt, und hat die Ausgabe, "STCOMPUTER MAGAZIN" auf den Bildschirm zu bringen. Die Anweisung "printf" gehört normalerweise zu der Standard E/A-Funktion; sie ist eine der umfangreichsten. Solch ein Programm wird textmäßig nur ein paar Bytes groß sein und nach der Compilierung einige Kbyte.
Wieso dieses immense Wachstum?
Es liegt an den verschiedenen Routinen, die zu "printf" gehören und die in das eigentliche Programm eingebunden werden müssen. Eine Funktion beginnt mit der geschweiften Klammer und endet, wo sie geschlossen wird.
So braucht in der Regel ein in "C" geschriebenes Programm keine Return-Anweisung (sie ist aber trotzdem vorhanden), um auf eine Funktion zurückzukehren.
Ein Programm läuft in der Regel nicht geradlinig. Es werden bestimmte Entscheidungen getroffen, und je nach Ergebnis werden dieser oder jener Zweig verfolgt. Dazu besitzt "C" gewichtige Anweisungen, mit denen der Fluß eines Programms gesteuert werden kann. Die typischen Konstruktionen, die schon durch andere strukturierte Programmiersprachen (z. B. PASCAL) bekannt sind, stehen auch bei "C" zur Verfügung. Eine genaue Beschreibung aller Programmsteuerungen würde den Rahmen dieses Artikels sprengen, deswegen beschränken wir uns auf einige wenige davon.
Die "if"-Anweisung wird am häufigsten benutzt, und trotz ihrer Knappheit ist sie sehr effizient.
Eine typische "if"-Anweisung sieht folgendermaßen aus:
if (logischer Ausdruck) Anweisung
Der logische Ausdruck wird auf "wahr" geprüft. Ist das der Fall, wird die Anweisung ausgeführt. Ist es nicht der Fall, wird die Anweisung übersprungen.
Nehmen wir ein Beispiel:
if (zw == 1) pu++; printf("falsch n");
Zuerst wird geprüft, ob "zw" gleich "1" ist. Falls das stimmt, wird "pu" inkrementiert. Wenn "zw" ungleich "1" ist, wird "printf" ausgeführt.
Unser Beispiel zeigt die einfachste Form der Benutzung der "if"-Anweisung. Die Möglichkeiten sind jedoch größer. Wenn wir nach dem abgefragten logischen Ausdruck eine Reihe von Anweisungen mit geschweiften Klammern umschließen, können wir
ein Bündel von Anweisungen auf einen Schlag ausführen.
Betrachten wir das nächste Beispiel.
if (X> y) pu + +; z = 2; t = z + x;
h=t+3;
Wenn x > y wahr ist, werden alle Anweisungen, die in der Klammer stehen, ausgeführt. Ist dies nicht der Fall, wird weiter mit h = t + 3 fortgefahren. Die "if"-Struktur hat eine Variante, die noch vielseitiger ist als die von uns oben erwähnte. "if" kann in Verbindung mit "eise" gebracht werden, und die gesamte Struktur sieht folgendermaßen aus
if (logischer Ausdruck) Anweisung 1 else Anweisung 2
Wenn der logische Ausdruck wahr ist, wird die Anweisung 1 ausgeführt, wenn nicht, dann Anweisung 2.
Wie schon erwähnt, besitzt "C" noch einige Anweisungen zur bedingten Ausführung von Programmen, sowie zur Programmierung von Schleifen.
Aus Bild 4 können Sie einige dieser Strukturen entnehmen.
Man behauptet, daß in "C" geschriebene Programme fast genauso schnell wie in "Assembler" sind, mit der zusätzlichen Möglichkeit alle Elemente strukturierter Programme zur Verfügung zu haben. Zur Entstehung solcher Gerüchte trägt sogar der Schöpfer dieser Sprache bei. In seinem Buch ("The C programming language", geschrieben zusammen mit Kernigham) beschreibt er, daß diese Sprache die Möglichkeiten heutiger Computer widerspiegelt, und daß es keinen Grund zur Programmierung in Maschinensprache mehr gebe. Natürlich reicht diese Aussage nicht, um überhaupt anzunehmen, daß "C" doch so schnell wie "Assembler" sein könnte. Es gibt aber Elemente, die diese Behauptung bekräftigen. Die Datentypen von "C" sind sehr "maschinenherkömmlich" (Integer, Longs, Char, etc.). Prozessorenoperationen lassen sich durch "C"Operatoren sehr leicht nachbilden. Durch die Bildung von Zeigern lassen sich Adressen direkt ansprechen bzw. Inhalte manipulieren.
Es wäre aber trotzdem ein Unsinn, zu glauben, daß ein "C"-Programm genauso schnell sei wie ein gutes, in "Assembler" geschriebenes Programm.
Eine Alternative, sich "Assembler" zu nähern, bietet aber keine andere hohe Sprache.
"C" ist eine gewichtige Programmiersprache, die man lernen sollte. Für Personal-Computer, unter die auch die ST-Reihe von Atari fällt, sind schon mehrere Compiler auf dem Markt vorhanden. Reichlich Literatur verhilft zum Erlernen dieser Sprache, die man aber nicht nach einem Wochenende beherrschen kann. Vor allem ST-Besitzer sollten diese Sprache erlernen, denn ein Hauch von "C" steckt ganz tief in der Maschine.
KONTROLLSTRUKTUREN BEI 'C'
if (Ausdruck)
Anweisung 1 else Anweisung 2
while (Ausdruck) Anweisung
for (Ausdruck 1; Ausdruck 2; Ausdruck 3)
Anweisung
do
Anweisung while (Ausdruck)
goto
Label
switch (Ausdruck) case ...... case.......
Bild 4: Kontrollstrukturen
Programmieren in C Kernighan und Ritchie Hanser Verlag DM 48,00
Die C-Programmbibliothek Purdum Markt & Technik Verlag DM 60,00
Erfolgreich Programmieren mit C Illik Sybex Verlag DM 58,00
Von BASIC zu C mit dem Atari ST Hartwig Data Becker Verlag DM 39,00
Alle Preisangaben sind ohne Gewähr