Fortran
Fortran ist eine Programmiersprache, die insbesondere für numerische Berechnungen eingesetzt wird. Der Name entstand aus FORmula TRANslation und wurde bis zur Version FORTRAN 77 mit Großbuchstaben geschrieben.
Geschichte
Fortran gilt als die erste höhere Programmiersprache. Sie geht zurück auf einen Vorschlag, den John W. Backus, Programmierer bei IBM, 1953 seinen Vorgesetzten unterbreitete.
Dem Entwurf der Sprache folgte die Entwicklung eines Compilers durch ein IBM-Team unter Leitung von John W. Backus. Das Projekt begann 1954 und war ursprünglich auf sechs Monate ausgelegt. Tatsächlich konnte Harlan Herrick, der Erfinder der später heftig kritisierten Goto-Anweisung, am 20.09.1954 das erste Fortran-Programm ausführen. Doch erst 1957 wurde der Compiler für marktreif befunden und mit jedem IBM 704-System ausgeliefert. Backus hatte darauf bestanden, dem Compiler von Anfang an mit der Fähigkeit zu Optimierungen auszustatten: er sah voraus, dass sich Fortran nur dann durchsetzen werde, wenn ähnliche Ausführungsgeschwindigkeiten wie mit bisherigen Assembler-Programmen erzielt würden.
Versionen
Fortran wurde mehrmals erweitert. Viele neue Sprachelemente wurden zunächst von einem einzelnen Hersteller eingeführt und später in den internationalen Standard übernommen. Als Standards folgten aufeinander FORTRAN I, FORTRAN II, FORTRAN IV, FORTRAN 66, FORTRAN 77, Fortran90 und Fortran95. Die Fortschreibung der Standards ist ein komplizierter Prozess, der oft wesentlich länger dauert als zunächst angestrebt: so war Fortran90 ursprünglich für 1988 angekündigt.
Im Laufe dieser Erweiterungen wurden zahlreiche Sprachelemente aus neueren Programmiersprachen übernommen. Beruhte früher Fortran-Stil noch ganz auf GOTO-Anweisungen, kann man seit FORTRAN 77 uneingeschränkt "strukturiert" programmieren. Mit Fortran90 wurde das aus der Lochkartenzeit stammende Zeilenformat freigegeben.
Varianten
Einige von Fortran abgeleitete Programmiersprachen sind Ratfor, F und HPF (High Performance Fortran). Auf Fortran aufgesetzt die Finite Elemente-Programmiersprache Nastran.
Eigenschaften
Fortran war und ist für numerische Berechnungen intendiert und optimiert. Von Anfang an hatte Fortran einen Potenz-Operator ("**") - der in vielen anderen Hochsprachen fehlt - und einen Datentyp für komplexe Zahlen. Mit Fortran90 wurden Vektor- und Matrix-Operationen standardisiert.
Insbesondere für wissenschaftliche und numerische Berechnungen existieren in FORTRAN umfangreiche Bibliotheken, die immer noch unentbehrlich sind, auch wenn eine zunehmende Menge an Routinen inzwischen nach C portiert worden ist.
Implizite Variablendeklaration
In Anlehnung an mathematischen Notationsgebrauch sind Variablen in Fortran defaultmäßig über ihren Anfangsbuchstaben deklariert: Bezeichner, die mit einem der Buchstaben i,j,k,l,m,n beginnen, stehen für eine INTEGER-Variable oder einen INTEGER-Funktionswert, alle übrigen Bezeichner stehen für REAL-Werte. Dieser Default kann durch die Deklaration einzelner Variablen überschrieben werden, er kann durch einen Befehl wie
- IMPLICIT (c) COMPLEX*16
überschrieben werden, und er kann durch den Befehl
- IMPLICIT NONE
ganz aufgehoben werden, in welchem Fall jeder nichtdeklarierte Bezeichner einen Compilerfehler auslöst.
Einige Arbeitgeber halten ihre Programmierer dazu an, auch in anderen Programmiersprachen eine Fortran-ähnliche Namenskonvention zu befolgen (ungarische Notation).
Übergabe von Parametern
Unterprogramme müssen vor ihrer Verwendung nicht deklariert werden; es kann durch eine Deklaration allenfalls der Typ des Rückgabewerts festgelegt werden; der Compiler hat keine Möglichkeit, zu überprüfen, ob ein Unterprogrammaufruf mit typrichtigen Parametern erfolgt. Die Übergabe von Parametern an Unterprogramme (SUBROUTINE oder FUNCTION) erfolgt ausschließlich per Adresse; deshalb findet auch zur Laufzeit keine Typprüfung und keine automatische Typumwandlung statt.
Das ist eine häufige Fehlerquelle. Nehmen wir an, eine bestimmte Fortran-Implementation arbeitet per Default mit 4-Byte-Ganzzahlen (INTEGER*4) und mit 8-Byte-Gleitkommazahlen (REAL*8). Programmbeispiel 1:
- ...
- DruckeZahl( 3.14 )
- ...
- SUBROUTINE DruckeZahl( meineZahl )
- ...
Im Unterprogramm DruckeZahl ist meineZahl (natürlich würde kein Fortran-Programmierer so explizite Variablennamen wählen, und zwischen Groß- und Kleinschreibung unterscheidet ein Fortran-Compiler schon gar nicht), weil mit m beginnend, implizit als INTEGER deklariert. Zur Laufzeit erfolgt ein Aufruf mit dem reellen Argument 3.14. Dann wird die 4-Byte-Variable meineZahl mit den ersten 4 Bytes der 8-Byte-Gleitkommadarstellung von 3.14 aufgefüllt - was auf beliebig abwegige numerische Ergebnisse führt.
Programmbeispiel 2:
- ...
- i = 3
- j = 8
- ErhoeheZahl( i )
- ...
- SUBROUTINE ErhoeheZahl( deineZahl )
- deineZahl = deineZahl + 1
- ...
An diesem Beispiel zeigt sich besonders deutlich, dass Fortran Zeiger übergibt, nicht Werte. Problematisch ist wiederum die fehlende Typprüfung: Die Variable deineZahl ist implizit REAL*8. Zur Laufzeit greift die Routine ErhoeheZahl deshalb auf die der Adresse von i folgenden 8 Byte zu. Die Variable i belegt aber nur 4 Byte; das heißt: ErhoeheZahl veranstaltet nicht nur arithmetischen Unsinn mit der fehlinterpretierten Zahl i, sondern verändert auch noch 4 andere Bytes. Vielleicht ist in diesen 4 anderen Bytes die Zahl j gespeichert, vielleicht aber auch eine andere Zahl; unter Umständen gehören diese Bytes gar nicht zum Adressraum unseres Programms, das in diesem Fall mit Segmentation Fault abstürzen wird.
Dynamische Speicherallokation
Unter dynamischer Speicherallokation versteht man die Möglichkeit, Speicher (insbesondere für Arrays wie z.B. für Matrizen) erst zur Laufzeit des Programms anzufordern, das heißt die Größe der Arrays müssen nicht bereits vor dem Kompilieren des Programms festgelegt werden. Bis (mindestens) einschließlich Fortran 77 ist eine dynamische Speicherallokation mittels Fortran nicht möglich, sie kann aber durch Einbindung eines entsprechenden kleinen C-Programms realisiert werden.
Compiler
Kommerziell
F77-Compiler gibt es für praktisch alle Computer, von Arbeitsplatzrechnern bis zu Supercomputern. Hersteller sind entweder die Computerhersteller wie z.B. IBM, SUN, HP, Intel oder aber spezialisierte Softwarehersteller wie z.B Absoft, PGI, NAG.
Auch F90-Compiler werden von den gleichen Firmen hergestellt. Außerdem gibt es Compiler mit beschränktem Funktionsumfang zum Beispiel von Lahey (Essential Lahey Fortran, ELF).
Kostenlos
Manche der oben genannten Compiler sind für Privatanwender kostenlos. Frei verfügbar ist auch der g77-Compiler (FORTRAN 77) aus der Gnu Compiler Collection gcc, der praktisch für alle Plattformen vorhanden ist. Außerdem existieren zwei Projekte (GNU Fortran 95 und G95) mit dem Ziel, einen Compiler für den aktuellen Sprachstandard als freie Software zu entwickeln.
Übersetzer
Es gibt Programme, wie z.B. f2c, zur automatischen Übersetzung von Fortran in (allerdings kaum lesbares) C.
Weiterführende Informationen
Literatur zur Geschichte von Fortran
- Annals of History of Computing, 6, 1, Jan. 1984.
- S. Rosen (ed.), Programming Systems and Languages, McGraw Hill, 1967.
- R.L. Wexelblat (ed.), History of Programmining Languages, Academic Press, 1981, S. 25-74.