Belebung der Sprachdiskussion durch Mikrocomputer: Konzeption andersartiger Programmiersprachen neu belebt

08.02.1985

Betrachtet man die Sprachenlandschaft der Groß-EDV, so ist festzustellen, daß sich nur die bereits in den 50er Jahren entwickelten Programmiersprachen einer allgemeinen Verbreitung erfreuen und die etablierten Kreise der Datenverarbeitung kaum eine Neigung zeigen, diese Situation grundlegend zu ändern. Die einzige Ausnahme von Bedeutung hierzu bildet wahrscheinlich die Entwicklung der Sprache ADA im Auftrag des amerikanischen Verteidigungsministeriums.

Diese Situation ist um so bemerkenswerter, wenn man bedenkt, daß die Entwickler der so erfolgreichen Programmiersprachen wie zum Beispiel Cobol und Fortran das Beharren auf veralteten Sprachkonzeptionen in keiner Weise gutheißen, und sowohl Grace M. Hopper wie auch John Bachus haben dieses auf der ACM-Konferenz über "The History of Programming Languages" 1978 in Los Angeles sehr deutlich zum Ausdruck gebracht.

G. M. Hopper, die mit ihrer Programmiersprache Flowmatic den wesentlichen Grundstein der Programmiersprache Cobol gelegt hat, brachte bereits Anfang der 50er Jahre in der Nomenklatur ihrer ersten Programmiersprachen, die sie A0, A1, A2 und B0, B1 nannte, zum Ausdruck, daß es für verschiedene Benutzerkreise und Anwendungen unterschiedliche Programmiersprachen geben sollte, und daß die Entwicklung und Verbesserung von Programmiersprachen ein fortlaufender Prozeß ist.

Wie dringend notwendig eine Revision der allgemeinen Haltung ist, erkennt man rasch, wenn man bedenkt, daß die technischen Voraussetzungen für die heute noch allgemein verbreiteten Datenbankanwendungen und Konversationsprogramme viel später entstanden sind, als die heute gebräuchlichen Programmiersprachen.

Kommunikation zwischen Mensch und Rechner

Die rasche und weite Verbreitung des Mikrocomputers hat es in sehr positiver Weise mit sich gebracht, daß insbesondere auch von der Jugend, die durch die Tradition nicht so sehr belastet ist, die Diskussion um andersartige Konzeptionen von Programmiersprachen neu belebt wird.

Glaubhafte Berichte aus Amerika informieren uns darüber, daß mit der vom MIT entwickelten Programmiersprache LOGO bereits Kindern im Vorschulalter der gestaltende Umgang mit Computern ermöglicht wird. Edward Yourdon, einer der Väter der "Structured Techniques", erwähnte zum Beispiel kürzlich, daß seine vierjährige Tochter anhand dieser Sprache solche Begriffe wie Parameter, Parameterübergabe und rekursives Programmieren gelernt habe.

Alle Programmiersprachen dienen der Kommunikation zwischen Mensch und Computer; sie unterscheiden sich jedoch in mancherlei Hinsicht: Einige Sprachen bieten dem Programmierer einen großen Einfluß auf die Realisierung hardwaremäßiger Abläufe, erfordern aber eine Terminologie, die von der Denkweise des Menschen weit entfernt ist; andere Sprachen wiederum erleichtern dem Anwender die Programmierarbeit, weil sie durch gewisse Serviceleistungen seiner Denkweise näherkommen. Zur Realisierung dieser Sprachen ist jedoch eine größere Distanz zur Instruktionsebene des Rechners zu überbrücken. Nach diesen und ähnlichen Kriterien unterscheide ich folgende fünf Sprachebenen, wobei aber zu beachten ist, daß der Übergang zwischen den Sprachebenen fließend ist und sich deshalb manche Programmiersprachen nicht exakt einer Ebene zuordnen lassen.

1. Ebene: Interncode

Interncodes sind Sprachen, die sich sehr stark an der existierenden Hardware orientieren. Aus diesem Grunde nennt man sie auch Maschinensprachen. Der besondere Vorteil dieser Sprachen ist ihre Maschinen nähe, das heißt der Programmierer ist in der Lage, mit ihnen die Möglichkeiten der jeweiligen Maschine voll auszunutzen und somit sehr effiziente Programme zu schreiben. Allerdings ist die Wartung solcher Programme, die sich aus Folgen von Zahlen zusammensetzen, sehr schwierig, da sich nachträglich Änderungen auf die explizit anzugebenden Adressen auswirken.

2. Ebene: Assemblersprachen

Ähnlich wie beim Interncode entspricht ein Assemblerbefehl genau einem Maschinenbefehl. Es ist beim Assembler also auch möglich, die existierende Hardware voll auszunutzen. Der Vorteil gegenüber den Maschinensprachen ist die mögliche Darstellung von Adressen durch Symbole, um eine bessere Lesbarkeit von Programmen zu ermöglichen. Auch kennt der Assembler mnemotechnische Abkürzungen für Operationscodes, so daß das mühsame Codieren durch Binärzahlen auf ein Minimum reduziert wurde. Allerdings verliert der Programmierer leicht den Überblick über seine Programme, wenn er komplexe Algorithmen darstellen soll, da diese in eine Vielzahl von Einzelbefehlen aufgelöst werden müssen. Es gilt also die allgemein bekannte These, daß die Möglichkeit, leicht Algorithmen zu formulieren, effizienter ist, als die maschinennahe, ausführbare Codierung .

3. Ebene: Problemorientierte Sprachen

Diese Sprachen zeichnen sich dadurch aus, daß sie die Möglichkeit bieten, mathematische Formulierungen durch spezielle sprachliche Gebilde auszudrücken. Sie sind maschinenunabhängig und werden durch Compiler in die jeweilige Maschinensprache übersetzt. Dadurch geht natürlich der Einfluß des Programmierers auf die Hardware verloren, was dazu führt, daß der erzeugte Maschinencode nicht immer optimal ist. Die Wartbarkeit solcher Programme ist in der Regel recht gut da sie relativ überschaubar und deswegen leicht zu lesen sind.

Die bekanntesten Vertreter dieser Sprachklasse sind Fortran, Cobol PL/ 1 und Pascal.

4. Ebene: Anwendungsorientierte Sprachen

In der Anwendung von problemorientierten Sprachen stellte sich bald heraus, daß sie für spezielle Anwendungsgebiete zu allgemein waren, da man für gewisse Verarbeitungen des entsprechenden Anwendungsgebietes zu wenig Sprachelemente zur Verfügung hatte. Deshalb wurden Sprachen entworfen, die für spezielle Anwendungen elementare Algorithmen und spezifische Datenelemente enthielten, und so auf das entsprechende Anwendungsgebiet zugeschnitten sind. Mittlerweile existieren eine Fülle von anwendungsorientierten Sprachen, wie zum Beispiel Lisp, APL, Plato, Plancode, ITS/73, Matlan, um nur einige zu nennen.

5. Ebene: Deskriptive Sprachen

Während in den Programmiersprachen der bisherigen Ebenen in der Hauptsache Abläufe formuliert werden, werden bei den deskriptiven Sprachen die gewünschten Ergebnisse beschrieben. Die Befehlsabläufe werden von den jeweiligen Übersetzern der deskriptiven Sprachen erzeugt. Der Nachteil dieser Sprachen ist, daß sie nur für ein sehr stark eingeschränktes Anwendungsgebiet Verwendung finden können. Die bekanntesten Sprachen dieser Ebene sind die sogenannten Report-Generatoren, die sehr rasche Auswertungen von Datenbeständen gestatten.

Zusammenfassend kann man sagen, daß mit dem Übergang zu einer höheren Sprachebene ein neuer Service durch die Programmiersprache geleistet wird, der aber mit dem Verlust eines gewissen Einflusses auf die Implementierung andererseits bezahlt werden muß. Mit zunehmender Steigerung der Hardwareleistungen einerseits und Fortschritten in der Theorie der Implementierung werden diese Verluste aber bedeutungslos. Daß der Übergang zu höheren Sprachebenen sich dennoch nicht stürmisch vollziehen wird, hängt mit gewissen Trägheiten im menschlichen Verhalten zusammen, die zum Beispiel in dem Buch von G. M. Weinberg "The Psychology of Computer Programming" sehr anschaulich geschildert werden.

Wechselseitige Ergänzung von Mikros und Sprache

Während die sehr hohen Programmiersprachen einem größeren Kreis von Anwendern die Fähigkeit vermitteln, aktiv Computeranwendungen zu gestalten, bringt die Entwicklung der Mikrorechner es mit sich daß größere Kreise von Anwendern sich den Einsatz von Computern wirtschaftlich leisten können. So ist es nicht verwunderlich, daß man die rasche Verbreitung der Mikrocomputer zum Teil der Verfügbarkeit einer bestimmten Kategorie von Softwareprodukten, den sogenannten "Spread-Sheets", zuschreibt.

Die entsprechenden Softwareprodukte auf den Mainframe-Rechnern sind die sogenannten Planungssprachen, die nicht selten den Spread-Sheets sehr ähnlich, aber entsprechend ihrer Herkunft auf die Verarbeitung größerer Datenvolumina und die Bewältigung komplexerer Aufgaben ausgerichtet sind.

Ausgangspunkt der Definition einer Planungssprache ist die im Bereich von Großunternehmen bekannte Aufgabe, numerische Berichte, die von vielen Unternehmensanteilen erstellt werden, zu prüfen, zu analysieren und zentral zu einer Gesamtübersicht zusammenzufassen. Da diese Aufgabe immer in Verbindung mit der Durchführung formaler Planungssysteme in Großunternehmen zusammen auftritt, hat sich für die Bezeichnung von Softwareprodukten, die diesen Prozeß unterstützen, der Begriff "Planungssprachen" eingebürgert. Im Laufe der Jahre hat es weit über 100 Sprachen dieser Kategorie gegeben, die sich bezüglich ihres Leistungsumfanges sehr stark unterscheiden.

An dieser Stelle sei auf die Forschungsarbeiten und Seminare des BIFOA Köln hingewiesen, das sich bereits Anfang der 7Oer Jahre intensiv mit diesem Thema auseinandergesetzt hat. Natürlich ist das Anwendungsspektrum solcher Sprachen nicht strikt auf die Unternehmensplanung begrenzt, sie sind vielmehr überall dort einsetzbar, wo im Rahmen von Planungs-, Entscheidungs- und Analyseprozessen ähnliche Datenstrukturen zu verarbeiten sind. Charakteristisch für diese Anwendungen ist, daß die Daten in Form numerischer Berichte vorliegen und verarbeitet werden.

Ferner spielen Fragen der Integration mit anderen Anwendungen eine

bedeutende Rolle. Insofern ergibt sich für jemanden, der sich seit Jahren mit diesem Gebiet beschäftigt hat, im Hinblick auf die Integration der Personal Computer keine grundsätzlich neue Fragestellung, sondern lediglich die Aufgabe, eine neue Technologie, nämlich den Mikrocomputer, in das Konzept der allumfassenden Integration mit einzubeziehen.

Obwohl einer der stärksten Gründe für die Einführung des Mikros die Loslösung von der Groß-EDV ist und damit die Befreiung von einem Zwang zu einer ungeliebten Disziplin, welche die unabdingbare Voraussetzung für die Zentralisierung vieler Funktionen im Großrechner mit sich bringt, so gibt es doch wiederum gewichtige Gründe, den Arbeitsplatzrechner mit dem Groß-Computer zu koppeln. Eine nüchterne Betrachtung der technischen Möglichkeiten beider Rechnerkonzeptionen zeigt, daß sie sich geradezu in idealer Weise ergänzen. Der Vergleich der Datentransfer-Geschwindigkeit zwischen dem Hauptspeicher und dem Bildschirm einerseits und dem Hauptspeicher und dem peripheren Speicher für Mainframe- und Mikro-Rechner andererseits zeigt, daß sie sich genau gegenläufig verhalten.

Die Übertragung von Informationen aus dem Hauptspeicher auf den Bildschirm, die auf dem Großrechner zuweilen unerträglich langsam abläuft, ist auf dem Mikro um Größenordnungen schneller. Dieses ist einerseits durch die technischen Übertragungsraten bedingt, andererseits aber dadurch, daß der Großrechner sich grundsätzlich mit anderen Aufgaben beschäftigt, während der Benutzer ungeduldig vor dem Bildschirm auf Antworten wartet. Andererseits ist sowohl die Speicherkapazität wie auch der Zugriff auf die extern gespeicherten Daten beim Großrechner um Zehnerpotenzen größer als bei dem derzeitigen technischen Stand der Mikro-Rechner. Auch die interne Verarbeitungsgeschwindigkeit ist bei den Großrechnern noch um einiges schneller. Insofern ist es für den Benutzer von Mikrocomputern wünschenswert, im Bedarfsfalle größere Datenvolumina auf dem Zentralrechner zu speichern beziehungsweise Teilinformationen aus umfassenderen Datenbeständen vom Großrechner abzurufen und eventuell auch zeitaufwendige Verarbeitungsprozesse an den Großrechner zu delegieren.

Steigende Anwenderwünsche verschlingen Kapazitäten

Für den Anwender von Großrechnern stellt sich die Situation etwas anders dar. Seit Jahren bietet die Entwicklung Rechner mit immer größerer Verarbeitungsgeschwindigkeit und Speicherkapazität an. Doch ebenso verschlingen die gesteigerten Anwenderwünsche diese zusätzlichen Kapazitäten, so daß in fast jedem Rechenzentrum der Welt nur mit kurzfristigen Unterbrechungen ein Lavieren um die entstehenden Kapazitätsengpässe herum vorherrscht. Die steigenden Antwortzeiten großer Online-Anwendungen, die durch eine zunehmende Belastung der Kanäle und eine immense Anzahl von simultanen Datenbankzugriffen entstehen, sprechen eine deutliche Sprache. Hier kann der gezielte Einsatz von Mikrocomputern eine erhebliche Entlastung bringen. Einerseits kann der Datentransfer sich auf die tatsächliche Information beschränken, da Aufbereitungsinformationen wie zum Beispiel die Bildschirmmasken vor Ort gespeichert sein können. Andererseits können aber die an den dezentralen Stellen häufig erforderlichen Informationen selbst dezentral gehalten werden. Natürlich ist es für die Realisierung entsprechender Konzepte wünschenswert, wenn sowohl auf dem Mainframe- als auch auf dem Mikro-Rechner die gleiche Entwicklungssoftware zur Verfügung steht.

Für die Entwicklung von Software-Systemen auf Mainframe-Rechnern gab es Anfang der 70er Jahre wohl nur eine akzeptable Programmiersprache, nämlich PL/1. Diese etwa zehn Jahre zuvor von der IBM gemeinsam mit einigen ausgewählten Anwendern entwickelte Programmiersprache sollte als universelle Programmiersprache akzeptiert werden und insbesondere Cobol und Fortran ablösen. Dieses Ziel wurde nicht zuletzt auch durch den Universitätsanspruch, der unvermeidbar eine hohe Komplexität zur Folge hatte, verfehlt.

An einzelnen Komponenten, die diese Sprache für die Softwareentwicklung besonders geeignet erscheinen lassen, seien die internen und die getrennt kompilierbaren externen Prozeduren sowie der Precompiler mit seinen vielfältigen Möglichkeiten als sehr geschmeidige Werkzeuge der Modularisierung erwähnt. Ferner das Konzept der Speicherklassen, welches die optimale Ausnutzung des Hauptspeichers und die Realisierung rekursiver Algorithmen erlauben.

Einbettung von PL/1 in jeweilige Umgebung

Die Fülle der zulässigen Datentypen gestattet zwar die Verarbeitung aller denkbaren Datenstrukturen, belastet jedoch das Lernen dieser Sprache erheblich. Für die Softwareentwicklung ist aber besonders die Verarbeitung von Zeichen- und Bitstrings sehr nützlich. Die Implementierung dieser Sprache mit dem Optimizing-Compiler der IBM zeichnet sich nicht nur durch eine ausgezeichnete Performance, sondern auch durch eine perfekte Einbettung in die jeweilige Betriebssystem-Umgebung aus. Dieses zeigt sich insbesondere durch die entsprechenden Inter-Language-Features zu anderen Programmiersprachen und durch die Verfügbarkeit von Host-Language-Systemen zu den üblichen Datenbank- und Datenkommunikations-Systemen.

Software-Entwicklung und Programmieren in "C"

"C" ist eine Programmiersprache für allgemeine Anwendungen mit einfacher Ausdrucksweise, modernen Kontroll- und Datenstrukturen und einer reichen Auswahl an Operatoren. Sie ist weder hochabstrahierend noch umfangreich und wurde auch nicht für ein spezielles Anwendungsgebiet entworfen. Aber das Fehlen von Einschränkungen und die allgemeine Verwendbarkeit machen "C" bequemer und effektiver für viele Aufgaben als angeblich mächtigere Programmiersprachen. "C" wurde ursprünglich entworfen und implementiert für das Unix-Betriebssystem auf der DEC PDP- 11 von Dennis Ritchie.

Die meisten Softwareentwicklungen für Mikrocomputer basieren heutzutage auf dieser Programmiersprache. Daß diese Sprache von Softwareentwicklern für die Entwicklung von Software definiert worden ist, macht sie gerade für die Programmierung von Prozessoren und Compilern besonders geeignet. Auch die Implementierung stellt keine übermäßig komplexe Aufgabe dar. Dieses zeigt sich darin, daß schon heute viele gute "C" -Compiler auf dem Markt angeboten werden.

Betrachten wir den Anschluß des Mikro-Rechners an den Mainframe-Rechner, so stellt sich dieser aus der Sicht des Großrechners sehr einfach dar. In einem 3270-Terminal-Netzwerk wird ein 3270-Terminal hardwaremäßig substituiert durch einen speziell ausgerüsteten IBM Personal Computer. Softwareseitig ist auf dem Großrechner keine Änderung vorgesehen. Das heißt die gesamte Mühe zur Erreichung der Integration ist auf der Seite des Arbeitsplatzrechner zu erbringen. Auf dieser Seite ist jedoch eine hardwaremäßige und softwaremäßige Anpassung vorzunehmen.

Zunächst wird der Mikro mit einer auf dem Markt erhältlichen Zusatzkarte, der sogenannten IRMA-Karte aufgerüstet. Diese Karte enthält die CPU 8x305. Ihre Funktion ist es einerseits, dem 3270-Terminal-Controller die Existenz eines 3270-Bildschirms vorzugaukeln, andererseits es den Programmen des IBM PC zu ermöglichen, die Messages, die auf diesem virtuellen 3270-Bildschirm ankommen, zu lesen und selber Messages über diesen virtuellen Bildschirm an den Großrechner abzugeben. Die erste Aufgabe, die für die Integration zu lösen war, war die Entwicklung entsprechender "C" -Routinen, welche die IRMA-Karte ansteuern. Funktionsmäßig entsprechen diese Routinen dem BIOS-System des PCs für die Ansteuerung der üblichen Peripherie.

*Horst Burwick ist Geschäftsführer der GMI Gesellschaft für Mathematik und Informatik mbH, Aachen.