Fortran

prozedurale Programmiersprache
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 10. Juni 2005 um 21:27 Uhr durch Zwobot (Diskussion | Beiträge) (robot Ergänze: no). Sie kann sich erheblich von der aktuellen Version unterscheiden.

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 jemals tatsächlich realisierte 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. September 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, Fortran95 und zuletzt Fortran2003. 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 ist das Finite Elemente-Programmpaket Nastran.

Eigenschaften

Fortran war und ist für numerische Berechnungen intendiert und optimiert. Von Anfang an hatte Fortran den 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. Dies vereinfacht die Fehlersuche.

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.

In Fortran90 besteht die Möglichkeit die Parametertypen der Unterprogramme anhand von Schnittstellen (INTERFACE) and Module (MODULE) zu definieren. Der Compiler kann somit überprüfen, ob der übergebene Parametertyp und der erwachtete Typ übereinstimmt so wie es in anderen Programmierspachen, beispielsweise C und Pascal der Fall ist.

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 Fortran 77 ist eine dynamische Speicherallokation nicht oder nur über nicht standardisierte Erweiterungen der Compilerhersteller möglich. Ab Fortran 90 ist dynamische Speicherverwaltung im Sprachstandard enthalten, beschränkt sich jedoch auf die Basisdatentypen. Dynamisches allokieren strukturierter Datentypen wird erst ab dem Sprachstandard 2003 unterstützt zu dem, bis zum heutigen Zeitpunkt (März 2005), jedoch noch kein Compiler existiert.

Compiler

Kommerziell

F95-Compiler gibt es für praktisch alle Computer, von Arbeitsplatzrechnern bis zu Supercomputern. Hersteller hierfür sind entweder die Computerhersteller wie z.B. IBM, SUN, HP, Intel oder aber spezialisierte Softwarehersteller wie z.B Absoft, PGI, NAG, Lahey . Reine F77 Compiler werden heute zumeist nicht mehr hergestellt, da Fortran77 vollständig im Sprachstandard Fortran95 enthalten ist. Bis zum heutigen Zeitpunkt (März 2005) gibt es keinen Compiler der den aktuellsten Fortran Standard von 2003 unterstützt.

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. Der Fortran 95 Compiler von Intel ist ebenfalls fuer nicht-kommerzielle Nutzung kostenlos.

Ü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.