Weltsprachen: Sprachführer für Programmierer

Rund 1000 Programmiersprachen gibt es, zehn bis 20 sind weltweit verbreitet. TOS stellt die wichtigsten vor und nennt ihre Stärken und Schwächen.

Spätestens wenn in allen Actionspielen die Bestenlisten mit unserem Namen gefüllt und die Lösungswege mehrerer Adventures bekannt sind, kommt der Gedanke auf, einmal »etwas Vernünftiges« mit dem Computer anzufangen. Ideen aus dem eigenen Heim gibt es zuhauf, aber: Bitte, wie sag' ich meinem Computer, daß er endlich die Haushaltskasse auf Vordermann oder die CD-Sammlung in Ordnung bringen soll?

Höchste Zeit, ein entsprechendes Programm zu kaufen. Oder, was wesentlich kreativer ist, eine Programmiersprache zu erlernen und selbst ein kleines CD-Verwaltungsprogramm zu schreiben. Doch bevor wir zum Händler fahren, um einen geeigneten Compiler beziehungsweise Interpreter zu erwerben, sollten wir uns doch erst einmal schlau machen, was diese Begriffe bedeuten. Und überhaupt, welche Sprache soil's denn sein?

Sprachengeschichte

Um diese Frage zu beantworten, begeben wir uns zunächst auf eine Reise in die fünfziger Jahre, als die Computer immer kleiner wurden. Firmen, die damals spezielle Programme benötigten, verlangten nach einer neuen Art der Programmierung. Diese mußte über die Eingabe von endlosen Zahlenkolonnen hinausgehen.

Der erste Schritt in diese Richtung war Assembler, bei dem die Programmierer statt der Zahlen Kurzformen der entsprechenden Prozessor-Befehle eingaben. Bald folgten die ersten Hochsprachen »Fortran« und »ALGOL60«, welche die Programmierung im Vergleich zu Assembler wesentlich vereinfachten. Die Spezialisierung der Computer forderte immer wieder neue, für verschiedene Anwendungen zugeschnittene Programmiersprachen. Von etwa 1000 verschiedenen Sprachen sind zehn bis 20 weltweit verbreitet. Darunter befinden sich zum Beispiel die Sprachen ADA (für militärische Zwecke), Assembler, Basic, C, Cobol, Forth, Modula, Pascal, Prolog (für Problemlösungen mit künstlicher Intelligenz), Lisp, Fortran (»Formula Translation«) und Algol (Algorithmic Language, beide für technisch-wissenschaftliche Probleme), Logo (bekannt für die einfach zu erlernende Grafikprogrammierung) und PL/1 (Programming Language One, für allgemeine Probleme).

Auf dem Atari ST sind die Sprachen Basic, C, Assembler und Pascal am weitesten verbreitet. Wer sich wundert, daß TOS hier nicht genannt wird, dem sei gesagt, daß dies keine Programmiersprache ist, sondern ein fertiges Programm - geschrieben in den Sprachen C und Assembler. TOS ist das Betriebssystem der Atari ST/TT Serie.

Was ist eine Programmiersprache?

Was aber genau ist eine Programmiersprache? Der Informatik-Duden offenbart uns: Eine »Sprache zur Formulierung von Rechenvorschriften, das heißt von Datenstrukturen und Algorithmen, die von einem Computer ausgeführt werden können.« Anders formuliert: In einer Programmiersprache schreibe ich ein Programm. Dieses sagt dem Computer, was er machen muß, um mit vorgegebenen Informationen und Daten ein Problem zu lösen. Der Weg, den der Rechner bei der Problemlösung beschreiten muß, heißt Algorithmus. Das Problem kann vielfältiger Natur sein, so zum Beispiel das Lösen von Gleichungssystemen, das Speichern und Finden von Daten, das Steuern von Robotern oder eben das Verwalten der Haushaltskasse. Ein solches Programm besteht aus vielen verschiedenen Anweisungen, auch Befehle genannt. Diese kommen oft aus dem Englischen, wie zum Beispiel »PRINT« für das Drucken oder »INPUT« für die Eingabe von Daten. Bei der Entwicklung von Algorithmen sind Struktogramme hilfreich. Hierbei entwerfen Sie in verbaler Form ein Ablaufdiagramm, das der Computer Schritt für Schritt abarbeiten soll.

Was ist bei der Entscheidung für eine Programmiersprache zu beachten? Ist die Sprache anwenderfreundlich, das heißt, ist sie einfach zu erlernen und sind auch umfangreichere Aufgaben mit wenigen Zeilen Programmtext zu bewältigen, so hat der Computer mehr Arbeit, die Sprache erst einmal in für ihn verständliche Befehle umzusetzen. Ist sie andererseits für den Computer leicht zu verstehen, so hat der Programmierer die Mühe, das komplexe Problem mit elementaren Befehlen für den Computer aufzubereiten. Der Vorteil solch einer Sprache ist die hohe Geschwindigkeit, mit der das fertige Programm läuft. Ein weiterer Punkt ist die Spezialisierung der Sprache: Ist sie so allgemein gehalten, daß sie sich für viele verschiedene Zwecke einsetzen läßt, ist der Programmieraufwand wesentlich höher als bei einer Sprache, die für einen bestimmten Bereich zugeschnitten ist. Zum Beispiel sind zur Lösung vieler mathematischer Probleme nur Sprachen mit hoher Stellengenauigkeit geeignet.

Compiler und Interpreter

Wie funktioniert eine Programmiersprache? Im Prinzip dient sie als Übersetzer, der die für uns verständlichen Befehlswörter in Computer-gerechten Maschinencodewandelt (eine Aneinanderreihung von Hexadezimalzahlen, also Zahlen aus dem 16er-System). Zuerst muß das Programm in den Computer kommen. Das geschieht in der Regel über einen sogenannten Editor, eine Art einfachere Textverarbeitung. Spezielle Editoren prüfen bereits bei der Eingabe der Zeilen, ob diese korrekte Befehle enthalten. Wollen wir das Programm starten, so scheiden sich die Geister: Eine Interpretersprache holt jeweils einen Befehl aus dem eben geschriebenen Programm und überprüft anhand einer Liste, ob dieser Befehl tatsächlich existiert. Falls ja, führt der Interpreter ein Maschinenprogramm aus, das der Anweisung der Programmiersprache entspricht. Falls nein, meldet er einen Fehler und springt in den Editor, damit der Programmierer die falsche Anweisung korrigieren kann.

Komplizierter sind Compilersprachen: Vor Programmstart übersetzt der Compiler das gesamte Programm und untersucht es auf syntaktische Fehler. Ein »Linker« verbindet das so erzeugte Maschinenprogramm mit verschiedenen Programmteilen aus einer fertigen, bereits übersetzten oder in Maschinensprache geschriebenen Programmbibliothek zu einem lauffähigen Programm. Der Vorteil einer Compilersprache liegt in der hohen Geschwindigkeit des übersetzten Programms (Compilat) und in der Möglichkeit, mit dem Linker vorgefertigte Programmteile (Ein- und Ausgabefunktionen, Grafikfunktionen, etc.) in das eigene Programm einzubauen.

Bei der Interpretersprache haben wir diese Vorzüge nicht: Da diese Sprachen den Programmtext bei jeder Ausführung immer neu übersetzen, ist die Geschwindigkeit nicht so hoch wie beim Compiler. Außerdem benötigen diese Programme zum Ablauf immer das Interpreterprogramm. Zusammen mit dem Linker entfällt auch das Einbinden bereits vorhandener Teilprogramme. Dafür bietet eine Interpretersprache bei der Programmentwicklung einen enormen Vorteil: Per Knopfdruck startet der Entwickler das eben geschriebene Programm - ohne die teils langwierige Prozedur des Compilierens.

Für den Einsteiger ist eine Interpretersprache zu bevorzugen, da es ihm ja weniger auf die Geschwindigkeit als auf das rasche Testen seiner Programme ankommt. Für die meisten Interpretersprachen ist zudem ein Compiler erhältlich.

Nach der Programmentwicklung mit dem Interpreter übersetzt der Compiler das Programm in Maschinensprache.

Einen Begriff gilt es im Zusammenhang mit der Geschwindigkeit noch zu klären: die Maschinennähe einer Programmiersprache. Je näher die Sprache an die Maschinensprache herankommt, je ähnlicher die verwendeten Befehle und der Programmaufbau im Vergleich zur Maschinensprache sind, desto schneller sind die Programme. So ist Assembler am nähesten an der Maschinensprache, danach kommen die Sprachen C, Pascal und Modula. Das Schlußlicht bilden Interpretersprachen wie Basic.

Wir wissen jetzt, wie ein Programm eingegeben wird, aber aus welchen Befehlen besteht es ? Da dies von Sprache zu Sprache verschieden ist, gehen wir hier nur auf die grundlegenden Befehlsstrukturen ein, die in fast jeder der hier angesprochenen Sprachen vorkommen.

Zunächst benötigen wir natürlich eine »Eingabe«, die über Tastatur, Diskette, Festplatte, Modem, Lichtgriffel oder Maus stattfindet, sowie die »Ausgabe« auf Bildschirm, Drucker oder einem Speichermedium (Diskette, Festplatte). Damit der Computer die Eingaben nicht gleich wieder vergißt, speichert er sie in »Variablen«. Wie in der Mathematik verwendet er dazu Buchstaben oder auch Wörter, denen er Zahlen oder alphanumerische Zeichen zuordnet. Um mit diesen Variablen arbeiten zu können, benötigen wir einige Rechenoperationen, etwa die vier Grundrechenarten Addition, Subtraktion, Multiplikation und Division. Für wiederholt auszuführende Programmteile sind sogenannte »Schleifen« wichtig. Der Computer führt die Befehle innerhalb einer Schleife solange aus, bis eine bestimmte Bedingung erfüllt oder nicht mehr erfüllt ist. Erst dann fährt das Programm fort. Für Fallunterscheidungen dienen »bedingte Anweisungen«, um etwa auf Eingaben innerhalb eines Menüs unterschiedlich zu reagieren.

Im folgenden nun die Vorstellung einiger Programmiersprachen, jeweils mit einem Beispielprogramm, welches die Ein- und Ausgabe, Variablenzuweisungen sowie einfache Rechenoperationen in der jeweiligen Sprache verdeutlicht.

Assembler

Auf die Frage »Wie sag ich's meinem Computer am schnellsten?« müssen wir mit Assembler antworten. Denn dieser wandelt jeden Befehl direkt in die entsprechende Binärzahl der Maschinensprache um. Dem Programmierer steht also nur der Befehlssatz des verwendeten Mikroprozessors, im Atari ST der Motorola 68000, zur Verfügung. Dieser besteht weitgehend aus den vier Grundrechenarten, einigen logischen Funktionen, sowie Sprung-, Schiebe- und Vergleichsbefehlen.

Als Variablen dienen Speicheradressen, die mit Hilfe des Assemblers Namen erhalten. Nützliche Kommandos wie den PRINT-Befehl suchen wir hier vergebens, gäbe es nicht eine Betriebssystemroutine, welche uns die Arbeit abnimmt. Andernfalls müßten wir für jeden Buchstaben, den wir auf dem Bildschirm ausgeben möchten, direkt im Grafikspeicher die einzelnen Bits setzen beziehungsweise löschen.

In der Praxis hat es sich bewährt, größere Programme in einer Hochsprache zu schreiben, und nur die zeitkritischsten Routinen in Assembler zu entwickeln. Unsere kleines Programm hätte - in Assembler programmiert - eine Länge von etwa 100 Zeilen, weshalb wir auf ein gedrucktes Listing verzichten. Verantwortlich für den Programmierautwand ist die Umwandlung der eingegebenen Zahlen in das für den Computer verständliche Zahlensystem. Nach der Addition ist wiederum die Umwandlung in unser Dezimalsystem erforderlich.

Wen's dennoch interessiert: Auf der TOS-Diskette finden Sie im Archiv »Assembler« den zugehörigen Quelltext.

## TOS-INFO

Name: Assembler

Stärken: Schnellste Sprache □ direkter Zugriff auf die Hardware des Computers

Schwächen: Unkomfortables Programmieren auf unterster Ebene □ Hardware-abhängig

# Basic

Die Sprache Basic wurde zwischen 1963 und 1965 in Amerika am Dartmouth College von John Kemeny und Thomas Kurtz entwickelt und ist inzwischen auf den meisten Computern in verschiedenen »Dialekten« verfügbar. Wie der Name Basic (Abkürzung für »Beginners All purpose Symbolic Instruction Code«) schon sagt, wendet sich diese Sprache vor allem an Computereinsteiger. Ihre Befehlsworte sind alle aus dem Englischen entlehnt. Deshalb ist es für den angehenden Programmierer, der ein wenig Schulenglisch kann, sehr einfach, diese Sprache zu erlernen. Außerdem läßt sie dem Programmierer viele Freiheiten, was jedoch oft zu unübersichtlichen Programmen (auch Spaghetti-Code genannt) führt.

Basic ist eine Interpretersprache. Die fertigen Programme werden oftmals mit Compilern übersetzt, um die Geschwindigkeit der Programmausführung zu steigern. Die Sprache ist nicht anwendungsorientiert, somit vielseitig einzusetzen. Auch für den erfahrenen Programmierer eignet sie sich hervorragend, um ein kleines Hilfsprogramm schnell und problemlos zu entwickeln.

Um einige typische Elemente der Sprache Basic darzustellen, sehen wir uns ein kleines Programm an, welches die Ein- und Ausgabe von Zahlen, sowie einfache Rechenoperationen verdeutlicht:

10 PRINT "Bitte geben Sie zwei Zahlen ein: ";
20 INPUT A,B 
30 S=A+B
40 PRINT "Die Summe von A und B ist: " ; S 
50 END

Dieses Programm entsteht im Editor und wird nach der Eingabe des Befehls RUN vom Computer Zeile für Zeile ausgeführt. In den Zeilen 10 und 20 fordert es den Benutzer auf, die Zahlen A und B über die Tastatur einzugeben. Die Zeile 30 weist der Variablen S die Summe von A und B zu. Das Ergebnis wird in Zeile 40 in einem erklärenden Textauf den Bildschirm ausgegeben. Durch die END-Anweisung am Schluß kehrt der Interpreter wieder in den Editor zurück.

Neuere Basic-Dialekte, wie zum Beispiel GFA-Basic verzichten auf Zeilennummern, das Programm wird einfach Zeile für Zeile ausgeführt. Eine sehr wichtige Verbesserung ist die Einführung von längeren Variablennamen, so daß man statt dem wenig aussagenden S besser Summe schreibt. In GFA-Basic sieht unser Programm so aus:

PRINT "Bitte geben Sie zwei Zahlen ein: ";
INPUT A,B 
Summe=A+B
PRINT "Die Summe von A und B ist: ";Summe

Diese Form ist wohl noch verständlicher als obiges Programm. Die Befehle für eine bedingte Anweisung in Basic sind IF-THEN-ELSE (Wenn-Dann-Sonst), beispielsweise IF A<5 THEN B=1 ELSE B=10, wobei hier der Variable B in Abhängigkeit von A der Wert 1 oder 10 zugewiesen wird. Der Befehl FOR 1 = 1 TO 100 leitet eine Schleife ein, die NEXT I abschließt. Hier ist die Variable I die sogenannte Laufvariable: Sie nimmt zu Beginn den Wert nach dem Gleichheitszeichen an und wird bei jedem Durchlauf erhöht, bis sie den Wert nach dem TO-Befehl erreicht.

## TOS-INFO

Name: Basic

Stärken: Einfach zu erlernen □ auf jedem Computer verfügbar

Schwächen: Gefahr unübersichtlicher Programmierung (Spaghetticode) □ als Interpretersprache langsam

# C

Unter dem Einfluß von BCPL und B wurde zu Beginn der siebziger Jahre die Sprache C von den Programmierern Kernighan und Ritchie aus der Taufe gehoben. Heute weitverbreitet, hat es seine Stärken in der Systemprogrammierung bewiesen: UNIX und TOS sind weitgehend in C geschrieben.

Da C einen minimalen Befehlssatz besitzt, läßt es sich mittels eines Compilers sehr effizient in Maschinensprache übersetzen. Dies bedeutet, daß Programme in C eine sehr hohe Geschwindigkeit erreichen. Die Programmstruktur mit englischen Befehlen, welche mächtiger sind als Assembler-Befehle, läßt ein C-Programm übersichtlicher erscheinen, verglichen mit seinem Pendant in Assembler. Daraus resultiert auch ein weiterer Vorteil von C: Es ist leichter zu erlernen als Assembler, vorausgesetzt es sind schon Erfahrungen in einer anderen Sprache, etwa Pascal vorhanden. Denn System und Disziplin bei der Programmierung muß ein C-Novize mitbringen, da der C-Compiler nicht wegen jeder »Kleinigkeit« meckert: Die Wörter »Apfel« und »Baum« lassen sich problemlos multiplizieren, dividieren, verquadratwurzeln und anderweitig mißbrauchen, der Compiler läßt so ziemlich alles mit sich machen, sofern es nur den C-Konventionen entspricht.

Diesen kleinen Nachteil hebt aber die Tatsache auf, daß C-Programme weitgehend maschinenunabhängig sind, das heißt im Gegensatz zu Assemblerprogrammen sind sie auf verschiedenen Computern ohne große Änderungen lauffähig. Umfangreiche Funktionsbibliotheken ergänzen den kleinen Befehlsumfang. So enthält ein komplettes Entwicklungssystem Bibliotheken, Standardfunktionen zur Ein- und Ausgabe, zu komplexen mathematischen Berechnungen aber auch Ergänzungen wie Grafik- und Soundroutinen. Mit dem bereits erwähnten Linker binden Sie diese Funktionen nach Bedarf in Ihr Programm ein.

Als Grundlage für unser eigenes Betriebsystem hier noch unser kleines Rechenprogramm in C:

#include <stdio.h>
#include <ext.h> 
float a,b, summe; 
main()
{
	printf ("\nGeben Sie zwei Zahlen ein: "); 
	scanf("%f%f",&a,&b); 
	summe = a+b;
	printf ("\nDie Summe von a und b ist: %f", summe); 
	getch(); 
	return(0);
}
## TOS-INFO

Name: C

Stärken: Sehr hohe Geschwindigkeit □ maschinennah und trotzdem übersichtlich □ weitgehend Hardware-unabhängig

Schwächen: Lange Entwicklungszeiten bei größeren Projekten

# Forth

Da die Sprache Forth ein Vertreter der vierten Generation von Programmiersprachen ist, sollte sie ursprünglich Fourth heißen. Die »Legende« besagt jedoch, daß auf damaligen Computern ein Dateiname maximal fünf Buchstaben lang sein durfte. Der findige Entwickler Charles H. Moore entfernte deswegen das »u«. »Forth« ist eine Compilersprache besonderer Art: Sie benutzt bei allen Operationen den Keller (auch Stapel oder Stack), der die in anderen Sprachen üblichen Variablen oftmals ersetzt. Deshalb sind auch die meisten Anweisungen nur zur Manipulation dieses Stapels geschaffen. Die Sprache umfaßt die grundlegensten Kommandos, wie Ein/Ausgabe und Rechenoperationen, die der Programmierer zu neuen, komplexeren Befehlen zusammensetzt. Eigene, zum Beispiel in Assembler entwickelte Anweisungen in den Wortschatz der Sprache aufzunehmen, dienen dazu, sie für Spezialanwendungen anzupassen.

Das Prinzip des Kellers ist einfach und den Besitzern von HP-Taschenrechnern bestens vertraut: Um zum Beispiel eine Rechenoperation durchzuführen, legen wir die Operanden nacheinander im Keller ab. Erst dann erfolgt die Operation. So berechnet sich die Summe aus 2 und 3 mit der Eingabe von »2«, »3« und dem abschließendem »+«.

Um ein Programm zu schreiben, definieren wir uns die Teilfunktionen des Algorithmus als eigene Befehle und fassen diese Anweisungen zu einem einzigen Kommando zusammen. Dieses Kommando führt dann unser Programm aus.

Um die Neugierde zu wecken, kämpfen wir uns jetzt durch sämtliche Keller in unserer Dachbodensumme:

: print cr ."Bitte " . . " . Zahl eingeben: " ;
: input pad 1+ 20 expect pad number? drop ;
: ergebnis cr ." Die Summe beträgt: " . cr cr ;
: summe cr 1 print input 2 print input + ergebnis ; 
summe
## TOS-INFO

Name: Forth

Stärken: Sehr schnell □ leicht um eigene Befehle erweiterbar □ nach Eingewöhnungsphase einfach zu programmieren

Schwächen: Wegen der Stapelverarbeitung weniger für den Einsteiger geeignet da häufiges Umdenken erforderlich

# Fortran

Als eine der ersten, komfortablereren Programmiersprachen entstand Ende der fünfziger Jahre die Compilersprache Fortran. Wie der Name FORmula TRANslation (etwa: Formel Übersetzer) sagt, liegt der Schwerpunkt ihrer Anwendung in der Lösung von Problemen im technisch-wissenschaftlichen Bereich. Sie ist somit eine Hilfe für den technischen Ingenieur oder das angehende Mathematikgenie, da sie aufgrund ihres relativ kleinen Befehlsumfangs leicht zu lernen ist.

Ein besonderes Schmankerl ist die hohe Rechengenauigkeit, Double Precision mit 52 Bit, was einer Genauigkeit von ungefähr 16 Stellen entspricht, sowie die Verarbeitung von komplexen Zahlen. Nicht zu vergessen die hohe Geschwindigkeit des übersetzten Codes, da der Compiler die einfach gehaltenen Anweisungen in ein effizientes Maschinenprogramm umwandelt. Nachteile ergeben sich durch das Fehlen von Befehlen zum strukturierten Programmieren, die über Funktionen und Prozeduren hinausgehen. Ebenso existieren im Standard-Fortran keine komfortablen Grafikbefehle.

Aufgrund ihres Alters ist die Sprache sehr weit verbreitet und auf den meisten Computern verfügbar. Im Zuge der technischen Verbesserungen bei Computern wurde auch der Sprachumfang mit der Zeit erweitert. Der derzeitige Standard ist Fortran77.

Formulierte Translationen oder translierte Formulierungen - hier ist unser absolut unkomplexes Addierwerk:

program summe 
real a,b,summe
write(6,*) 'Bitte geben Sie a und b ein: ' 
read(5,*) a,b
summe = a+b
write(6,*) 'Die Summe beträgt',summe,char(10),
char(10)
end
## TOS-INFO

Name: Fortran

Stärken: Hohe Stellengenauigkeit □ Verarbeitung komplexer Zahlen

Schwächen: Strukturiertes Programmieren nur eingeschränkt möglich □ fehlende Grafikbefehle

# Pascal

Benannt nach dem französischen Mathematiker Blaise Pascal, entwickelte N. Wirth diese Compilersprache 1968 bis 1974 für die Ausbildung von Studenten. Aufgrund ihrer Leistungsfähigkeit und leichten Erlernbarkeit ist sie immer noch an vielen Universitäten aber auch im Informatik-Kurs an der Schule oft die erste Sprache, mit welcher der angehende Programmierer in Berührung kommt. Ihr Vorteil, von manchen auch als Nachteil bezeichnet, ist die Disziplin, die sie vom Programmierer bei der Variablendeklaration (Definieren von Platzhaltern als Fließkomma-, Ganzzahl- oder Zeichenvariablen) und bei der Strukturierung des Programms fordert.

Eine Besonderheit ist die Verwendung von sogenannten Pointervariablen, mit denen sich sehr gut Baumstrukturen und verschiedene Arten von Listen (zur Datenverwaltung) realisieren lassen. Nicht zu vergessen die Möglichkeit zur Definition eigener Variablentypen, wie zum Beispiel den Typ »Tonträger«, und den Elementen »LP,Single,CD,Maxi-CD,Cassette«.

Wie bei allen Compiler-Sprachen entfallen auch bei Pascal Zeilennummern. Variablennamen beliebiger Länge erhöhen zudem die Verständlichkeit.

Das strukturierteste Rechenprogramm aller Zeiten, nun in Pascal:

program summe; 
var a,b,summe : integer; 
begin 
	writeln;
	writeln('Bitte geben Sie a und b ein: ’); 
	read(a,b); 
	summe: =a+b;
	writeln(’Die Summe beträgt: ',summe);
	repeat until keypress; 
end.

(ah)

## TOS-INFO

Name: Pascal

Stärken: Zwingt zu strukturiertem Programmieren □ Definition eigener Variablentypen □ weitgehend Hardware-unabhängig

Schwächen: Relativ lange Entwicklungszeiten



Aus: TOS 08 / 1991, Seite 73

Links

Copyright-Bestimmungen: siehe Über diese Seite