Die Programmiersprache Fortran

Dieser Artikel gibt einen Überblick über die Programmiersprache Fortran und die am LRZ hierzu verfügbaren Ressourcen. Literatur zu Fortran und Links zu externer Information runden das Dokument ab.

Einleitende Bemerkungen

Die Programmiersprache Fortran (deren Name sich durch Zusammenziehung von "FORmula TRANslator") ergibt, wurde ursprünglich Ende der 1950er Jahre von IBM entwickelt und wird auch heute noch - trotz wachsender Konkurrenz durch etwa C, C++,Java sowie interpretierter Skriptsprachen - im Umfeld des technisch-wissenschaftlichen Programmierens in großem Umfang eingesetzt. Folgende Tabelle stellt einen Überblick über existierende oder geplante Revisionen der Sprache bereit:

Revisionstandardisiert seitBemerkungen
Fortran 77 1977 "Legacy Code". Viele Bibliotheken sind noch in diesem Dialekt verfügbar.
Fortran 90 1990 Wesentliche Erweiterung der Sprachdefinition unter Beibehaltung von Abwärtskompatibilität: Jedes Fortran 77 Programm ist auch ein Fortran 90 Programm.
Fortran 95 1995 Geringfügige Erweiterungen des Fortran 90 Sprachumfangs; einige Fortran 77 Features verschwinden. Jedoch unterstützen die kommerziellen Compiler meist auch die gestrichenen Features als Erweiterungen.
Fortran 2003 2004 Viele neue Sprachelemente, insbesondere im Hinblick auf Objektorientierung.
Fortran 2008 2010 Parallelisierung mittels Coarrays, Submodule, und eine Anzahl geringfügiger Erweiterungen.
TS 29113 2012 Technische Spezifikation, die Erweiterungen der C-Interoperabilität definiert
TS 18508 in Vorbereitung Technische Spezifikation, die zusätzliche parallele Funktionalität definiert
Fortran 2015 in Vorbereitung Integration der o.g. Technischen Spezifikationen und Bereinigung von Inkonsistenzen

Der Fortran 90/95 Standard

Im Vergleich zu Fortran 77 ist der Entwurf der Sprache insgesamt wesentlich kompakter, schlüssiger, abgerundeter, präziser und in sich konsistenter. Trotzdem ist das Standarddokument schwer verständlich für jemanden, der es zum ersten Mal liest. Es enthält nämlich keinerlei Redundanz. Man muss es eigentlich immer ganz im Kopf haben, um es im Detail verstehen zu können. Viele Eigenschaften werden nicht direkt beschrieben, sondern müssen abgeleitet, d. h. regelrecht erarbeitet werden. Auf diese Weise bleiben beim erstmaligen Lesen bestimmte Eigenschaften verborgen. Die ganze Vielfalt der Möglichkeiten erschließt sich dem Programmierer erst nach einigen Jahren der Programmierpraxis.

Es gibt jedoch eine Reihe guter Bücher und zahlreiche Tutorials im Internet, die dem Anwender die Einarbeitung erleichtern.

Fortran 95 ist erheblich umfangreicher als Fortran 77. Hinsichtlich Umfang und Komplexität der Sprache wird Fortran 95 gelegentlich mit Ada verglichen. Fortran 77 war eine vergleichsweise "kleine" Sprache, die man bei ständigem Gebrauch noch einigermaßen im Kopf behalten konnte. Diese Eigenschaft hat die Sprache sicher verloren. Der Programmierer wird nicht nur mit einer Vielzahl neuer Konzepte konfrontiert, sondern er muss auch viele neue Regeln lernen, die die alten Sprachkonzepte betreffen. Diese Tatsache ergibt sich gerade daraus, dass dem Programmierer auch im Zusammenhang mit den alten Sprachelementen neue Freiheiten und Möglichkeiten eingeräumt werden.

Beispiele:

  • Dort, wo in Spezifikationsanweisungen früher ganz einfache Konstantenausdrücke erlaubt waren, sind in Fortran 95 sogenannte Spezifikationsausdrücke erlaubt, die zwar den einfachen Fall enthalten, deren Regeln man sich im Detail aber kaum noch merken kann.
  • Es gibt Felder der Größe Null, und es gibt Zeichenfolgen der Länge Null. Das ist zwar wieder eine Verallgemeinerung des bisher bekannten Falles, aber der Preis ist, dass der Programmierer neue Regeln lernen muss für den Gebrauch solcher Größen in E/A-Listen, in COMMON-Anweisungen, in EQUIVALENCE-Anweisungen, usw.
  • Es gibt neue Arten von Unterprogrammen, die sich, gerade was die Parameterübergabe betrifft, von bestimmten Eigenschaften z.B. der externen Unterprogramme unterscheiden. D.h. die externen Unterprogramme bewahren unter ganz bestimmten Umständen Eigenschaften, die wir schon von Fortran 77 her kennen. An dieser Stelle kann man sehen, dass die angestrebte Aufwärtskompatibilität mit Fortran 77 für den Programmierer bedeutet, dass er nicht nur den neuen Normalfall lernen muss, sondern dass er auch alte Spracheigenschaften als eine Art Ausnahmeregelung im Kopf mitschleppen muss.

Demjenigen Fortran-Programmierer, der bisher striktes Standard-Fortran programmiert hat und der sich in modernen Programmiersprachen nicht auskennt, wird das neue Fortran etwas fremd vorkommen. Wer jedoch unbekümmert bestimmte Spracherweiterungen verwendet hat, oder wer sich in Pascal oder gar in Ada auskennt, dem wird so manches Sprachelement bzw. Sprachkonzept vertraut vorkommen. Ähnlichkeiten sind sicher nicht zufällig. In jedem Fall wird man sich eingewöhnen müssen, denn auch die Sprache, in der wir über Fortran sprechen, hat sich geändert. D.h. es gibt viele neue Fachbegriffe, alte bekannte Fachwörter haben eine neue oder zumindest eine erweiterte Bedeutung bekommen, und einige alte Fachwörter sind ganz über Bord geworfen worden. Siehe dazu auch unter dem Stichwort Fachbegriffe.

Die wichtigsten Neuerungen in Fortran 95

Fortran 77 ist praktisch vollständig in Fortran 95 enthalten Einerseits enthält Fortran 95 viele Erweiterungen alter Fortran 77-Konzepte, und andererseits enthält es eine Reihe völlig neuer Konzepte. Die wichtigsten Neuerungen sind in der folgenden Tabelle zusammengefasst.

KonzeptFortran 90Fortran 77
Feldverarbeitung mit Feldelementen mit Feldelementen
mit Teilfeldern -
mit ganzen Feldern -
numerische Datentypen ganzzahlig: mindestens 1 Variante ganzzahlig
reell: mindestens 1 Variante reell
doppelt genau komplex: mindestens 2 Varianten komplex
sonstige Datentypen logisch: mindestens 1 Variante logisch
Zeichen: mindestens 1 Variante Zeichen
selbstdefiniert, abgeleitet -
numerische Berechnung Kontrolle über interne Darstellung -
Kontrolle über Genauigkeit -
Kontrolle über Wertebereich -
globale Daten COMMON-Anweisung COMMON-Anweisung
MODULE Programmeinheit -
Kapselung von Information PRIVATE/PUBLIC Attribute in MODULE Programmeinheit -
Typkonzept vordefinierte Datentypen vordefinierte Datentypen
selbstdefinierte Datentypen ("Strukturen") -
objektbasiertes Programmieren generische Unterprogramme, Überladen und Neudefinition von Operatoren -
dynamische Daten dynamische Felder -
automatische Variablen -
Zeiger -

Darüber hinaus sind neu: Die spaltenunabhängige Quellprogrammschreibweise, Mehrfachanweisungen auf einer Zeile, Quellprogrammeinbettung mittels INCLUDE, Felder mit übernommener Gestalt, binäre, hexadezimale und oktale Konstanten, Kurzschreibweise der Vergleichsoperatoren, maskierte Feldzuweisungen, Zeigerzuweisungen, Attribute in Typvereinbarungsanweisungen, diverse Spezifikationsanweisungen, CASE-Struktur, WHILE-Schleife, nichtvorrückende E/Am namenlistengesteuerte E/A, diverse E/A-Parameter, diverse Datenfeldbeschreibungen, Schlüsselwortparameter, optionale Formalparameter, Schnittstellenblöcke, interne Unterprogramme, diverse Standardsubroutinen und viele neue Standardfunktionen, u.a.m.

Elemente von Fortran 90/95

Feldverarbeitung

Im Gegensatz zu Fortran 77 dürfen die vordefinierten Operationen Addition, Subtraktion, Multiplikation, usw. auch auf Feldoperanden angewendet werden. Ausdrücke verarbeiten also neben den üblichen Operanden auch Felder und liefern ggf. einen Feldwert. Die Verarbeitung erfolgt elementweise für einander entsprechende Feldelemente der Operanden. Die Feldoperanden können ganze Felder, Teilfelder, Unterausdrücke mit einem Feldwert oder Feldfunktionen sein. Es gibt eine Reihe vordefinierter Standardfunktionen zur Manipulation, Konstruktion und Umgestaltung von Feldern. Außerdem gibt es Standardfunktionen für die üblichen mathematischen Matrizenoperationen.

Datentypen

Zusätzlich zu den "normalen" Datentypen von Fortran 77 muss bzw. kann ein Fortran 95-System ggf. verschiedene Varianten der vordefinierten Datentypen unterstützen, die sich hinsichtlich ihrer internen Speicheranforderung und/oder ihrer internen Darstellung unterscheiden. Auf diese Weise können die Eigenschaften der verfügbaren Rechner ggf. besser genutzt werden, oder ein Programm kann z.B. mit höherer Genauigkeit (auch komplex) rechnen, oder es können ggf. auch ganz unübliche Zeichensätze z.B. für technische Anwendungen oder gar japanische oder chinesische Schriftzeichen unterstützt werden.

Numerische Berechnungen

Der Fortran-Programmierer bekommt unter Fortran 90/95 mehr Möglichkeiten, auf die Genauigkeit der verwendeten Daten und auf die Effizienz der numerischen Berechnungen Einfluß zu nehmen. Zu diesem Zweck gibt es auch eine Reihe Standardfunktionen, mit deren Hilfe sich der Programmierer Informationen über die charakteristischen Eigenschaften der internen Darstellung der Daten des verwendeten Rechners verschaffen kann.

Modularisierung

In Fortran 90/95 gibt es im Gegensatz zu Fortran 77 die Möglichkeit, globale gemeinsame Speicherbereiche zusammen mit den lokalen Namen ihrer Daten nur ein einziges Mal zu spezifizieren und die Definition überall dort wiederzuverwenden, wo sie benötigt wird. Diese Möglichkeit fehlt völlig in Fortran 77 (die Nachbildung mit COMMON Blöcken ist fehlerträchtig) wie auch die Möglichkeit, Unterprogramme und/oder Unterprogrammschnittstellen nur ein einziges Mal zu definieren und diese Definitionen anschließend an verschiedenen Stellen des Programmes zu verwenden. Ein Modul ist eine Programmeinheit, die beliebige Typvereinbarungsanweisungen, Spezifikationsanweisungen, Unterprogrammdefinitionen und/oder Schnittstellendefinitionen enthalten darf. Ein derartiges Modul darf sichtbare und private Definitionen und Spezifikationen enthalten. Die privaten Definitionen und Spezifikationen sind lediglich dem Modul verfügbar, während die sichtbaren Definitionen und Spezifikationen anderen Teilen des Programmes wie z.B. anderen Modulen verfügbar gemacht werden können. Mit Hilfe solcher Module können die Spezifikationen gemeinsamer Speicherbereiche bequemer und sicherer gehandhabt werden, Unterprogrammschnittstellendefinitionen von Programmbibliotheken können verfügbar gemacht werden, was wiederum weitere Erleichterungen beim Aufruf solcher Bibliotheksroutinen möglich macht, und Typdefinitionen und Typvereinbarungen können zusammen mit zugehörigen Operationen zu abstrakten Datentypen eingekapselt werden.

Typkonzept

Neben den vordefinierten Datentypen von Fortran 77 gibt es in Fortran 90 die Möglichkeit, sich eigene Datentypen zu definieren. Solche selbstdefinierten Datentypen haben Komponenten, die selbst vordefinierten Typs oder anderen selbstdefinierten Typs sind. Wenn eine solche Typdefinition verfügbar ist, können Datenobjekte dieses selbstdefinierten Typs vereinbart werden. Ein derartiges Datenobjekt ist eine Datenstruktur, die zuletzt aus einer Folge von Komponenten vordefinierten Typs besteht. Mit Hilfe von Funktionen können Operationen und Operatoren für Daten selbstdefinierten Typs definiert werden. Im Gegensatz zu Fortran 77 gibt es ein Typkonzept. Danach ist ein Datentyp eine Menge von Werten, er hat einen Namen, eine Menge von Operationen auf diesen Werten und eine Vorschrift über die Schreibweise dieser Werte, die sich in der Schreibweise der Konstanten niederschlägt.

Dynamische Daten

In Fortran 77 gibt es überhaupt keine Möglichkeit, bei der Ausführung des Programmes (dynamisch) Datenobjekte (Variablen) zu erzeugen. Es ist dort höchstens möglich, auf die Gestalt von Formalparametern variablen Einfluß zu nehmen, was aber keine Bedeutung für die Gestalt und die Speicherverwaltung der zugeordneten Aktualparameter hat. Dagegen gibt es in Fortran 90 eine Reihe von Möglichkeiten, Variablen dynamisch zu erzeugen und ihre Gestalt zu beeinflussen:
Dynamische Felder werden explizit mit Hilfe einer ALLOCATE-Anweisung erzeugt und mit Hilfe einer DEALLOCATE-Anweisung gelöscht. Lediglich der Name und der Rang (d.h. die Anzahl der Dimensionen) solcher Felder werden in Typvereinbarungsanweisungen oder anderen Spezifikationsanweisungen spezifiziert.
Automatische Felder sind Felder, die in Unterprogrammen als variable Felder vereinbart sind, die jedoch keine Formalparameterfelder sind. Solche Felder werden bei Ausführung des Unterprogrammes automatisch erzeugt und beim Rücksprung aus dem Unterprogramm automatisch wieder gelöscht. Auf diese Weise kann man leicht lokale Felder vereinbaren, die die gleiche Gestalt haben wie ein Formalparameterfeld.
Zeiger dienen in erster Linie dazu, solche flexiblen Datenstrukturen wie verkettete Listen, Baumstrukturen und Graphen organisieren zu können. Ein Zeiger ist in Fortran 90 kein Datenobjekt eines speziellen Zeigertyps, sondern "Zeiger" ist eine Eigenschaft (ein Attribut) eines Datenobjektes. Wenn einem Zeiger ein Zielobjekt zugeordnet ist, d. h. wenn ein Zeiger auf ein Ziel weist, dann kann er überall dort verwendet werden, wo ein Datenobjekt gleichen Typs, mit gleichem Typparameter und mit gleicher Gestalt verwendet werden darf. Zeigerziele können auch dynamisch erzeugt werden.

Fachbegriffe

Hier werden weitere Fachbegriffe erläutert. Die Liste ist zwar nicht vollständig, aber sie ergänzt den bisherigen Eindruck vom neuen Charakter der Sprache Fortran.

Attribut
Eigenschaft einer Größe, die in Typvereinbarungsanweisungen und anderen Spezifikationsanweisungen spezifiziert werden kann, wie z.B. Typ, Typparameter, Rang, Gestalt, ob Variable oder Konstante, Anfangswert, ob nur im Modul verfügbar oder mit dem Modul exportierbar, ob Eingabeparameter, Ausgabeparameter oder optionaler Parameter, ob dynamische Speicherverwaltung, ob der Wert einer Variablen beim Verlassen eines Unterprogrammes erhalten bleibt, usw.
CASE-Struktur
Mit Hilfe einer CASE-Struktur formuliert man eine Fallunterscheidung.
Datenobjekt
Ein Datenelement oder eine Menge von Daten gleichen Typs und mit gleichem Typparameter, auf das bzw. die als Ganzes zugegriffen werden kann. Ein Datenobjekt hat entweder einen eigenen Namen, oder es ist ein Teilobjekt (ohne eigenen Namen), auf das mit der qualifizierten Bezeichnung des zugehörigen Ausgangsobjektes zugegriffen werden kann. Ein Datenobjekt ist eine Datengröße, aber kein Funktionswert und nicht der Wert eines Ausdruckes. Mit objektorientierter Programmierung hat der hier verwendete Objektbegriff nichts zu tun.
Geltungseinheit
Ein Geltungseinheit kann sein
- Die Definition eines selbstdefinierten Datentyps.
- Ein Schnittstellenblock mit Ausnahme der darin ggf. enthaltenen Schnittstellenblöcke.
- Eine einzige Anweisung oder sogar der Teil einer Anweisung.
- Eine Programmeinheit oder ein Unterprogramm mit Ausnahme der darin enthaltenen Definitionen selbstdefinierter Datentypen, Schnittstellenblöcke und ohne die darin enthaltenen Unterprogramme.
Gestalt
Die Gestalt eines Feldes ist gegeben durch den Rang des Feldes und die Größe der einzelnen Dimensionen. Formal ist das ein eindimensionales Feld, dessen Elemente die Größen der einzelnen Dimensionen enthalten.
internes Unterprogramm
Ein Unterprogramm, das in ein Hauptprogramm, in ein Modulunterprogramm oder in ein externes Unterprogramm eingebettet ist.
Komponente
Ein selbstdefinierter Datentyp besteht aus Typkomponenten. Und ein Strukturobjekt besteht aus entsprechenden Strukturkomponenten.
konform
Zwei Felder sind konform, wenn sie die gleiche Gestalt haben. Ein Skalar und ein Feld sind per Definition konform.
Modulunterprogramm
Ein Unterprogramm, das in ein Modul eingebettet ist, d. h., das in einem Modul definiert ist und das kein internes Unterprogramm ist.
namenlistengesteuerte E/A
Formatgebundene E/A, bei der in den E/A-Anweisungen für die Datenübertragung weder Datenfeldbeschreibungen noch E/A-Listen geschrieben werden müssen.
nichtvorrückende E/A
Die Fortran-spezifische Art der Datenstrom-E/A.
Operatorfunktion
Definiert einen selbstdefinierten Operator. Mit Hilfe einer Operatorfunktion kann auch die Funktionalität eines vordefinierten Operators erweitert werden.
Programmeinheit
Der Baustein eines ausführbaren Programmes. Eine Folge von Anweisungen, INCLUDE-Zeilen und/oder Kommentarzeilen, die ein Hauptprogramm, ein Modul, ein externes Unterprogramm oder eine Blockdatenprogrammeinheit definiert.
Rang
Die Anzahl der Dimensionen eines Feldes. Ein Skalar hat den Rang Null.
Schlüsselwortparameter
Eine Aktualparameterspezifikation, die aus dem Namen des zuzuordnenden Formalparameters, einem Gleichheitszeichen und dem eigentlichen Aktualparameter besteht.
Schnittstellenblock
Eine Folge von Spezifikationsanweisungen, die mit einer INTERFACE-Anweisung beginnt und mit einer END INTERFACE-Anweisung endet. Dieser Anweisungsblock beschreibt die Eigenschaften einer oder mehrerer Unterprogrammschnittstellen, er spezifiziert einen selbstdefinierten Operator, er erweitert die Bedeutung eines vordefinierten Operators, er erweitert die Bedeutung der vordefinierten Zuweisungsoperation, oder er spezifiziert einen generischen Namen für ein oder mehrere spezifische Unterprogramme.
Skalar
Eine Datengröße, deren möglicher Wert kein Feldwert ist. Ihr Wert ist ein einzelnes Element aus der Wertemenge, die seinen Typ charakterisiert. Man beachte, dass ein Strukturobjekt ein Skalar ist, auch wenn es aus mehreren Komponenten besteht.
Speichereinheit
Man unterscheidet numerische Speichereinheiten, Zeichenspeichereinheiten und unspezifische Speichereinheiten. Ein skalares normal ganzzahliges, normal reelles oder normal logisches Datenelement belegt jeweils genau eine numerische Speichereinheit. Ein skalares doppelt genaues oder normal komplexes Datenelement belegt jeweils zwei aufeinanderfolgende numerische Speichereinheiten. Ein ganzes Feld belegt eine Kette aufeinanderfolgender Speichereinheiten. Und eine Zeichenfolge belegt eine Kette aufeinanderfolgender Zeichenspeichereinheiten, wobei jedes einzelne Zeichen genau eine Zeichenspeichereinheit belegt, wenn die Zeichenfolge vom normalen Zeichentyp ist. Ein Zeiger belegt eine unspezifische Speichereinheit. Außerdem belegt jedes Datenobjekt nichtnormalen Typs, das kein Zeiger ist, eine (andere) unspezifische Speichereinheit.
Standardkonformität
Der Begriff hat mehrere Bedeutungen:
- Ein ausführbares Programm ist standardkonform, wenn es nur solche Sprachelemente bzw. Spracheigenschaften benutzt, deren Anforderungen, Optionen und Verbote im Standarddokument beschrieben sind, und wenn es eine Interpretation hat, die dem Standard entspricht. - Eine Programmeinheit ist standardkonform, wenn sie Teil eines standardkonformen Programmes sein kann. - Ein Fortran-System ist standardkonform,
1. wenn es ein standardkonformes Programm so ausführt, dass es eine standardkonforme Interpretation hat und
2. wenn es den Gebrauch der als überholt gekennzeichneten Sprachelemente, den Gebrauch solcher vordefinierter Unterprogramme, die keine Standardunterprogramme sind, und nichtstandardisierte Formen der Quellprogrammschreibweise melden kann und
3. wenn es Verstösse gegen die formalen Syntaxregeln des Standarddokumentes, gegen die zugehörigen Zusatzbedingungen und gegen die Regeln betreffend die Geltungsbereiche von Namen melden kann und
4. wenn es den Gebrauch von Typparameterwerten melden kann, die es nicht unterstützt, und
5. wenn es melden kann, warum es ein Programm zurückweist.
Struktur(objekt)
Ein skalares Datenobjekt selbstdefinierten Typs.
Teilobjekt
Ein Teil eines Datenobjektes. Es kann ein Feldelement, ein Teilfeld, eine Strukturkomponente oder eine Zeichenteilfolge sein.
Typparameter
Ein systemabhängiger Parameter eines vordefinierten Datentyps, der die jeweiligen Varianten eines Datentyps charakterisiert. Wenn kein Typparameter spezifiziert ist, ist jeweils die normale Variante gemeint; andernfalls ist eine spezielle Variante eines Datentyps mit einer anderen Approximationsmethode bzw. internen Darstellung gemeint.
überladen
Generische Unterprogrammnamen dürfen durch zwei oder mehr spezifische Unterprogrammnamen überladen werden, so dass der generische Name verwendet werden kann, um eines der spezifischen Unterprogramme aufzurufen. Entsprechend dürfen auch vordefinierte und selbstdefinierte Operatoren überladen werden.
Umgebungszuordnung
Ein internes Unterprogramm, ein Modulunterprogramm oder eine Typdefinition erhält Zugang zu Größen der umgebenden Geltungseinheit. D.h. lokale Namen einer Geltungseinheit werden den gleichen Namen einer umgebenden Geltungseinheit zugeordnet.
Unterprogramm
Ein externes Unterprogramm, ein internes Unterprogramm, ein Modulunterprogramm, eine Formelfunktion oder ein Standardunterprogramm. Blockdatenprogrammeinheiten und Module sind keine Unterprogramme.
Variable
Ein Datenobjekt, das keine Konstante ist; nämlich ein Skalar oder ein Feld mit einem Namen, ein Feldelement, ein Teilfeld, eine Strukturkomponente oder eine Zeichenteilfolge.
vordefiniert
Vordefinierte Datentypen, vordefinierte Operatoren, vordefinierte Zuweisungsanweisungen und (vordefinierte) Standardunterprogramme sind jedem Fortran-System bekannt. Sie dürfen grundsätzlich ohne Definition und Spezifikation verwendet werden. Es gibt ggf. auch vordefinierte Unterprogramme, die keine Standardunterprogramme sind.
WHILE-Schleife
Eine abweisende DO-Schleife, die keine Zählschleife ist.
Zeiger
Eine Variable mit Namen, die erst dann definiert (d.h. mit einem Wert versehen) und benutzt werden kann, wenn ihr ein Ziel zugeordnet ist.
Zugänglichkeit
Die sichtbaren Größen eines Moduls können außerhalb des Moduls einer anderen Geltungseinheit mit Hilfe einer USE-Anweisung zugänglich gemacht werden. Es besteht die Möglichkeit, Objekte unter veränderten Namen einzubinden.
Zuordnung
Man spricht von Zuordnung, wenn ein (Daten)-Objekt innerhalb eines Geltungsbereiches durch unterschiedliche Namen identifiziert werden kann oder wenn es in verschiedenen Geltungsbereichen durch denselben oder durch unterschiedliche Namen identifiziert werden kann. Derartige Zuordnungen sind möglich mit Hilfe von COMMON-Anweisungen, EQUIVALENCE-Anweisungen, ENTRY-Anweisungen und auf Grund der Verwendung von Aktual- und Formalparameterlisten im Zusammenhang mit Unterprogrammen. Eine Zuordnung kann man sich als Zuordnung über die Namen (z.B. ENTRY-Anweisung) oder als Zuordnung über die zugeordneten Speichereinheiten (z.B. COMMON-Anweisung) vorstellen. Eine Zuordnung kann auch per USE-Zuordnung, per Umgebungszuordung oder per Zeigerzuordnung erfolgen.
Zuweisungssubroutine
Eine Zuweisungssubroutine erweitert die Funktionalität des vordefinierten Zuweisungsoperators, d. h. des Gleichheitszeichens in Zuweisungsanweisungen.

Fortran 77 ist keine Untermenge von Fortran 95 in dem Sinne, wie etwa Subset Fortran eine Untermenge von Fortran 77 gewesen ist. Oder umgekehrt: Fortran 95 ist kein aufgebohrtes Fortran 77. Die Definition der Sprache Fortran 95 ist im Prinzip eine von Grund auf neue Definition einer neuen Sprache. Aber es wird zugesichert, dass jedes Fortran 77-kompatible Programm auch Fortran 95-kompatibel ist, und zwar mit der gleichen Interpretation. Es gibt allerdings ein paar Ausnahmen bzw. Besonderheiten, die zu berücksichtigen sind:

  • Bestimmte weitverbreitete Spracherweiterungen von Fortran 77 sind jetzt unter Fortran 90 standardisierter Teil der Sprache. Hier kann sich ein Programm also unterschiedlich verhalten.
  • Es gibt bestimmte Eigenschaften der Sprache, die unter Fortran 77 systemabhängig waren und die jetzt unter Fortran 90 geregelt sind. Hier kann sich ein Programm also unterschiedlich verhalten, obwohl es in beiden Fällen standardkonform ist.
  • Es gibt eine kleine Änderung betr. die interne Darstellung der Werte reeller Variablen, die in DATA-Anweisungen mit doppelt genauen Werten initialisiert werden.
  • Es gibt eine kleine Änderung betr. den Definitionsstatus von Variablen, die zwar in DATA-Anweisungen initialisiert, aber nicht zusätzlich in SAVE-Anweisungen spezifiziert worden sind.
  • Während unter Fortran 77 bei Ausführung einer READ-Anweisung grundsätzlich genügend Werte (genauer: Zeichen) für die Eingabeliste bereitgestellt werden mussten, werden unter Fortran 90 im Normalfall "gedachte" Füllzeichen (Leerzeichen) nachgezogen, wenn die Anzahl der Zeichen in den Eingabedaten nicht ausreicht. Die Fortran 77-konforme Art der Abarbeitung kann durch einen geeigneten Parameter in der OPEN-Anweisung erzwungen werden.
  • Fortran 90 kennt viel mehr Standardunterprogramme als Fortran 77. Ja es gibt jetzt sogar ein paar Standardsubroutinen. Wenn ein Fortran 77-konformes Programm ein externes Unterprogramm verwendet, das den Namen eines der neuen Standardunterprogramme hat, dann kann man z.B. mit Hilfe einer EXTERNAL-Anweisung dafür sorgen, dass die eigene und nicht die vordefinierte Routine verwendet wird.

Fortran 2003

Mit Fortran 2003 ist der Sprachumfang deutlich angewachsen; in diesem Abschnitt soll ein kurzer Überblick über die wichtigsten im Fortran 2003 Standard vorgesehenen Erweiterungen gegeben werden. Es muss jedoch darauf hingewiesen werden, dass der überwiegende Teil der hier beschriebenen Funktionalität von den Compiler-Herstellern noch nicht bereitgestellt wird.

IEEE Ausnahmebehandlung

Für die Behandlung von numerischen Ausnahmen (z. B. Division durch Null, Auftreten von Unendlichkeiten) war man bisher auf - von Hersteller zu Hersteller recht unterschiedlich implementierte - Erweiterungen angewiesen. Mit der Einführung von intrinsischen Modulen zur Behandlung von IEEE Ausnahmen ist dieser chaotische Zustand beendet; die systematische programminterne Kontrolle des IEEE Zustands ermöglicht etwa, laufzeit-effiziente Implementierungen zu programmieren, und nur im Falle einer IEEE Ausnahme eine ggf. aufwendige Sonderbehandlung durchzuführen.

Erweiterungen bei Zugriff auf Daten, Kapselung und Abfrage der Betriebsumgebung

Hier sind einige voneinander relativ unabhängige Punkte anzuführen:

  • Modul-Variablen, die vermittels "public" nach außen sichtbar sind, können nun zusätzlich das Attribut "protected" erhalten, welches außenstehenden Programmeinheiten lediglich Lese- aber keinen Schreibzugriff gestattet. Außerdem ist für erweiterte Datentypen die Angabe gemischter Zugriffsrechte für jede Einzelkomponente zulässig.
  • Bei Zuweisung von Zeiger-Variablen kann nun auf der linken Seite ein beliebiger Index-Bereich spezifiziert sein; außerdem kann ein mehrdimensionaler Zeiger auf ein eindimensionales Objekt verweisen.
  • Variablen können das Attribut VOLATILE besitzen. Dies ist relevant, wenn ein Mechanismus von außerhalb des Fortran Programms auf die der Variablen zugeordnete Speicherstelle zugreifen kann. Es wird jedoch nur zugesichert, dass die Variable nicht registeroptimiert wird (und damit ein Widerspruch zwischen Register und Speicherwert auftreten kann), für die korrekte Synchronisation beim Lesen bzw. Schreiben auf die Variable muss der Programmierer selber sorgen.
  • Variablen können das Attribut ASYNCHRONOUS besitzen. Dies kann entweder explizit deklariert werden, oder implizit angenommen werden. Für solche Variablen ist es ggf. möglich, E/A Anweisungen asynchron (also im Hintergrund) auszuführen. Während eine asynchrone E/A Anweisung ausgeführt wird, sind für die betroffenen Objekte gewisse Zugriffsbeschränkungen einzuhalten. Eine WAIT Anweisung sorgt dafür, dass das Programm wartet, bis die asynchrone E/A beendet ist und damit die Zugriffsbeschränkungen aufgehoben sind.
  • Bei der Programmierung von Modulen war es in Fortran 95 innerhalb von Schnittstellenblöcken nicht möglich, die im Modul selbst festgelegten Typdeklarationen zu verwenden. Dieser Mangel wird durch das IMPORT statement behoben. Diese Anweisung wird auch innerhalb von abstrakten Schnittstellen (s.u.) benötigt.
  • Es gibt eine Reihe neuer intrinsischer Funktionen, die Zugriff auf die Umgebungsvariablen der Betriebsumgebung sowie Parameter der Kommandozeile gestatten.
  • Selbstdefinierte Operatoren können bei Einbindung über das USE statement umbenannt werden.

Erweiterungen bei der dynamischen Speicherverwaltung

In Fortran 2003 können nunmehr auch Typ-Komponenten sowie Formalparameter und Funktionsresultate das Attribut ALLOCATABLE haben. Dies führt einerseits zu Verbesserung der Laufzeit-Effizienz - im Gegensatz zu Zeigern kann der Compiler von der Kontinuität der Speicheranordnung ausgehen -, andererseits wird damit das Problem des Auftreten von Speicherlecks bei nur temporär verwendeten dynamischen Zeiger-basierten Speicherbereichen behoben. Auch wird bei Zuweisungen von verallgemeinerten Datentypen eine effizientere Speicherverwaltung erzielt. Dieser Teil von Fortran 2003 wird tatsächlich bereits von den meisten Compilern unterstützt; die Funktionalität wurde bereits Mitte der 1990er Jahre als technischer Bericht (TR15581) veröffentlicht.

Über TR15581 hinausgehende Eigenschaften von ALLOCATE sind: Automatische Reallozierung von ALLOCATABLE Entitäten, allozierbare Skalare (was zusammen mit nachträglich spezifizierbaren Typ-Parametern etwa eine deutliche Erleichterung bei der Handhabung von String-Variablen nach sich zieht), die neue intrinsische Funktion MOVE_ALLOC sowie Unterstützung für parametrisierte und polymorphe Datentypen bei der dynamischen Speicherverwaltung.

Interoperabilität mit C

Für den Aufruf von C Programmen aus Fortran (und evtl. auch umgekehrt) gab es bisher keine "offizielle" Methode. Dies wird nun in Fortran 2003 durch ein intrinsisches Modul sowie das BIND(C) Attribut unterstützt, die es ermöglichen, bestimmte Fortran Konstrukte in eindeutiger Weise auf korrespondierende C Entitäten abzubilden. Das können globale Daten, Unterprogramme oder Typdefinitionen sein. C bzw. Fortran Zeiger können nun durch den "fremdsprachigen" Programmteil durchgereicht werden, Fortran Zeiger sind jedoch nicht selber interoperabel. Mittels einer zu Cray-Pointern ähnlichen Funktionalität lassen sich auch dynamisch allozierte Objekte oder Teilobjekte zwischen Fortran und C transferieren. Es ist zu beachten, dass auf der Seite von Fortran zusätzliche Einschränkungen gelten: So ist etwa ein C-interoperabler Datentyp nicht - im objektorientierten Sinne (s.u.) - erweiterbar.

Parametrisierte Datentypen

Es ist in gewisser Weise ein Unding, dass man zwar über KIND die gewünschte Genauigkeit von Datentypen anwählen kann, aber ein Programm, das alle möglichen KINDs gleichzeitig verwenden können soll, den Code für alle gebrauchten KINDs explizit mehrfach enthalten muss. Ähnliches gilt für die Feldverarbeitung von ein- und mehrdimensionalen Feldern, obwohl für gewisse Spezialfälle hier das ELEMENTAL Unterprogramm eine Lösung bietet.

Fortran 2003 erweitert die Generizität durch die Einführung von sowohl Längen-, als auch KIND-Parametern bei der Definition von erweiterten Datentypen. Ein wesentlicher Unterschied zwischen diesen beiden Parameter-Varianten liegt darin, dass erstere erst zur Laufzeit, letztere jedoch schon zur Übersetzungszeit festgelegt sein müssen. Dementsprechend können erstere nicht in Initialisierungsausdrücken auftreten. Diese Parametrisierung ist jedoch keineswegs ein so leistungsfähiges Konzept wie etwa der template Mechanismus in C++; insbesondere erspart man sich nicht die explizite Implementierung für unterschiedliche Parameterwerte.

Abstrakte Schnittstellen und Zeiger auf Prozeduren

Ähnlich wie in C sind in Fortran 2003 nun auch Zeiger auf Prozeduren möglich. Damit kann man zur Laufzeit eines Programms den Aufruf unterschiedlicher Unterprogramme unter demselben Namen veranlassen, vorausgesetzt, sie erfolgen mit derselben Parameterleiste (generische oder elementweise Schnittstellen sind hier nicht möglich). Ein solcher Zeiger kann mit dem dazu passenden Schnittstellenblock definiert sein, dieser kann aber auch implizit definiert werden. Für einen solchen Schnittstellenblock existiert ggf. zunächst keine tatsächliche Implementierung, daher gibt es die Möglichkeit, ihn als sog. abstrakte Schnittstelle auszulegen. Dieses Konzept wird auch verwendet, wenn man bei objektorientierter Programmierung virtuelle Schnittstellen generieren will. Darüber hinaus können Zeiger auf Prozeduren auch als Komponenten abgeleiteter Datentypen auftreten. Im Unterschied zu typ-gebundenen Prozeduren (s. nächster Abschnitt) sollte man hier von objekt-gebundenen Prozeduren sprechen, da ja jede Instanz auf eine andere Prozedur verweisen kann.

Objektorientierung

Fortran 2003 unterstützt objektorientiertes Programmieren durch Erweiterbarkeit von Datentypen, polymorphe Variablen, und an Typen gebundene Unterprogramme ("Methoden").

Ein erweiterter Daten-Typ in Fortran 95 konnte zwar als Struktur-Element eines neuen erweiterten Daten-Typs auftreten ("has a" Relation). Zusammen mit dem Einsatz generischer Schnittstellen ist in Fortran 95 jedoch nur statischer Polymorphismus erzielbar (durch Einsatz eines Präprozessors oder passend definierter Supertypen ist ggf. dynamischer Polymorphismus simulierbar). Im Vergleich zum Einsatz erweiterbarer Datentypen ("einfache Vererbung"), wie unter Fortran 2003 jetzt verfügbar ("is a" Relation, oder Spezialisierung) ist die Handhabung jedoch vergleichsweise umständlich. Für vollen Laufzeit-Polymorphismus sorgen der Einsatz eines SELECT TYPE Konstrukts, das sowohl Typen als auch Klassen wahrnehmen kann, sowie die Verfügbarkeit von polymorphen Variablen (in der Regel vom Typ Zeiger), die entweder auf eine Klasse verweisen oder sogar unbeschränkt polymorph sein können.

Schließlich können nun auch innerhalb einer Typ-Definition Prozeduren als Komponenten auftreten. Solche Prozeduren können auch generisch (also in der Parameterleiste variabel) sein, oder sogar auf eine abstrakte Schnittstelle verweisen. Das ermöglicht zum Einen eine weitere Verbesserung bei der Kapselung - die Implementierungen der Methode können verborgen bleiben und sind nur über den Methodenaufruf erreichbar -, zum Anderen die Implementierung von virtuellen Basisklassen. Grundlage hierfür ist natürlich, dass für einen Typ einmal definierte Methoden auf alle erweiterten Typen vererbt werden. Im Unterschied zu C++ wird nur einfache Vererbung unterstützt; durch Überschreiben ("overriding") von Methoden bei abgeleiteten Datentypen gibt es eine Alternative zur Verwendung von "SELECT TYPE". Man kann das Überschreiben aber auch bei der Definition des Basistyps unterbinden. Bei virtuellen Klassen wird der Programmierer vom Compiler ggf. darauf hingewiesen, dass er für seine Ableitung auch alle virtuellen Methoden implementieren muss.

Bei Verlassen eines Gültigkeitsbereiches werden Objekte zwar ungültig, bei Verwendung von Zeiger-Komponenten können jedoch Speicherlecks auftreten (das System hat ggf. keine Information, ob ein anderes Objekt darauf verweist); außerdem kann das Objekt ggf. mit Zustand (z. B. offene I/O Einheiten) verbunden sein. Um dem Programmierer hier eine bessere Kontrolle zu ermöglichen, gibt es in Fortran 2003 sog. finalisierende Unterprogramme, die als Typ-Komponenten zu definieren sind. In diesem Destruktor, der automatisch bei Verlassen des Gültigkeitsbereichs aufgerufen wird, kann der Programmierer sich um die notwendigen Aufräumarbeiten kümmern. (Hingegen sind Konstruktoren in Fortran stets explizit zu programmieren und explizit aufzurufen; notwendig ist das insbesondere, wenn dynamische Typkomponenten existieren.)

Erweiterung bei Ein/Ausgabe

Es ist in Fortran 2003 möglich, E/A ebenfalls objektorientiert durchzuführen, und zwar durch das Binden eines Unterprogramm-Aufrufs an einen speziell hierfür vorgesehenen E/A Deskriptor. Insbesondere wird hier auch - für die E/A auf verkettete Datenstrukturen ist das notwendig - Rekursivität unterstützt. Des weiteren kann im Betriebssystem ggf. vorgesehene asynchrone E/A Funktionalität nun auch von Fortran aus benutzt werden, wenn eine Überlappung von E/A Operationen mit Berechnungen gewünscht ist. Schließlich ist nun auch dieselbe Art von "rohem" Daten-Transfer wie in C über die sog. Stream E/A nutzbar. Eine üblicherweise schon in heutigen Compilern implementierte Erweiterung ist das FLUSH statement, mit dem die Ausstülpung eines E/A Puffers und damit dessen Verfügbarkeit für die Betriebsumgebung erzielt wird.

Fortran 2008

Sub-Module

Das mit Fortran 90 eingeführte Modul-Konzept unterstützt zwar die Modularisierung von Programm-Code, führt jedoch für sehr umfangreiche Programme zu enorm großen Modulen. Eine Unterteilung ist nicht möglich, ohne ggf. die Kapselung von Daten zu verletzen oder die Komplexität der Modul-Hierarchie enorm zu erhöhen. Außerdem führt eine Änderung des Codes im Körper der Module dazu, dass alle Programme, die über USE darauf zugreifen, neu übersetzt werden müssen, auch wenn das rein technisch nicht nötig wäre, wenn sich nämlich keine Schnittstellen oder globalen Daten geändert haben ("Recompilation Cascade").

Zur Behebung dieser Miss-Stände wurde das Konzept des Submoduls entwickelt. Dieses Konzept ermöglicht es, den eigentlichen Programm-Code eines Moduls in separate Dateien auszulagern. Bei Änderung des Codes sind dementsprechend nur in der Submodul-Hierarchie weiter unten liegende Dateien neu zu übersetzen. Mit "use" auf ein "Vorfahr"-Modul zugreifende Programme sind nur dann neu zu übersetzen, wenn die Schnittstellendefinition geändert wurde. Außerdem können nun in Submodulen zweier unterschiedlicher Module enthaltene Unterprogramme das jeweils andere Modul referenzieren, was bislang an der daraus folgenden Zirkularität der Modul-Abhängigkeit scheiterte. Ohne Sub-Module führen auch viele objekt-orientierte Programmiertechniken zu zirkulären Modul-Abhängigkeiten.

Parallelität

Mit der Änderung der Stoßrichtung der Prozessorentwicklung weg von skalarer Leistungserhöhung hin zu expliziter Parallelität (Mehrkern-Prozessoren) wird die Verfügbarkeit von integrierter paralleler Funktionalität in der Semantik der gängigen Sprachen akut. Fortran 2008 wird dieser Anforderung durch Integration des Coarray-Konzeptes gerecht. Dies verallgemeinert die Ausführung eines Fortran-Programms auf ein SPMD Programmiermodell, das auf einem partitionierten Addressraum beruht (PGAS oder Partitioned Global Address Space) ; d. h. man geht davon aus, dass mehrere replizierte Images eines vorgegebenen Codes von der Laufzeitumgebung gestartet werden und asynchron laufen. Der Programmierer hat die Möglichkeit, durch geeignete Deklaration einer co-Dimension

  type(mytype), codimension[*] :: x(ndim)

Datenobjekte eines Images von einem anderen Image aus zugreifbar zu machen:

  y(1:size(x)) = x(:)[4]  ! besorge Daten von Image 4,

und er hat die Pflicht, durch Einfügen geeigneter Synchronisationsanweisungen, etwa

  sync all

dafür zu sorgen, dass keine Wettbewerbsbedingungen den korrekten Ablauf des parallelen Algorithmus stören können. Eine Anzahl neuer intrinsischer Funktionen für die Verwaltung des parallelen Ablaufs ist ebenfalls verfügbar. Ein neuer Datentyp LOCK_TYPE ist definiert, der - zusammen mit darauf operierenden Anweisungen - dem Programmierer gestattet, Coarray-Daten systematisch vor Zugriffen durch (im Sinne seines Algorithmus) "unbefugte" Images zu schützen. Es ist zu erwarten, dass dieser Teil des Fortran 2008 Standards in kommerziellen Compilern sehr bald nach dessen Verabschiedung implementiert sein wird.

Sonstiges

Die wichtigsten sonstigen Erweiterungen seien in der folgenden Stichwortliste zusammengefasst:

  • Rang eines Feldes: Die Summe von Dimension und co-Dimension eines Feldes darf 15 betragen,
  • Rekursive allozierbare Typkomponenten sind jetzt gestattet,
  • Zeiger-Initialisierung mit einem von null() verschiedenen Ziel ist möglich,
  • Parallele Schleifenausführung mit DO CONCURRENT,
  • Optimierung der Zeigerverarbeitung mittels des CONTIGUOUS Attributs für Felder,
  • partielle Initialisierung eines polymorphen Objektes mittels des MOLD Argumentes bei ALLOCATE,
  • Zuweisung auf eine allozierbare polymorphe Variable ist gestattet; neben dem Wert einer Variablen kann das SOURCE Argument in ALLOCATE auch Feldgrenzen definieren,
  • Erweiterung der Blockstruktur mittels einer allgemeinen BLOCK Anweisung, innerhalb der auch block-lokale Deklarationen möglich sind,
  • Bit-Bearbeitung wurde durch Hinzufügen weiterer intrinsischer Operationen erleichtert; zusätzliche intrinsische mathematische Funktionen sind verfügbar,
  • Interne Prozeduren dürfen nun auch als Argumente verwendet werden,
  • Generische Auflösung: die Attribute ALLOCATABLE und POINTER werden nun mitberücksichtigt,
  • Komplexe Zahlen können den Real- bzw -Imaginärteil analog einer Typ-Komponente ansprechen,
  • Funktionen mit Zeiger-Resultat können auf der linken Seite einer Zuweisungsanweisung stehen,
  • Produktion eines gültigen E/A-Kanals mittels der NEWUNIT Spezifikation in OPEN,
  • E/A-Deskriptoren: Erweiterung des G Edit-Deskriptors sowie Unterstützung für beliebig wiederholbare Deskriptoren.

TS 29113

Diese technische Spezifikation stellt Erweiterungen der C-Interoperabilität bereit, die es gestatten, auch solche Fortran-Datenobjekte in C zu deklarieren und zu benutzen, für die es in C keine Entsprechung gibt. Solche Objekte werden in Form eines sog. Deskriptors an C übergeben; insbesondere sind dies Felder, die angenommene Gestalt ("assumed shape") haben oder dynamisch sind (also das POINTER oder ALLOCATABLE Attribut besitzen). Im Hinblick auf die Implementierung einer standardkonformen MPI Schnittstelle ist es außerdem möglich, Formalparameter-Objekte mit dem pseudo-polymorphen Typ TYPE(*) und/oder dem angenommenen Rang DIMENSION(..) zu erklären, und damit Daten von beliebigem (nicht notwendigerweise interoperablem) Typ und/oder Rang an eine solche Schnittstelle zu übergeben. Einige Restriktionen der in Fortran 2003 definierten Interoperabilität werden gelockert. Außerdem ist die Semantik des ASYNCHRONOUS Attributes erweitert worden, um außer E/A Anweisungen auch Aufrufe spezifischer nichtblockierender und daher asynchron auszuführender C-Unterprogramme zu unterstützen (z. B. POSIX AIO oder nichtblockierende MPI Schnittstellen).

TS 18508

Diese technische Spezifikation definiert zusätzliche parallele Funktionalität durch Erweiterungen des Coarray Konzeptes:

Das in coarray Fortran festgelegte parallele Programmiermodell ist flach und damit für die heute (und wohl auch zukünftig) eingesetzten HPC-Systeme mit je nach Hierarchiestufe unterschiedlichen Zugriffscharakteristiken für Daten nicht optimal geeignet. Daher wird das Konzept von "Teams" (das man sich in mancher Hinsicht ähnlich wie das eines MPI-Kommunikators vorstellen darf) eingeführt, das den Einsatz von Coarrays auf Teilmengen aller Images ermöglicht und damit - vorausgesetzt der Algorithmus gestattet dies - den Synchronisationsaufwand ggf. deutlich reduziert. Außerdem lassen sich MPMD-artige Szenarien leichter und ggf. ohne Änderungen an den Programmquellen bzw. existierenden Coarray-Bibliotheken realisieren. Darüber hinaus wird auch Unterstützung für das Weiterlaufen von Coarray-Programmen nach dem Ausfall einzelner Rechenknoten bereitgestellt.

Mittels sogenannter "Events" ("Ereignisse") ist ein einseitiger Synchronisationsmechanismus definiert, der besser zum bereits einseitig ausgelegten Datentransferkonzept passt und ggf. nicht notwendige zweiseitig auftretende Synchronisationslatenzen vermeidet.

Analog zu MPI werden einige kollektive Funktionen bereitgestellt (z. B. Reduktionen), weil für solche Funktionen die deutlich bessere Leistung einer an Compiler und System angepassten Implementierung zu erwarten ist. Darüber hinaus können kollektive Funktionen auch auf gewöhnliche (also nicht-Coarray) Daten angewendet werden.

Atomare Funktionen garantieren es, Updates von Coarray-Variablen durchzuführen, die dann stets wohldefinierte Werte enthalten, und zwar unabhängig von der Durchführung von Synchronisationsanweisungen. Solche Funktionen dienen der Implementierung von effizienten, auf spezielle Anwendungen zugeschnittenen Synchronisationsmechanismen.

Fortran 2015

Dieser derzeit in der Entwicklungsphase befindliche nächste Standard wird - abgesehen von der Integration der technischen Spezifikationen TS 29113 und TS 18508 - nur wenige neue Sprachmerkmale mit sich bringen. Die Absicht ist, hauptsächlich Unklarheiten und Inkonsistenzen des aktuellen Standards zu beheben.

Fortran an den Rechenanlagen des LRZ

HPC-Plattformen

Alle HPC Plattformen des LRZ werden derzeit auf Intel-Systemen unter Linux betrieben. Hier ist der Compiler der Wahl das von Intel hergestellte Produkt, es gibt auf den x86 bzw. x86_64 basierten Systemen jedoch weitere Implementierungen von PGI, von NAG sowie neuerdings in der GCC. Weitere Informationen erhalten Sie über die Develop Seite am LRZ Web Server.

Am PC unter Linux oder Windows

Dokumentation

Literaturhinweise

  • Metcalf, Reid; Modern Fortran Explained, Oxford University Press, 2011. Die siebte Auflage behandelt den Fortran 2008 Standard.
  • Metcalf, Reid, Cohen; Fortran 95/2003 Explained, Oxford University Press, 2004. Hierzu gibt es auch Errata.
  • J. Adams, W. Brainerd, R. Hendrickson, R. Maine, J. Martin, B. Smith: The Fortran 2003 Handbook, Springer 2009.
  • Gehrke; Fortran 90 Referenz-Handbuch; Hanser, 1991
  • Einarsson, Bo und Shokin, Yurij: Fortran 90 for the Fortran 77 Programmer.

Informationen zu Fortran im Internet

Informationen zum Fortran-Standard

Der derzeit gültige Standard ist Fortran 2008. Ältere oder neuere Dokumente sind in den darauffolgenden Unterabschnitten referenziert.

Fortran 2008 und Ergänzungen

Fortran 2003

  • TC1 Erstes Korrekturdokument zum Fortran 2003 Standard
  • TC2 Zweites Korrekturdokument zum Fortran 2003 Standard
  • TC3 Drittes Korrekturdokument zum Fortran 2003 Standard
  • TC4 Viertes Korrekturdokument zum Fortran 2003 Standard
  • TR 19767 (Submodule) (seit der Integration in Fortran 2008 obsolet)
  • Neue Features in Fortran 2003
  • ISO varying length character strings (dynamische Strings; durch die Einführung allozierbarer Strings mit zur Laufzeit festgelegter Länge in Fortran 2003 größtenteils obsolet)
  • Coco (Condiitional Compilation; wurde in der Praxis selten verwendet und daher als Standard zurückgezogen)

Fortran 95

  • TR-15580 (Funktionalität für die Behandlung von IEEE Floating-point exceptions, seit der Integration in Fortran 2003 obsolet)
  • TR-15581 (Erweiterungen der dynamischen Speicherverwaltung, seit der Integration in Fortran 2003 obsolet)

Standardisierungsarbeit und Neuentwicklungen

Kursunterlagen

Am LRZ finden zweimal im Jahr Blockveranstaltungen zur Programmierung mit Fortran statt (Grundlagen sowie fortgeschrittene Techniken). Die Unterlagen hierzu sind im PDF Format auf dem LRZ Web-Server verfügbar.

Beratung

Mit Fragen zu Fortran wenden Sie sich bitte an das Service Desk des LRZ.