Das Kefk Network Wiki befindet sich im Testbetrieb.


Fortran

Aus Kefk.

(Weitergeleitet von FORTRAN)
Wechseln zu: Navigation, Suche
Fortran

Basisdaten
Paradigmen: prozedural, imperativ, strukturiert, objektorientiert
Erscheinungsjahr: 1957
Designer:
Entwickler: John W. Backus, IBM
Aktuelle Version:  ()
Typisierung: statisch, stark
wichtige Implementierungen: gfortran, g95, Open Watcom, XL Fortran und andere
Dialekte:
Einflüsse:
Beeinflusste: Algol 58, PL/I
Betriebssystem:
Lizenz:
Website:
Wikipedia
Dieses Dokument entstammt in seiner ersten oder einer späteren Version der deutschsprachigen Wikipedia. Es ist dort zu finden unter dem Stichwort Fortran, die Liste der bisherigen Autoren befindet sich in der Versionsliste; die Originalfassung kann dort auch bearbeitet werden. Alle Texte der Wikipedia und ihre Derivate stehen unter der GNU-Lizenz für freie Dokumentation.


Fortran ist eine prozedurale und in ihrer neuesten Version zusätzlich eine objektorientierte 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.

Inhaltsverzeichnis

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, den Compiler von Anfang an mit der Fähigkeit zu Optimierungen auszustatten: er sah voraus, dass sich Fortran nur dann durchsetzen würde, 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 Versionen folgten aufeinander FORTRAN I, FORTRAN II, FORTRAN IV, FORTRAN-66, FORTRAN-77, Fortran90, Fortran95 und zuletzt Fortran2003. Ab FORTRAN-66 ist Fortran von einer internationalen Organisation standardisiert. 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, erschien aber erst 1990.

Im Laufe dieser Erweiterungen wurden zahlreiche Sprachelemente aus später entstandenen Programmiersprachen übernommen. Beruhte früher Fortran-Stil noch ganz auf Goto-Anweisungen, kann man seit FORTRAN 77 uneingeschränkt strukturiert programmieren. Mit Fortran90 wurde neben dem aus der Lochkartenzeit stammende Zeilenformat ein von späteren Programmiersprachen verwendetes freieres Format erlaubt. Ab Fortran 90 werden interessante Elemente eingeführt, die auch z.B. in Ada vorhanden sind, beispielsweise optionale Parameter und die Möglichkeit, Prozedurparameter nicht nur über die Position in der Parameterliste zu identifizieren, sondern über ihren Namen.

Beispiel:

SUBROUTINE Bla( Argument1, Argument2, Argument3 )
REAL,              INTENT(IN) :: Argument1
CHARACTER(LEN= *), INTENT(IN) :: Argument2
INTEGER,           INTENT(IN), OPTIONAL :: Argument3
! Hier was sinnvolles.
END SUBROUTINE

Mögliche Aufrufe sind dann z.B.:

 CALL Bla( 1.0, 'Tach' )
 CALL Bla( Argument1= 1.0, Argument2= 'Tach auch' )
 CALL Bla( Argument2= 'Tach Auch', Argument1= 1.0 )
 CALL Bla( Argument3= 3, Argument1= 1.0, Argument2= 'Tach auch' )

Während beim ersten Aufruf die Parameterassoziation über die Reihenfolge der Parameter erfolgt, so werden bei den anderen Beispielen die Parameter mittels der Namen identifiziert. Bei letzterem spielt die Reihenfolge dann keine Rolle mehr.

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 vorgesehen und optimiert. Von Anfang an hatte Fortran den Potenz-Operator ** – der in vielen anderen Hochsprachen nicht vorhanden ist – und einen Datentyp für komplexe Zahlen. Mit Fortran90 wurden Vektor- und Matrix-Operationen standardisiert. Ein Fortran-Programm kann leichter optimiert werden als z.B. ein C-Programm, da Fortran restriktiver ist. Beispielsweise ist es nicht erlaubt, innerhalb einer Iterationsschleife die Iterationsvariable zu verändern. Unter anderem ist deshalb beim Eintritt in die Schleife die Maximalzahl der Durchläufe bekannt.

! iFunc() sei eine Funktion, die einen INTEGER Wert berechnet.
! Der Compiler muss nur einen Aufruf von iFunc erzeugen.
DO i= 1, iFunc(4711)
   !.. sinnvolles hier.
   ! Innerhalb dieser Schleife darf i nicht verändert werden.
ENDDO

In C sieht eine solche Iteration so aus:

imax = ifunc(4711);
for (i=1; i<=imax; i++) {
   /* Sinnvolles hier */
   /* Es ist hier erlaubt, i zu verändern */
}

Die for-Schleife in C ist keine einfache Zählschleife wie in Fortran. Das zweite Argument (hier i<=imax) ist ein logischer Ausdruck. Die Schleife läuft, solange dieser Ausdruck wahr ist. Andererseits kann deshalb dort nicht einfach der maximale Wert als Funktionsergebis stehen, da nicht sichergestellt werden kann, dass ifunc keine Seiteneffekte hat, ungeachtet dessen, dass es stets das gleiche Ergebnis für 4711 liefert.

Insbesondere für wissenschaftliche und numerische Berechnungen gibt es in FORTRAN umfangreiche Bibliotheken, die immer noch weit verbreitet sind, auch wenn eine zunehmende Menge an Funktionalität inzwischen nach C und C++ portiert wurde.

Implizite Variablendeklaration

In Anlehnung an mathematischen Notationsgebrauch sind Variablen in Fortran standardmäß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. Diese impliziten Typenvereinbarung von Variablen kann durch die Deklaration einzelner Variablen überschrieben werden, sie kann durch eine Zeile wie

IMPLICIT COMPLEX (c, z)  ! Alle nichtdeklarierten Bezeichner, deren erster Buchstabe c oder z ist, bezeichnen komplexe Zahlen.

verändert werden, und die implizite Vereinbarung kann durch den Befehl

IMPLICIT NONE

ganz aufgehoben werden. In diesem Fall löst die Verwendung eines nichtdeklarierten Bezeichners einen Fehler während der Übersetzung aus. Dadurch vereinfacht sich die Fehlersuche erheblich.

Übergabe von Parametern

In alten Versionen von Fortran (FORTRAN 77 und früher) mussten Unterprogramme vor ihrer Verwendung nicht deklariert werden. Es konnte durch eine Deklaration allenfalls der Typ des Rückgabewerts festgelegt werden. Der Compiler überprüfte normalerweise nicht, ob ein Unterprogrammaufruf mit typrichtigen Parametern erfolgt. Die Übergabe von Parametern an Unterprogramme (SUBROUTINE oder FUNCTION) erfolgt üblicherweise per Adresse. Vor Fortran-90 konnten grundsätzlich alle Aktualparameter von einer SUBROUTINE oder FUNCTION verändert werden. Deshalb müssen alle Parameter z.B. durch Adressübergabe übergeben werden. Eine automatische Typumwandlung kann deshalb auch nicht stattfinden.

Die meisten Fortran Systeme führen auch keine Typüberprüfung zur Laufzeit durch.

Das ist eine häufige Fehlerquelle. Programmbeispiel 1:

...
CALL DruckeZahl(3.14)
...
SUBROUTINE DruckeZahl(meineZahl)
...

Im Unterprogramm DruckeZahl ist meineZahl, weil mit m beginnend, implizit als INTEGER deklariert. Zur Laufzeit erfolgt ein Aufruf mit dem REAL Argument 3.14. Dann wird die INTEGER-Variable meineZahl mit den Bits der Gleitkommadarstellung von 3.14 aufgefüllt – was auf beliebig abwegige numerische Ergebnisse führt.

Viele Fortran-Compiler arbeiten mit Zeigern zur Übergabe von Parametern. Das führt zu teilweise amüsanten Ergebnissen, z.B. folgendes Programmbeispiel 2:

call bar(3)
print *,3
end
subroutine bar(i)
i=42
end

was bei manchen Compilern die Zahl 42 ausgeben würde. Das Programm ist allerdings so nicht korrekt.

Programmierwerkzeuge wie ftnchek ermöglichen allerdings eine separate Prüfung der Übereinstimmung von Argumentlisten und würden in diesen Fällen warnen.

In Fortran 90 und nachfolgenden Versionen besteht die Möglichkeit, die Parametertypen der Unterprogramme anhand von Schnittstellen (INTERFACE) und Modulen (MODULE) zu definieren. Der Compiler kann somit überprüfen, ob der übergebene Parametertyp und der erwartete Typ übereinstimmt. Diese Bekanntgabe ist allerdings nicht zwingend, so wie es in anderen Programmiersprachen, beispielsweise Ada der Fall ist. Die von Fortran-95 abgeleitete Programmiersprache F erzwingt dieses, in F sind nur Aufrufe von Unterprogrammen erlaubt, deren Parameterliste z.B. durch USE-Anweisungen bekannt gemacht sind. In einem Unterprogramm kann auch festgelegt werden, ob ein Parameter Eingabeparameter (INTENT(IN)), Ausgabeparameter (INTENT(OUT)) oder beides (INTENT(INOUT)) ist. In Fortran 90 deklariert man das Unterprogramm bar folgendermaßen:

subroutine bar(i)
integer, intent(in):: i
[...]
end subroutine

Falls das Unterprogram versuchen sollte, den Wert des Aktualparameter i zu setzen, würde der Compiler eine Fehlermeldung anzeigen.

Dynamische Speicherallokation

Unter dynamischer Speicherallokation versteht man die Möglichkeit, Speicher (insbesondere für Felder wie z.B. für Matrizen) erst zur Laufzeit des Programms anzufordern, das heißt, daß die Größe von Arrays nicht bereits zum Zeitpunkt des Übersetzen des Programms festgelegt sein muss. 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.

Ein Beispiel für dynamische Speicherreservierung: Anlegen und Bearbeiten einer verketteten Liste:


TYPE tElement
   TYPE (tElement), POINTER :: Naechstes
   REAL :: Datum
END TYPE tElement
TYPE (tElement), POINTER, SAVE :: Liste=> NULL(); -- NULL(): Fortran-95


TYPE (tElement), POINTER :: Element
! Anlegen eines Elements und Eintragen am Anfang der Liste
ALLOCATE( Element )
Element% Datum= 4711.0
Element% Naechstes=> Liste
Liste=> Element
! Durchlaufen der Liste:
Element=> Liste
DO WHILE (ASSOCIATED(Element))
   CALL Bearbeiten( Element% Datum )
   Element=> Element% Naechstes
ENDDO

Compiler

Bisher (Januar 2007) gibt es keinen Compiler, der den aktuellen Fortran-Standard von 2003 voll unterstützt. Die meisten Compiler unterstützen jedoch Teile des Fortran 2003 Standards.

Proprietäre Software

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, Salford. Reine F77-Compiler werden heute zumeist nicht mehr hergestellt, da Fortran77 fast vollständig im Sprachstandard Fortran95 enthalten ist (Nur DO-Schleifen mit REAL-Iterationsvariablen und Hollerith-Edit-Deskriptoren sind in Fortran95 und später verschwunden).

Manche der oben genannten Compiler sind für Privatanwender bzw. nichtkommerzielle Nutzung kostenlos, zum Beispiel die Linux-Variante des Intel-Fortran-Compilers (aktuelle Version 9.1), Sun Studio Express (mit Fortran, C und C++ Compilern für Linux und Solaris) oder für Microsoft-Windows der Compiler von Salford.

Freie Software

Seit Version 4.0 der GNU Compiler Collection (GCC), die praktisch für alle Plattformen vorhanden ist, enthält diese einen Fortran 95 Frontend (gfortran). Ältere Versionen von GCC enthalten noch den FORTRAN 77 Frontend g77. Außerdem existiert mit G95 ein weiterer freier Fortran 95 Compiler (aus diesem ging 2003 gfortran hervor). G95 ist weiter fortgeschritten als gfortran.

Auch die OpenWatcom-Entwicklersuite verfügt über einen FORTRAN 77-Compiler.

Übersetzer

Es gibt Programme, wie z.B. f2c, zur automatischen Übersetzung von Fortran-77 in (allerdings kaum lesbares) C. Auch der NAG-Compiler verwendet als Zwischensprache C, allerdings ist die nötige Laufzeitbibliothek nicht im Quelltext zu bekommen.

Literatur zur Geschichte von Fortran

  • Annals of History of Computing, 6, 1, Jan. 1984.
  • S. Rosen (Hrsg.): Programming Systems and Languages, McGraw Hill, 1967.
  • R. L. Wexelblat (Hrsg.): History of Programmining Languages., Academic Press, 1981, S. 25–74.

Literatur zu Fortran

  • Michael Metcalf, John Reid, Malcolm Cohen: Fortran 95/2003 Explained, Oxford University Press, 2004, ISBN 0-19-852693-8
  • Stephen J. Chapman: Fortran 90/95 for Scientists and Engineers - 2nd edition, McGraw Hill, 2004, ISBN 007-123233-8 (International Edition)
  • Thomas Kühme, Peter Witschital: Die FORTRAN-Fibel: Strukturierte Programmierung mit FORTRAN 77, Oldenbourg, 1991, ISBN 3-486-22016-0
  • Günter Schmitt: Fortran-90-Kurs technisch orientiert: Einführung in die Programmierung mit Fortran 90, Oldenbourg Verlag, 1996, ISBN 3-486-23896-5
  • William H. Press, Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery: Numerical Recipes in FORTRAN 77: The Art of Scientific Computing - Volume 1 of Fortran Numerical Recipes - 2nd Edition, Cambridge University Press, 1992 (zweite Edition), 2003 (Reprint mit Korrekturen), ISBN 0-521-43064-X
  • William H. Press, Saul A. Teukolsky, William T. Vetterling, Brian P. Flannery: Numerical Recipes in Fortran 90: The Art of Parallel Scientific Computing - Volume 2 of Fortran Numerical Recipes - 2nd Edition, Cambridge University Press, 1996 (erste Auflage), 1999 (Reprint mit Korrekturen), ISBN 0-521-57439-0

Weblinks

<imagemap>-Fehler: Bild ist ungültig oder nicht vorhanden Wikibooks: Fortran – Lern- und Lehrmaterialien
Diese Seite
Persönliche Werkzeuge
Navigation
Kefk Network
Mitmachen
Ressourcen
Werkzeuge
Andere Sprachen