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)