
Fortran ist eine kompilierte, statisch typisierte, prozedurale Programmiersprache, die seit 2003 auch Objektorientierung beherrscht. Fortran gilt als die älteste höhere Programmiersprache und steht für Formula Translating System. Der Vorschlag zur Entwicklung der Sprache kam 1953 von John W. Backus bei IBM, der auch das Team leitete, das die erste Version der Sprache entwickelte. 1957 erschien der erste Fortran-Compiler. Seit 1966 ist Fortran ISO-standardisiert.
Alleinstellungsmerkmale
Fortran könnte man als die Mutter aller modernen Programmiersprachen bezeichnen. Es gilt als Vorläufer der ALGOL-Sprachfamilie, aus welcher wiederum Sprachen wie C, Smalltalk, Ada, Pascal und COBOL hervorgingen. Im Gegensatz zu den ALGOL-Sprachen ist Fortran aber auch heute noch im Einsatz. Fortran ist eine der wichtigsten Sprachen für numerische Simulationen und häufig die erste Wahl auf Supercomputern.
Einsatzbereiche
Fortran wird intensiv im wissenschaftlichen Bereich eingesetzt, etwa zur Klimamodellierung und Wettervorhersagen, in der Astronomie, Chemie oder Physik. Weltweit setzen immer noch tausende Unternehmen und Behörden Fortran ein, darunter unter anderem Boeing, Lockheed Martin und die NASA. Einer Analyse von enlyft nach sitzen über die Hälfte davon in den USA.
Pros
Fortran ist eine der schnellsten Sprachen für aufwändige numerische Berechnungen. Die Sprache ist im Vergleich mit anderen systemnahen Sprachen leicht zu lernen und bietet native Unterstützung für diverse mathematische Operationen. Fortran unterstützt komplexe Zahlen und Matrizen und ermöglicht einen einfachen Umgang mit mehrdimensionalen Arrays. Die meisten Fortran-Compiler beherrschen automatische Vektorisierung, zur Erklärung ist ein Dokument zum Fortran Intel Compiler am Ende des Beitrags verlinkt. Moderne Fortran-Compiler unterstützen auch parallele Verarbeitung.
Fortran bietet bereits viele mathematische Operationen von Haus aus an – siehe dazu die Verlinkung der eingebauten Funktionen im GFortran-Compiler am Ende des Beitrags – das über die Jahrzehnte gewachsene Ökosystem an Bibliotheken für den wissenschaftlichen Bereich ist aber nochmal ungleich größer. Fortran ist mit C-Code interoperabel, so dass es viele Bindings für bereits in C geschrieben Bibliotheken gibt, etwa für SQLite3.
Fortran bietet keine automatische Speicherbereinigung, versucht dem Entwickler aber viel Arbeit abzunehmen. Beispielsweise werden lokal in Prozeduren deklarierte und manuelle allokierte Strukuren beim Verlassen der Prozedur automatisch deallokiert.
Cons
Fortran ist eine sehr geschwätzige Sprache. In meinem Programm virtuallet, auf das ich auch am Ende des Beitrages verweise, liegt Fortran in meinem nicht-repräsentativen Vergleich mit 14 anderen Sprachen bei der Anzahl der Zeilen und Zeichen jeweils auf dem letzten Platz.
Wie auch in Pascal wird in Fortran zwischen Deklaration und Ausführung unterteilt, so dass alle Variablen innerhalb einer Prozedur oberhalb des eigentlichen Codes deklariert werden müssen. Fortran unterscheidet ebenfalls zwischen Funktionen, die immer einen Rückgabewert haben, und Subroutinen, die keinen Rückgabewert haben. Einer Subroutine wird beim Aufruf das Schlüsselwort call
vorangestellt, während eine Funktion nur im Kontext einer Zuweisung verwendet werden kann:
! Dies ist ein Kommentar.
! Um eine Funktion aufzurufen, muss eine Variable deklariert werden,
! die vom Typ des Rückgabewertes der Funktion ist:
character(len=*) :: returnval
! Die Prozedur "foo" wird mit dem Schlüsselwort "call" aufgerufen:
call foo()
! Die Funktion "bar" kann nur im Kontext einer Zuweisung aufgerufen werden:
returnval = bar()
Modernen Entwurfsmustern wie dem Builder Pattern sind diese Restriktionen meiner Meinung nach nicht zuträglich.
Viele Designentscheidungen erscheinen nach heutigen Gesichtspunkten zumindest ungewöhnlich, so können Datentypen etwa mithilfe der Schlüsselwörter read
und write
umgewandelt und dabei formatiert werden, etwa so:
! Schreibt den aktuellen Monat als Ganzzahl "month_integer
! in einen String "month_string" mit führender 0,
! wenn der Zahlenwert kleiner 10 ist.
write(month_string, '(i2.2)') month_integer
Zum besseren Verständnis des Ausdruckes (i2.2)
habe ich am Ende des Beitrages die Format-Spezifikation für FORTRAN 77 verlinkt.
Fortran verwendet als Member Access Operator nicht den in vielen Sprachen üblichen Punkt (.
) oder Pfeil (->
), sondern das Prozentzeichen (%
). Dies wirkt sich aus meiner Sicht negativ auf die Lesbarkeit aus, da das Zeichen quasi wie ein durchschnittlicher Buchstabe die komplette Horizontale und Vertikale beansprucht, während sich ein Punkt oder Bindestrich optisch viel besser von einem Buchstaben abgrenzt. Eine weitere Kuriosität von Fortran ist das Statement implicit none
. Es gehört zum guten Ton, dieses Statement in jedes program
und module
zu setzen. Das Statement unterdrückt ein sehr altes Feature, das alle Variablen als Real-Datentypen behandelt, mit Ausnahme derer, die mit den Buchstaben i, j, k, l, m und n beginnen und stattdessen als Integer-Datentypen behandelt werden.
In FORTRAN god is REAL, unless declared INTEGER.
Die Verwendung moderner dynamischer Datenstrukturen wie Listen unbekannter Größe stellt in Fortran eine Herausforderung dar. Während z.B. ein Java-Entwickler einfach auf eine Implementierung von java.util.List
zurückgreift und sich um die Speicherverwaltung gar keine Gedanken machen muss, sich ein C++-Entwickler für einen Vector zwar auf eine Größe festlegen muss, diese aber mit einem Aufruf von resize()
jederzeit ändern kann, so muss ein Fortran-Entwickler für diesen Anwendungsfall mit zwei Arrays arbeiten und die Inhalte hin- und herschieben, damit das eine Array deallokiert und mit einer neuen Größe reallokiert werden kann. Der folgende Codeausschnitt zeigt, wie ich dies gehandhabt habe:
! Ausschnitt der Deklaration
type(due_date), dimension(:), allocatable :: due_dates, buffer
integer :: current_size, insert_index
! Ausschnitt der Resizing-Logik
if (insert_index == current_size) then
current_size = current_size + current_size/2 + 1
call move_alloc(due_dates, buffer)
allocate(due_dates(1:current_size))
due_dates(:size(buffer)) = buffer(:size(buffer))
end if
Datenblatt
Name | Fortran |
Webseite | https://fortran-lang.org/ |
Erscheinungsjahr | 1957 |
Aktuellste Version (Stand 15. Mai 2022) | Fortran 2018 (ISO/IEC 1539:2018) |
Typisierung | statisch |
Paradigmen | imperativ prozedural objektorientiert |
Pros | Cons |
---|---|
eine der schnellsten Sprachen für numerische Berechnungen | sehr verbos |
leicht zu erlernen | viele nach modernen Gesichtspunkten eigenartige Designentscheidungen |
native Unterstützung für diverse mathematische Funktionen | wenig Eignung für moderne Entwurfsmuster und Anwendungsfälle außerhalb der Wissenschaft |
großes Ökosystem an Bibliotheken für den wissenschaftlichen Bereich | |
gute Unterstützung bei der Speicherverwaltung |
virtuallet
virtuallet ist ein kleines Programm von mir, welches ich in diversen Programmiersprachen implementiert habe. Hier geht es direkt zum Fortran-Code von virtuallet auf GitLab. Hier gibt es weitere Infos zu virtuallet.
- eingebaute Funktionen (gfortran) - Automatische Vektorisierung (Intel Fortran Compiler) - FORTRAN 77 Format-Spezifikation