Höllische Programmiersprachen: FORTRAN77
Transcription
Höllische Programmiersprachen: FORTRAN77
Höllische Programmiersprachen: FORTRAN77 Christian Sternecker Technische Universität München, Boltzmannstraße 3, 85748 Garching, Germany [email protected] Abstract. Die Programmiersprache Fortran wird gerne benutzt, wenn es um die schnelle Bearbeitung rein mathematischer Aufgaben geht. Sie ist auch heute noch häufig noch in älteren Standards anzutreffen. Jedoch beinhalten gerade diese älteren Standards, wie viele ältere Programmiersprachen, große Einschränkungen und diverse “höllische” Konzepte. Bei einem dieser älteren Standards, genauer gesagt FORTRAN77 werden sollen hier diese Konzepte herausgearbeitet und erläutert werden. Außerdem findet in unter dem Gesichtspunkt dieser Konzepte ein kurzer Vergleich mit dem nachfolgenden Standard, Fortran 90, statt. Keywords: Programmiersprachen, Fortran, 77, höllische Konzepte, Speicherverwaltung, assigned, GOTO, Sprungbefehle, EQUIVALENCE, COMMON-Block, Typsicherheit, implizite Deklaration, arithmetisches IF, ENTRY. 1 Einleitung Fortran(Formular Translator) wurde 1954 von John Bacus, einem Entwicklungsteamleiter bei IBM erfunden. Der erste Compiler wurde wurde 1957 hergestellt. Bei Fortran handelt es sich um die erste höhere, problemorientierte Programmiersprache. Sie diente dazu, nummerische Probleme unabhängig von der Rechnerarchitektur, auf der das Programm ausgeführt wurde, zu lösen. Da die Sprache sehr gut aufgenommen wurde, wurden bald von allen größeren Herstellern Compiler für ihre Hardware designed, was zur Bildung einer Vielzahl verschiedener Dialekte führte. Um die Sprache zu standartisieren und die Programme portierbar zu machen, wurde 1966 der Standard ANSI X3.9-1966, auch bekannt als FORTRAN66 oder FORTRANIV eingeführt. Er wurde 1978 durch den Standard FORTRAN77 (ANSI X3.9-1978) abgelöst. Die Intention hinter FORTRAN77 war die Einführung von Sprachmitteln zur strukturierten Programmierung(zum Beispiel Schleifen) und zur Verarbeitung von Texten und Dateien(etwa ein Datentyp für ASCII-Zeichen ). FORTRAN77 enthält eine Anzahl “höllischer” Konzepte. Ein Großteil dieser Konzepte wurde mit dem Standard Fortran 90(ANSI X3.198-1992), der 1992 eingeführt wurde1, beseitigt beziehungsweise durch Fortran 90 für veraltet erklärt und 1 Nach Einführung von FORTRAN77 war geplant, bereits 1982 einen neuen Standard einzuführen. dann durch den Standard Fortran 95 aus der Sprache entfernt[9]. Diese “höllischen” Konzepte von FORTRAN77 sollen im Folgenden vorgestellt und erläutert werden. 2 Grundlagen/Abgrenzung 2.1 Kategorisierung Bei FORTRAN77 handelt es sich um eine imperative, strukturierte, prozedurale und modulare Programmiersprache. FORTRAN77 lässt kein rekursives Programmieren zu. 2.2 Besondere Merkmale Als erstes fällt bei FORTRAN77 die noch von Lochkarten stammende Syntax auf. So sind bei einem FORTRAN77-Programm die ersten 5 Spalten einer Zeile für Sprungmarken reserviert, die 6. Spalte enthält ein Leerzeichen oder eine 0 und der ausführbare Code steht in den Spalten 7-72. Sollte eine Anweisung länger sein als 65 Zeichen, so kann sie in bis zu 19 Fortsetzungszeilen fortgesetzt werden. Diese Zeilen werden in der 6.Spalte mit einem Zeichen ungleich leer oder 0 gekennzeichnet. Weitere Besonderheiten der Syntax sind die Beschränkung auf auschließlich aus Großbuchstaben bestehenden Code und eine maximale Länge von 6 Zeichen für Variablennamen. FORTRAN77 verfügt über mächtige Formatvereinbarungen für die Ein- und Ausgabe, auf die hier jedoch nicht näher eingegegangen wird. Da FORTRAN77 hauptsächlich zum Lösen mathematischer Probleme entwickelt wurde, verfügt die Sprache über einen Datentyp für komplexe Zahlen(COMPLEX) und die mathematischen Operationen darauf. Des weiteren existiert ein Potenzoperator(A**B), jedoch kein Modulooperator. Modulooperationen sind aber über die Standardfunktion MOD(A,B) möglich. Viele weitere mathematische Funktionen sind als Standardfunktionen vorhanden. FORTRAN77 verfügt über keinerlei vom Benutzer definierte Datentypen, Records oder Strukturen. Auch Zeiger sind nicht vorhanden. Schließlich bemerkt man bei FORTRAN77 das Fehlen von dynamischer Speicherallokation(dazu mehr unter 3.3) und damit einhergehend die Tatsache, das die Sprache keinerlei Rekursion zulässt. So muss zwischen zwei Aufrufen eines Unterprogramms stets einmal die Rücksprunganweisung dieses Unterprogramms ausgeführt werden[5]. Sich wiederholt gegenseitig aufrufende Unterprogrammen sind somit auch nicht möglich. 3 Höllische Konzepte 3.1 Typsicherheit Implizite Deklaration. In FORTRAN77 wird jeder nicht explizit deklarierten Variable ihr Datentyp anhand des ersten Buchstabens ihres Namens zugewiesen. Variablen mit den Anfangsbuchstaben I,J,K,L,M oder N erhalten den Typ INTEGER, die mit anderen Anfangsbuchstaben den Typ REAL. Diese Zuordnung lässt sich aber durch die IMPLICIT-Anweisung ändern. Sie hat die Form IMPLICIT TYP1(a1,...,ax),...,TYPN(n1,...,ny) IMPLICIT LOGICAL(L) würde zum Beispiel festlegen, das alle nicht explizit deklarierten Variablen mit Anfangsbuchstaben L vom Typ LOGICAL sind. Die IMPLICIT-Anweisung gilt nur für einen Programmteil, muss also für jedes Unterprogramm extra angegebenn werden. Die implizite Deklaration führt dazu, dass Variablen, die aus Unachtsamkeit nicht explizit deklariert wurden, nicht zu Compilerfehlern führen und so leicht übersehen werden können. Dies kann zu schwer aufspürbaren semantischen Fehlern im Programm führen. Fehlen von Typüberprüfungen beim Aufruf von Unterprogrammen. Wird in FORTRAN77 ein Unterprogramm aufgerufen, so werden die Datentypen der Parameter nicht mitübergeben sondern müssen im Unterprogramm erneut deklariert werden. Dabei wird nicht überprüft, ob die Datentypen übereinstimmen. So ist es durchaus möglich, folgendes Programm zu schreiben: PROGRAM TYPEN INTEGER I REAL J I=6 J=4.5 CALL SUBR(I,J) ... END SUBROUTINE SUBR(I,J) REAL I PRINT *,I PRINT *,J RETURN END Dieses Programm würde als Ausgabe nur unbrauchbare Ziffernfolgen produzieren. Bei der Variable I ist ersichtlich dass sie im Unterprogramm fälschlicherweise als REAL deklariert wurde. Da J im Unterprogramm nicht explizit deklariert wurde, greift hier die implizite Deklaration und deklariert J zum INTEGER. Da FORTRAN77 beim Unterprogrammaufruf nicht die Werte, sondern nur die Referenzen auf die Parameter übergibt(siehe 3.3), werden I und J vom Unterprogramm falsch interpretiert, was die unbrauchbaren Ausgaben erklärt. Besonders, wenn die Werte von Unterprogrammen nicht direkt ausgegeben, sondern für weitere Berechnungen verwendet werden, führt die mangelde Typüberprüfung zu schwer auffindbaren Fehlern im Programm. 3.2 Programmstruktur ASSIGN-/assigned GOTO-Anweisungen. Neben den normalen Sprungbefehlen stehen in FORTRAN77 auch sogenannnte gesetzte Sprungbefehle(assigned GOTOs) zur Verfügung. Diese haben die Form GOTO J,(T1,T2,...,Tn) wobei I eine vorher durch die ASSIGN-Anweisung festgelegte ganzzahlige Variable ist. T1 bis Tn ist eine Auflistung der möglichen Sprungziele. Sie kann auch weggelassen werden. Ist sie vorhanden, so ist das Springen zu anderen Zielen nicht möglich. Die ASSIGN-Anweisung hat die Form ASSIGN n TO J wobei n eine Sprungmarke des Programms und J eine ganzzahlige Variable ist. J wird durch die ASSIGN-Anweisung jedoch nicht zu einem INTEGER sondern zu einer so genannten Switch-Variable[5], die nur von assigned GOTOs sinnvoll ausgewertet werden kann. Sie darf keinesfalls einen INTEGER-Wert zugewiesen bekommen, da dies zu Fehlern führen würde, wenn ein assigned GOTO mit ihr aufgerufen wird. Ebenfalls zu Fehlern kommt es, wenn die Switch-Variable als INTEGER interpretiert und für Berechnungen benutzt wird. Solche Fehler werden vom Compiler jedoch nicht entdeckt und sind daher schwer zu finden. Eine mögliche Verwendung von assigned GOTOs zeigt folgendes Beispiel[5]: ASSIGN 20 TO K GOTO 100 20 ... . .. ASSIGN 30 TO K GOTO 100 30 ... ... 100 ... ... 150 ... GOTO K Hier wird die ASSIGN-Anweisung benutzt, um ein Rücksprungziel festzulegen, bevor man in ein mehrfach benutztes Programmstück springt. Dies wäre jedoch mit Hilfe eines Unterprogramms wesentlich einfacher und sicherer, wenn auch mit mehr Rechnaufwand möglich. Die Benutzung von Assigned GOTOs kann und sollte also vermieden werden. DO-Schleifen. Die einzige zur Verfügung stehende Art von Schleifen in FORTRAN77 sind die DO-Schleifen. Sie haben die Form DO n I=e1,e2,e3 dabei ist n die Sprungmarke der letzen Zeile der Schleife, e1, e2, e3 arithmetische Ausdrücke und I ist die Laufvariable der Schleife. e3 ist die Schrittlänge der Schleife(darf negativ sein) und kann auch weggelassen werden, sie wird dann als 1 angenommen. Bei der Berechnung des Schleifendurchlaufzählers z wird folgendermasen vorgegangen: z = INT((e2 - e1 + e3)/e3) (0) INT bedeutet hier Umwandeln des Ausdrucks in den Datentyp INTEGER. Dies ist notwendig, da neben ganzzahligen Größen auch Gleitkommagrößen(einfach und doppelt genau) für e1,e2 und e3 zulässig sind. Bei dieser Berechnung können daher Rundungsfehler auftreten, was dazu führt, dass die Schleife einmal zu selten durchlaufen wird. Weitere Probleme ergeben sich bei den Schleifen in FORTRAN77 daraus, dass sie keine Abbruchbedingung außer dem Zähler enthalten. Da außerdem die Laufvariable I nicht von innerhalb der Schleife geändert werden kann, sind Sprungbefehle die einzige Möglichkeit, die Schleife vorzeitig zu verlassen. Zusätlich ist es noch möglich, dass ineinander verschachtelte Schleifen die selbe Schlussanweisung besitzen. Zum Beispiel wäre folgendes Programstück DO 100 I=1,5 ... DO 100 J=2,7 ... 100 CONTINUE äquivalent zu DO 100 I=1,5 ... DO 110 J=2,7 … 110 CONTINUE 100 CONTINUE Artihmetische IF-Anweisung. Neben der logischen IF-Anweisung verfügt FORTRAN77 noch über eine arithmetische IF-Anweisung der Form IF(EXP) n1 n2 n3 n1, n2 und n3 sind dabei Sprungmarken, zu denen das Programm spring, wenn der arithmetische Ausdruck EXP kleiner, gleich bzw größer als Null ist. Zwei der Sprungmarken dürfen dabei gleich sein. Die arithmetische IF-Anweisung macht das Programm, wie alle Sprungbefehle, schwerer lesbar und fehleranfälliger. Sie kann zwar durch logische IF-Anweisungen ersetzt werden, ist aber vom Rechner schneller ausführbar als diese[4]. Unterprogramme mit mehreren Einstiegspunkten. FORTRAN77 erlaubt es, mehrere Einstiegspunkte für ein Unterprogramm zu definieren. Diese geschieht mittels der ENTRY-Anweisung. Diese enthält einen Namen und eine Liste der übergebenen Paramter, ganz wie der Kopf des Unterprogramms. Dieser Name kann nun wie ein Unterprogramm aufgerufen werden. Wenn dies geschieht, wird das Unterprogramm nicht von Anfang an, sondern ab der ersten Anweisung nach der ENTRY-Anweisung ausgeführt. ENTRY-Anweisungen können im Unterprogramm nur auserhalb von Schleifen und IF-Blocks stehen. Die Parameter, die der ENTRYAnweisung übergeben werden, müssen nicht mit denen übereinstimmen, die dem Unterprogramm selbst übergeben werden. Beispiel: 100 SUBROUTINE PARAM(I,P) INTEGER P INTEGER PARA PARA=P GOTO 300 200 ENTRY NOPARA(I) PARA=0 300 … Wird dieses Programm mit CALL PARAM(1,3) aufgerufen, so beginnt es ganz normal ab Zeile 100 abzulaufen. Wird es mit CALL NOPARAM(1) aufgerufen, so beginnt der Programmablauf mit Zeile 300. Ein Aufruf mit CALL NOPARAM(1,3) ist nicht zulässig. Generell darf in einem Unterprogramm jede Variable verwendet werden, die durch einen Einstigspunkt festgelegt wird. In Verbindung mit der Tatsache, dass beim Übergeben der Parameter keine Typüberprüfung stattfindet(siehe 3.1) kann es so zu nur sehr schwer auffindbaren Fehlern im Programm kommen. Außerdem macht die Verwendung von ENTRY-Anweisungen ein FORTRAN77-Programm noch unübersichtlicher, als es durch die notwendige Benutzung von Sprungbefehlen(siehe DO-Schleifen) bereits der Fall ist. 3.3 Speicherverwaltung Fehlen von dynamischer Speicherallokation. Die Speicherverwaltung von FORTRAN77 ist rein statischer Natur. Das bedeutet, dass der gesammte vom Programm benutzte Speicherplatz zum Übersetzungszeitpunkt bekannt sein muss, da zur Laufzeit kein zusätzlicher Speicher belegt werden kann. Dies führt zum einen dazu, dass mit FROTRAN77 keine Rekursion möglich ist, da dazu ein Rücksprungkeller mit zum Übersetzungszeitpunkt unbekannter Größe nötig wäre. Zum anderen muss der Speicherplatzbedarf aller Variablen, insbesondere die Länge von Feldern und Zeichenketten im Programm statisch festgelegt werden. Deshalb müssen Felder immer groß genug angelegt werden, um die im worst case zu erwartende Datenmenge aufzunehmen. Daher kann es sehr schnell zu sehr großem Speicherplatzbedarf für ein FORTRAN77-Programm kommen. Der einzige Vorteil der statischen Speicherverwaltung ist der geringere Rechenaufwand(und damit eine kürzere Laufzeit des Programms) gegenüber dynamischer Speicherverwaltung. Parameterübergabe an Unterprogramme. Beim Aufruf eines Unterprogramms mit Parametern in FORTRAN77 werden nicht die Werte der Paramter, sondern die Speicheradresse der Variablen übergeben mit denen das Unterprogramm aufgerufen wurde2. Andere Informationen wie der Typ der Variablen oder die Länge von Feldern werden nicht übergeben, sie müssen im Unterprogramm neu festgelegt werden. Das Unterprogramm berücksichtigt nur die Reihenfolge der Parameter beim Abbilden von formalen auf aktuelle Parameter. Dadurch, dass der Typ nicht übergeben wird, kann es insbesondere in Verbindung mit der impliziten Deklaration(siehe 3.1) schnell zu Fehlern kommen. Da nur die Speicheradresse der Parameter übergeben wird, wirken sich Manipulationen auf den aktuellen Parametern des Unterprogramms auch auf das aufrufende Programm aus. Beispiel: ... INTEGER I I=5 CALL SUBR(I) PRINT *,I ... SUBROUTINE SUBR(A) A=A+1 RETURN END Dieses Programmstück würde nicht die gewünschte Ausgabe(6) ergeben, da die übergebene Variable vom Unterprogramm wegen der impliziten Deklaration als REAL-Wert interpretiert wird und auf ihm die entsprechende Addition ausgeführt wird. Das Hauptprogramm interpretiert die jetzt mit einem REAL-Wert überschriebene Variable wieder als INTEGER-Wert und produziert daher eine unbrauchbare Ausgabe. COMMON-Blöcke. FORTAN77 bietet mit den COMMON-Blöcken eine Möglichkeit an, von mehreren Programmteilen gemeinsam genutzte Speicherbereiche zu definieren. Dazu muss in jedem Programmteil, der einen solchen Block benutzt folgende Anweisung stehen: COMMON /NAME/ A,B,C dabei ist NAME der Name des gemeinsam mit anderen Programmteilen benutzten Blocks und A,B,C die Bezeichnungen der Variablen des Blocks im jeweiligen Programmteil. Die Gesamtlänge(in Speichereinheiten) des COMMON-Blocks muss zwar in jedem Programmteil identisch sein, jedoch kann jeder Programmteil den Block anders interpretieren. Für den Compiler ist nur die Reihenfolge der angegebenen Variablen wichtig, eine Typüberprüfung findet hier nicht statt. 2 Dies bezeichnet man als Call-by-Reference Beispiel: PROGRAMM CEXAMPLE COMPLEX CPX COMMON /COM/ CPX CPX=(3.5,4.6) CALL SUBR STOP END SUBROUTINE SUBR REAL R,I COMMON /COM/ R, I ... Beide Programmteile benutzen den COMMON-Block mit Namen COM. Das Hauptprogramm interpretiert den Inhalt des Blocks jedoch als eine komplexe Zahl, während das Unterprogramm den Inhalt als zwei aufeinanderfolgende reelle Zahlen sieht. R ist hier der Realteil von CMP, I der Immaginärteil. Dies funktioniert hier korrekt, da FORTRAN77 eine komplexe Zahl tatsächlich in dieser Form speichert. Neben einzelnen Variablen können auch Felder Teil eines COMMON-Blocks sein. Außerdem ist es möglich, einen Namenlosen COMMON-Block zu erstellen, indem man den Namen in der Anweisung weglässt. Bei diesem darf sich seine Länge in den einzelnen Programmteilen unterscheiden[5]. Zusätzlich gilt die Einschränkung, dass, wenn Zeichenketten(CHARACTER) in einem Block verwendet werden, alle Variablen vom Typ CHARACTER sein müssen[5]. Durch das Benutzen von EQUIVALENCE-Anweisungen(siehe unten) kann sich die Länge eines COMMONBlocks vergrößern. Die Tatsache, dass es fast keine Beschränkung der verwendeten Typen(außer bei CHARACTER) gibt und genrell die Speicherverwaltung in den COMMON-Blöcken, kann zu erheblichen semantischen Fehlern führen. Wenn zum Beispiel ein Feld um eine Einheit zu kurz oder lang festgelegt wurde, verschieben sich die Speicherplätze aller folgenden Variablen, was zumindest beim unbenannten Block nicht so schnell auffällt. Es ergeben sich also ähnliche Probleme wie bei der Parameterübergabe an Unterprogramme(siehe oben). EQUIVALENCE-Anweisung. Die EQUIVALENCE-Anweisung dient dazu, verschiedenen Variablenbezeichnungen innerhalb einer Programmeinheit den gleichen Speicherplatzt zuzuordnen. Sie hat die Form: EQUIVALENCE (A,B,C) Dabei sind A,B,C die Variablen, die dem gleichen Speicherplatz zugewiesen werden. Sie können von unterschiedlichem Typ und damit auch von unterschiedlicher Länge sein. Dann wird die erste Speichereinheit der beiden Variablen gleichgesetzt. So führt ... COMPLEX C REAL A(2) EQUIVALENCE (C,A) ... zum Beispiel zu folgender Speicherbelegung: <-------C-------> <-A(1)-> <-A(2)-> |________|________| Dies kann unter anderem dazu genutzt werden, um direkt auf den Real- und Imaginärteil einer komplexen Zahl zuzugreifen oder um ein mehrdimensionales Feld3 auf ein eindimensionales abzubilden, damit es ohne verschachtelte Schleifen durchlaufen werden kann. Die EQUIVALENCE-Anweisung dient jedoch hauptsächlich dazu, Speicherplatzt zu sparen. Problematisch an dieser Anweisung ist die Tatsache, dass es aufgrund fast nicht vorhandener Einschränkungen der verwendeten Datentypen4 zu Fehlinterpretationen von Werten in einer Speicherzelle kommen kann. Außerdem kann die EQUIVALENCE-Anweisung die Größe von COMMON-Blöcken verändern. Ist eine Variable des Blocks einem Feld äquivalent gesetzt, so ist das Feld Teil des Blocks. Ragt dieses Feld nun über die hintere Grenze5 des Blocks hinaus, so wird der Block derart vergrößert, das das Feld hinein passt. Diese Vergrößerung muss in anderen Programmteilen berücksichtigt werden beziehungsweise kann beim unbenannten Block leicht übersehen werden. 3 4 5 In diesem Zusammenhang soll erwähnt werden, das FORTRAN77 Felder nicht Zeilenweise, sondern Spaltenweise im Speicher ablegt. Geht man von einem zweidimensionalen Feld F aus, so befinden sich in der unmittelbar auf F(1,1) folgenden Speicherstellen nicht F(1,2) und F(1,3) sondern F(2,1) und F(3,1); der erste Index variiert beim Durchlaufen der Speicherstellen eines Feldes am schnellsten. Hier gilt ähnlich wie bei COMMON-Blöcken, dass, wenn eine Variable in einer Äquivalenzgruppe vom Typ CHARACTER ist, alle anderen auch von diesem Typ sein müssen. Ein Hinausragen über die vordere Grenze ist nicht zulässig und führt zu einem Compilerfehler. 4 Zusammenfassung/Vergleich mit Fortran 90 “Höllische” Konzepte findet man in FORTRAN77 bei der Typsicherheit, der Programmstruktur und der Speicherverwaltung. Die Möglichkeiten der Strukturierung von Programmen sind an wichtigen Stellen begrenzt(keine WHILE-Schleifen) und zwingen zur Benutzung von Sprungbefehlen, während sie an anderer Stelle(ENTRYAnweisung)unnötig komplexe Konstruktionen ermöglichen. Die Speicherverwaltung ist rein statischer Natur. Dies verhindert Rekursion und zwingt zur Belegeung von meist unnötig viel Speicherplatz. Außerdem können die Beschränkungen bei der Übergabe von Parametern an Unterprogramme(nur Call-by-Reference) und die Eigenschaften von COMMON-Blöcken und der EQUIVALENCE-Anweisung in Verbindung mit der geringen Typsicherheit der Sprache zu schwer auffindbaren Programmfehlern führen. Die Typsicherheit wird zusätzlich noch durch die implizite Deklaration untergraben. Fortran 90 verfügt über eine dynamische Speicherverwaltung, Rekursion, Objektorientiereung und damit vom Benutzer definierte Datentypen. Außerdem wurden WHILE-Schleifen hinzugefügt sowie eine Möglichkeit, die implizite Deklaration abzustellen . Damit ist ein guter Teil der “höllischen” Konzepte von FORTRAN77 beseitigt. Jedoch wurde in Fortran 90 nichts aus dem Standard eintfernt, so dass jedes FORTRAN77-Programm ohne Probleme unter Fortran 90 läuft. Ein möglicher Grund, FORTRAN77 statt Fortran 90 zu verwenden, ist die Tatsache, das die statische Speicherverwaltung von FORTAN77 weniger Rechenzeit benötigt. FORTRAN77 wird daher bevorzugt, wenn es darum geht, große, rein mathematische Probleme in möglichst kurzer Zeit zu lösen. Literaturverzeichnis 1. Brainerd, W.S., Goldberg, C.H., Adams J.C.: Fortran 90: Lehr- und Arbeitsbuch für das erfolgreiche Programmieren. Oldenburg, München/Wien (1994) 2. Heisterkamp, M.: Fortran 90: eine informelle Einführung. BI-Wissenschafts-Verlag, Mannheim/Wien/Zürich (1991) 3. Wojcienszynski, B., Wojcienszynski, R.: Fortran 90. Addison-Wesley, Bonn (1993) 4. Merten, K.: FORTRAN 77: eine Einführung zum Selbststudium. Fischer, Stuttgart (1988) 5. Müller, K.H., Strecker.Seeborg, I.: FORTRAN 77: Programmierungsanleitung. Bibliographisches Institut, Mannheim/Wien/Zürich (1984) 6. Kaucher, E., Klatte, R., Ullrich, Ch., Grüner, K.: FORTRAN 77. Bibliographisches Institut, Mannheim/Wien/Zürich (1983) 7. Page, G.: Professional Programmer’s Guide to Fortran77. Pitman (1988) 8. FORTRAN77 Sprachumfang. Regionales Rechenzentrum für Nidersachsen, Hanover(1982) 9. Metacalf, M., Reid, J., Cohen, M.: fortran 95/2003 explained. Oxford University Press, New York(2004)