Konzepte und Beispiele paralleler Rechnerarchitekturen (I)

Datenverarbeitung im Gänsemarsch stößt an ihre Grenzen

17.05.1985

Wenn Fachleute sich heute über moderne, schnelle Computer und vor allem über die Maschinen der sogenannten "Fünften Generation" unterhalten, kommt unvermeidlich nach kurzer Zeit das Stichwort "Parallelverarbeitung" ins Spiel.

Denn immer weiter greift die Überzeugung um sich, mit Daten rein sequentiell, "im Gänsemarsch", verarbeitenden Computern werde sich nie das Tempo erzielen lassen, das "Künstliche Intelligenz" bieten muß, soll diese jemals mehr sein nur ein faszinierendes Spiel mit Ideen.

Wir müssen unsere gesamte Vorstellung von dem, was ein Computer eigentlich ist, von Grund auf überdenken.

In der Welt der Computerei dominiert immer noch der sogenannte "Von-Neumann-Rechner", der seinerseits wieder als Kombination der theoretischen Konzeption des Engländers Charles Babbage und der praktischen Arbeit des deutschen Pioniers Konrad Zuse betrachtet werden kann. Denn schon Babbage hatte zum Beispiel vor mehr als 100 Jahren die Idee, "bedingte Sprünge" vorzusehen, und schon Zuse formulierte 1936 den Gedanken, das Programm sollte in gleicher Weise wie auch die Daten, im Speicher untergebracht werden, wo es dann ja auch selber Objekt automatisierter Manipulationen werden könnte. Beides zusammen aber, also die bedingten Sprünge und die Speicherung des Programms gemeinsam mit den Daten, sind fundamentale Kennzeichen des sogenannten Von-Neumann-Rechners; allerdings bei weitem nicht alle.

Unüberschaubares Verhalten

In diesem Zusammenhang ist eine Rückblende bemerkenswert, die der bekannte Fachmann für Rechnerarchitekturen, Professor W. K. Giloi von der Forschungsstelle für Innovative Rechnersysteme und -technologie der Gesellschaft für Mathematik und Datenverarbeitung im DV-Wissenschaftler-Blatt "Elektronische Rechenanlagen" (Vol. 26, Seite 55, 1984) anstellt: Einst, nämlich in den 50er Jahren, habe man die Idee des "sich selbst programmierenden Automaten" als Schritt zur Selbstreproduzierbarkeit von Maschinen enthusiastisch begrüßt, doch bald sei man von diesem Gedanken wieder abgekommen und heute werde durch Hardware sogar bewußt verhindert, daß Rechner ihre eigenen Programme ändern können. Man erkannte nämlich, daß die Maschinen dann leicht ein unüberschaubares Verhalten an den Tag legen könnten . . .

Numerische Rechenknechte

Etwas ganz anderes ist es hingegen, Rechner zum Umformen (Kompilieren) eines für Menschen gut lesbaren Programms in eine maschinenverständliche Form einzusetzen. Erst diese Möglichkeit des Von-Neumann-Rechners hat ja die Computer aus der Ecke der reinen numerischen Rechenknechte herausgeführt und ihre weltweite, ubiquitäre Verbreitung in nahezu allen Bereichen unseres Lebens ermöglicht. Denn erst dadurch wurde es möglich, daß auch Nicht-Informatiker ihre - oft ja ziemlich komplexen - Aufgabenstellungen aus irgendeinem Bereich des "wirklichen Lebens" computergerecht formulieren konnten.

Doch zurück zum Hauptstrang unseres Themas. Für die guten alten Rechner nach Babbage, Zuse und von Neumann war und ist zweierlei charakteristisch: Einmal, daß die Programme (von Sprüngen abgesehen) streng sequentiell abgearbeitet werden und zum zweiten, daß die Maschine selber keinerlei Information darüber hat, "was das eigentlich ist",

was sie als "Speicherwort" gerade jeweils aus dem Speicher liest. Denn nur im Kontext der gerade laufenden Operationen wird ja festgelegt, welche Art Objekt die Zentraleinheit da gerade bearbeitet - also etwa einen Buchstaben oder eine Zahl etc. Das heißt, dem Von-Neumann-Rechner sind auf der Hardwareebene "Datenstrukturen", die gleichzeitig auch angeben würden, welche Art von Operationen gerade zulässig sind und welche nicht, unbekannt. Das aber ist, wie noch gezeigt werden soll, ein großer Nachteil.

Daten im Fließband

Doch zunächst ein paar Worte zum Punkt "sequentielles Rechnen": Algorithmen für Computer sind in vielen Fällen so beschaffen, daß es grundsätzlich möglich wäre, einige ihrer Teile gleichzeitig ausführen zu lassen, also "parallel". Dabei unterscheiden Fachleute zwischen "expliziter" Parallelität, die an Hand der Datenstrukturen von außen her erkennbar ist - etwa im Falle von Vektoren und Vektoroperationen - und "impliziter" Parallelität, die erst erkennbar wird, wenn man eine besondere Analyse durchführt.

An dieser Stelle sei kurz eingeschoben, daß auch jene bekannten Rechner, die Daten im Fließbandverfahren ("Pipeline") abarbeiten, in einem gewissen Sinne als Parallelrechner anzusprechen sind, denn hier arbeiten ja beispielsweise fünf einzelne Prozessoren, durch die die Daten und Befehle wie in Henry Fords Autofabrik der Reihe nach hindurchgeschleust werden gleichzeitig. Aber das, was man heute unter "parallelen Rechnern" versteht, ist natürlich etwas viel Umfassenderes. Und obendrein etwas, das erst durch die moderne Mikroelektronik in den Bereich des Realisierbaren gerückt ist. Noch immer ist nicht jedermann in vollem Umfang bewußt, welche Revolution die Entwicklung der modernen VLSI-Schaltkreise bedeutet. Diese Chips machen es nämlich heute im Prinzip möglich, herkömmliche, teure und schnelle Monoprozessorhardware durch eine Vielzahl langsamer, parallel arbeitender und billiger ICs zu ersetzen - und dabei gleich noch allerhand Zusatznutzen einzuhandeln. Denn man kann sich jetzt verstärkt um Architekturen bemühen, bei denen der Rechner "Softwaretransparent" modular um immer mehr Prozessoren erweitert werden kann - so ein Konzept stellen beispielsweise die Intel- Prozessoren der Serie "432" dar, bemerkt Giloi - und man kann auch gleich ein hohes Maß an Fehlertoleranz vorsehen. Außerdem lassen sich jetzt Konzepte entwickeln, bei denen schon die Hardware von Haus aus bestimmte modulare und strukturierte Programmiermethoden und Programmierstile unterstützt und so schon auf Maschinenebene und gleich auch leichter wartbar zu machen.

Neue Chips - neue Architektur

Was für einen Fortschritt diese innovativen Strukturen bedeuten, zeigt ein Vergleich mit dem herkömmlichen Von-Neumann-Rechner, wie oben schon skizziert, der nur eine einzige Art der lnformationsdarstellung, des Speicherzugriffs und der Steuerung der Programmabarbeitung kennt; wo man also im allgemeinen noch nichts weiß von - die Sicherheit erhöhenden - Zugriffskontrollen, von automatischer Fehlererkennung, von

multiplen Prozessoren in einem Netz....

Man sieht hier bereits: Die heutigen Chips ermöglichen den Übergang auf ganz neue Rechnerarchitekturen. Was das vom Grundkonzept her bedeutet, muß an dieser Stelle noch kurz ein wenig vertieft werden: Hat man nämlich unter "Rechnerarchitektur" bislang (vielfach) nur die unterschiedlichen Ausgestaltungen des herkömmlichen Von-Neumann-Rechners verstanden, sich also beispielsweise nur auf die diversen Maschinenbefehlssätze und Betriebssystemanweisungen konzentriert, so ist heute (und hier sei wieder Giloi, der auch ein bemerkenswertes Buch über Rechnerarchitekturen verfaßt hat, zitiert wohl eine weitergehende Definition des Begriffs "Rechnerarchitketur" erforderlich. Danach besteht eine Rechnerachitektur aus zwei Hauptmerkmalen: nämlich aus erstens einem "Operationsprinzip" und zweitens aus der "Hardwarestruktur". Dabei wird das Operationsprinzip wiederum umrissen einmal von den "Informationsstrukturen" in der Maschine und den darauf ausführbaren "Operationen", was zusammen durch sogenannte "Maschinen-Datentypen" beschrieben werden kann, und zweitens durch die "Kontrollstrukturen" für die Operations- und die Datenkontrolle. Die Hardwarestruktur wiederum ist durch die Zahl und Art der Hardwarebetriebsmittel, durch die Art und Weise, wie diese miteinander kommunizieren und durch die Struktur der Protokolle, die ihre Kooperation regeln, bestimmt.

Das mag alles ein wenig papierenabstrakt klingen, ist aber eine gute theoretische Grundlage zum weiteren Durchdenken des Problemkreises "Rechnerarchitektur" und der möglichen und sinnvollen Realisierungen paralleler und anderer Rechner.

Wenn sich jemand schon so grundlegende Gedanken über den Begriff Rechnerarchitektur macht wie Giloi, so muß er dazu tatsächlich ja wohl einen Grund haben - und hier kann man den Grund recht klar erkennen: Es sind die immer unübersehbarer werdenden typischen Nachteile der herkömmlichen Von-Neumann-Rechner, die dem kleinsten Mikro prinzipbedingt ebenso anhaften wie dem schönsten MVS-XA-Jumbo. Man kann sie mit folgenden Stichworten aufzählen:

Von-Neumann-Rechner kennen nur "Bitketten", die im Prinzip jede Art von Informationen repräsentieren können, denn sie tragen ja keinerlei Kennung, die sie etwa als Befehl, als Adresse, als Zustandsindikator oder was auch immer ausweisen würde. Das heißt, im Prinzip kann der Von-Neumann-Rechner auf jeder Bitkette jede ihm überhaupt mögliche Operation ausführen, auch wenn sie "sinnlos" oder gar "schädlich" sein sollte; denn es ist ja allein der momentane Zustand des Rechners, der eine Information darüber liefert, als was diese oder jene Bitkette im Augenblick zu betrachten - und zu behandeln - ist.

Schematische Lücke bei Von-Neumann-Arbeitsweise

Während moderne, höhere Programmiersprachen nun aber mit Datenobjekten arbeiten, die eine Kennung besitzen, aus der sich ihr "Typ" ableiten läßt, kennt der Von-Neumann-Rechner Typenattribute nur als Attribute der Maschinenoperationen. Und das bedeutet, man kann eine "schematische Lücke" zwischen der Arbeitsweise der Von-Neumann-Hardware einerseits und den typisierenden höheren Programmiersprachen andererseits konstatieren. Obwohl sie doch jene Sprachen ausführen soll.

Eine weitere schematische Lücke ist dann noch darin zu sehen, daß diese Art Rechner im Prinzip zu jedem Speicherobjekt, dessen Adresse ihr im Zuge eines Befehls übergeben wird, uneingeschränkt Zugriff besitzt, während höhere Sprachen doch mit Datenobjekten von streng begrenztem Gültigkeitsbereich arbeiten. Es gibt also beim Von-Neumann-Rechner keine Möglichkeit, schon auf Maschinenebene festzustellen, ob nicht vielleicht, etwa infolge eines Softwarefehlers, ein unerlaubter Zugriff getätigt werden soll - und diesen dann auch prompt zu verhindern.

Weitere Nachteile des Von-Neumann-Rechners haben damit zu tun, daß diese Maschinen während der Ausführung eines Programms zu jeder beliebigen Zeit neue Werte an gegebene Objektnamen binden können, was einmal Probleme bei der Implementierung von Parallelarbeit mit sich bringen und zweitens bei der Programmierung schwer überschaubare Seiteneffekte bewirken kann. Außerdem, und hier fällt nun das Stichwort "Von-Neumann-Flaschenhals", können diese Computer in jedem Rechenschritt stets nur den Zustand genau eines einzigen Speicherobjekts transformieren; eines Objekts, das jeweils erst geholt, bearbeitet und dann wieder zurückgeschrieben werden muß. Hier bilden allerdings die speziellen "Vektormaschinen" eine Ausnahme, also die schnellen SIMD-Rechner (SIMD - Single Instruction, Multiple Data) mit ihrer Fließbandarbeitsweise .

Mit einem Schuß Überspitzung kann man heute sagen, die vielbeschworene Softwarekrise resultiere zum Teil auch aus den erwähnten Nachteilen der Von-Neumann-Rechner; insbesondere aus deren notorischer Unfähigkeit, schon auf Hardwareebene zu erkennen, was denn das eigentlich gerade für eine Bitkette ist, die sie da bearbeiten und was sie mit ihr momentan wohl gerade anstellen dürfen und was nicht. Denn das führt zu mangelnder Fehlererkennbarkeit, zu unzureichender Datenintegrität und damit wiederum zu Software, die weder genügend wartbar noch genügend zuverlässig ist.

Nichtssagende Bitketten

Man kann nun diese Nachteile überwinden, indem man auf eine sogenannte "Objektadressierung" übergeht; und tut man das, so erhält man damit gleich auch ein Werkzeug, mit dem sich dann auch parallele Rechnerkonfigurationen mit der gebotenen Sicherheit programmieren lassen. Sie sind ja vor allem zur Überwindung des zeitraubenden Von-Neumann-Flaschenhalses nötig, der aus der sequentiellen Arbeitsweise dieses Rechnertyps resultiert.

Bei der Objektadressierung arbeitet die Maschine schon auf der Hardwareebene mit sogenannten "Datenobjekten" statt mit nichtssagenden Bitketten, und das bedeutet, sie "weiß" nicht nur den Namen und den jeweiligen Wert eines Objekts, sondern sie kann an Hand der besonderen, jedem Datenobjekt anhängenden Attribute auch erkennen, welcher Art (welchen Typs) dieses Datenobjekt eigentlich ist und in welcher Art darauf eigentlich zugegriffen werden darf; also ob sie es nur lesen darf oder auch verändern etc. So läßt sich also zur Laufzeit - und per Hardware! - feststellen, ob das Programm etwa irgendwelche unerlaubten Operationen versucht . . .

Schutz der Objekte

Man kann die hier nur knapp angedeutete Technik, Daten vor unerlaubten Zugriffen zu schützen, noch vielfältig ausbauen. Doch im Rahmen unseres Themas hier ist nur interessant, daß ausgefeilte Techniken zum Schützen der Datenobjekte für das sichere Arbeiten von Mehrrechnersystemen "unumgänglich" sind, wie Giloi hervorhebt. Das wäre im Sinne der weiter oben in einer etwas abstrakten Zwischenbetrachtung erwähnten "Maschinendatentypen" beispielsweise so zu verstehen, daß man einen Rechner so auslegt, daß die Maschine auf bestimmte, einzelne Datenobjekte überhaupt nur mittels ganz bestimmter, vorher festgelegter Funktionen zugreifen kann; auf keine andere Weise sonst. Wodurch erreicht werden könnte, daß die Hardware dann überhaupt keine "unerlaubten " Operationen mehr ausführen kann.

Hat man dafür gesorgt, daß von der Hardware her alles nur Denkbare zur Sicherung der Datenintegrität und zur Verhütung unerlaubter Operationen geschehen ist, so steht man auf einem tragfähigen Boden, von dem aus man nun auch komplexe Mehrrechnerkonzepte zu verwirklichen trachten kann. So läßt es sich an die Überwindung des Tempo kostenden Von-Neumann-Flaschenhalses gehen. Dabei soll jetzt unter "Mehrrechnersystem" primär eine Konfiguration verstanden werden, bei der einzelne Rechner annähernd gleicher Art in "horizontaler" Anordnung parallel arbeiten; daß sie intern noch in mehrere Subsysteme mit funktionell unterschiedlicher Spezialisierung gegliedert sein können, ist in diesem Zusammenhang ein sekundärer Aspekt.

Solche Mehrrechnersysteme können "fest" oder "lose gekoppelt" sein; im ersteren Fall kommunizieren sie alle über einen gemeinsam genutzten Speicher, während sie im letzteren nur "Botschaften" oder auch "Kommunikationsobjekte" miteinander austauschen. Was übrigens dazu führt, daß man bei lose gekoppelten Systemen fast schon von selber zu einer objektorientierten Denkweise gelangt . . .

Lose gekoppelte Systeme einer sehr allgemeinen Form arbeiten mit "verteilter Kontrolle", also ohne einen zentral ,das Ganze steuernden Rechner. Es gibt hier also keine Instanz, die den Zustand des Gesamtsystems jemals kennt - was die Organisation solcher Systeme zwar schwierig macht, aber auch insbesondere Vorzüge schenkt.

Fehlertoleranz gefordert

Denn nur diese Architekturform, so hebt wiederum Giloi hervor, erlaubt es, jede einzelne der Anforderungen, die an moderne Computer gestellt werden sollten, zu erfüllen: also die nach Erweiterbarkeit, nach Fehlertoleranz etc... Weil aber allein schon Fehlertoleranz mit der Zeit mehr und mehr gefordert werden dürfte, werden solche verteilten Systeme (mit loser Kopplung also) immer mehr Verbreitung finden. Zumal die Wissenschaft ja schon nachgewiesen habe, daß man solche Systeme so realisieren könne, daß sie eine hohe Leistung bieten, sicher und zuverlässig arbeiten und sogar noch - was man auf den ersten Blick gar nicht glauben möchte - einfach programmierbar sind.

Denkt man daran, gleich Hunderte oder gar Tausende von Rechnern kooperativ zusammenwirken zu lassen, so gelangt man zu sogenannten Datenflußrechnern, die übrigens sowohl lose als auch fest gekoppelte Systeme sein können. Das sind nämlich Maschinen die in jedem Schritt der Programmausführung selbsttätig herausfinden, welche Operationen im gegebenen Fall gerade parallel ausgeführt werden können und welche bloß sequentiell bearbeitbar sind. Sie bedienen sich dabei eines sogenannten "Datenfluß-Graphen", der wiederum eine spezielle Form des - den CW-Lesern zweifellos bekannten - "Petri-Netzes" darstellt.

Nach heutigem Kenntnisstand ist die Datenflußmaschine die wohl allgemeinste Parallelarbeitsarchitektur; allerdings auch eine, die zwar bequem zu programmieren sein soll, die aber auch einen erheblichen Verwaltungs-Overhead erfordert, der natürlich bezahlt sein will. (Aber die Chips werden ja immer billiger!)

Konkret muß man sich so einen Datenflußrechner als Gruppe einzelner Mikrocomputer vorstellen, die "Datenfluß-synchronisiert" nebeneinanderher werkeln; allerdings ist zu bemerken; daß für die anvisierten Konfigurationen mit Tausenden von Rechnern vorerst noch nicht so recht klar ist, wie man die alle miteinander kommunizieren lassen soll. Doch wird in dieser Richtung intensiv gearbeitet, und neue Entwicklungen wie zum Beispiel der "Transputer" von Inmos mit seinen zahlreichen Kommunikationsleitungen können hier vielleicht als typische Implementierungskonzepte angesehen werden.

Während aber der Datenflußrechner als allgemeines Prinzip etwas unabweichbar Attraktives an sich hat, darf doch nicht übersehen werden, daß man mit speziellen, auf bestimmte Datenstrukturen hin optimierten Rechnern, weitaus effizienter zum Ziel kommt. Denn die automatische Analyse der in einem Programm versteckten, wechselseitigen Datenabhängigkeiten erfordert natürlich einen gewissen Aufwand. Weiß man hingegen beim Erarbeiten eines Programms schon von vornherein, welche Operationen parallel ausgeführt werden können, so kann man ja auch die Steuerung des Programmflusses von vornherein entsprechend auslegen und ein hohes Maß an Parallelarbeit viel billiger erzielen.

So gibt es beispielsweise einen schnellen, speziellen Prozessor für Aufgaben der Bildanalyse, der die entsprechenden Programme bis zu 100mal schneller abarbeitet als ein Universal-Mikroprozessor. Wollte man nun das Tempo, das dieser Spezialprozessor zusammen mit einem Mikro- "Host" -Rechner erzielt, mit einer Datenflußarchitektur erreichen, so wären dafür statt bloß zwei gleich mehrere hundert Einplatinenrechner vom Typ der Hostmaschine ("68 000") nötig . . . !

Nun werden Mikrorechnersysteme zwar zusehends preisgünstiger, weshalb in der Zukunft, die den herkömmlichen Mainframecomputern sicher mehr und mehr Konkurrenz seitens innovativer Mikrorechnermehrprozessorsysteme bringen wird, die Realisierung solcher aufwendigen Datenflußarchitekturen leichter und leichter möglich sein wird. Aber das ändert natürlich nichts daran, daß eine optimierte Datenstrukturarchitektur, also im skizzierten Beispiel der auf Bildanalyse-Algorithmen optimierte Rechner, immer noch viel kostengünstiger sein wird.

An diesem Punkt ist es sinnvoll, den Unterschied zwischen Algorithmen mit "expliziter" und mit "impliziter" Parallelität kurz noch etwas eingehender zu beleuchten. Ein gutes Beispiel für die ersteren sind jene, die mit Vektoren zu tun haben, denn da weiß man sofort, daß hier Parallelarbeit möglich ist.

Mit impliziter Parallelität hingegen hat man es zu tun, wenn man nicht einfach schon a priori erkennen kann, hier lassen Teilprogramme sich parallel ausführen, sondern wenn dies erst durch eine Datenbankabhängigkeits-Analyse festgestellt werden kann. Also durch genau jene Art von Untersuchung, die der Datenflußrechner leisten soll.

Nun gibt es aber bekanntlich eine Reihe von Bemühungen, vom herkömmlichen, prozeduralen Programmierstil - wobei der Mensch dem Rechner Schritt für Schritt genau vorschreibt, auf welche Weise er die Daten zu behandeln hat, um ein Ergebnis liefern zu können - zu einem rein "deskriptiven" zu finden, bei dem Rechner quasi nur noch gesagt bekommt, such die und die Lösung; was er dann im einzelnen tut, um sie zu finden, bleibt ihm überlassen. Was natürlich - und konkret werden solche Aufgaben zum Beispiel im Rahmen der Sprache Prolog formuliert - dazu führt, daß der Rechner mitunter viele Millionen einzelner Elementaroperationen ausführen muß, wenn er quasi "ausprobiert", welcher der vielen möglichen Wege zum Ziel führt.

Immense Arbeit

Solche Rechner sollen wegen der großen Zahl von Operationen, die sie - und zu ihnen werden auch die Maschinen der sogenannten V. Generation gerechnet - ausführen müssen, möglichst schnell arbeiten. Ihre Arbeit läßt sich jedoch dadurch beschleunigen, daß man die Tatsache nutzt, daß eben dieses "Ausprobieren" Parallelität in hohem Maße aufweist, und zwar Parallelität in Form teils der Und- und teils der Oder-Parallelität. Und das erklärt nun wieder auf ganz natürliche Weise, warum das Konzept der Mehrprozessorrechner immer mehr Freunde findet: Denn wohl erst mit so einem Rechner wird es möglich sein, jene immense Rechenarbeit zu bewältigen, die die Maschinen, sollen sie wirklich einmal so etwas wie "Künstliche Intelligenz" vorweisen können, leisten müssen.

Durchbruch erhofft

Und hier ist nun allerdings doch wieder von Multiprozessor-Systemen, des allgemeinsten Typs, also der Datenflußarchitektur die Rede. Denn das ist genau der Typ Rechner, von dem sich viele Fachleute auf Grund (auch) seiner automatischen Datenabhängigkeitsanalysen versprechen, er werde den erhofften, qualitativen Durchbruch von den heutigen Von-Neumann-Einprozessor-Computern zu "Intelligenzautomaten" ganz neuer Art ermöglichen.

Einen Sprung allerdings auch, der unser aller fortlaufend wachsende Abhängigkeit vom Funktionieren komplexen technischer Systeme wohl kaum vermindern wird. Sondern der die faktische "Symbiose" zwischen Gehirn und Computer, die allenthalben immer deutlicher sichtbar wird, noch enger - und vielleicht sogar unlösbarer - machen dürfte.

Parallelverarbeitung

Zu den Themen, die in EDV-Fachkreisen in letzter Zeit mehr und mehr Interesse gefunden haben, gehört auch die parallele Datenverarbeitung, also die Abkehr vom herkömmlichen Uni-Prozessor. Sie tritt, in zahlreichen Konzepten und Produkten, in höchst vielgestaltiger Form zutage und wird auch von Wissenschaftlern mit zu den interessanten Forschungsbereichen der modernen Informatik gezählt.

Die CW will das Gebiet "Parallelverarbeitung", beginnend mit diesem Heft, in einer losen Folge themengerichteter Beiträge von mehreren Seiten beleuchten, ohne aber wissenschaftliche Systematik oder enzyklopädische Vollständigkeit anzustreben. Dabei wird der Bogen der Texte, die die wichtigsten Aspekte des Parallel-Processing abdecken sollen, von der reinen Theorie bis zu praktisch nutzbaren Produkten der einschlägigen Industrie gespannt.

es