ZIDline
Fortran Forever?
Josef Redinger, Institut für Angewandte Physik
Ein kleiner persönlicher Exkurs über Geschichte und Bedeutung dieser Programmiersprache

Die Frage, warum Fortran – eine quasi antike Sprache – auch heute noch diese große, für manche unverständliche Bedeutung in den Naturwissenschaften hat, ist durchaus berechtigt. Als Versuch einer Antwort möchte ich gleich zu Beginn ein paar Zitate wiedergeben, die meiner Meinung nach die Situation treffend beschreiben.

Alexander Patashinski, ein Landau Schüler und Preisträger, heute Professor am Department of Physics der Northwestern University, wo ich meine Post-Doc Zeit verbrachte, bemerkte einmal während einer Diskussion fast resignativ: "You start with English and you end up with Fortran". Obwohl damals nicht unbedingt die Sprache Fortran selbst gemeint war sondern die enorm gestiegene Bedeutung des Computers in der theoretischen Physik, so ist es doch bezeichnend, dass der Name Fortran synonym für diese Entwicklung stand.

Tony Hoare, Professor in Oxford, Erfinder des Quick-Sort Algorithmus und Turing Preisträger provozierte auf einer Konferenz im Jahre 1982 mit der Aussage: "I don’t know what the language of the year 2000 will look like, but I know it will be called Fortran."  Was er damit meinte, war nicht, wie Kritiker unterstellten, dass Fortran "die" Programmiersprache im Jahr 2000 sein wird, sondern eher, dass Fortran auch im Jahr 2000 noch existieren wird, da Fortran laufend interessante Merkmale und Eigenschaften anderer neuer Sprachen adaptiert, ein Vorgang, der bis  heute dauert, und ich wage die Behauptung, auch in der Zukunft andauern wird.

Piet Hut, Professor für Astrophysik am Institute for Advanced Study in Princeton bringt die Sache auf den Punkt, wenn er in einem seiner Blogs schreibt:

"Physicists have a traditional aversion to learning any other language than Fortran, with which they grow up, no matter how useful the other languages may be. But without ever parting from their beloved Fortran, it was Fortran that changed out from under them, incorporating many of the features that the other languages had pioneered. So, when asked how future physicists will program, a good answer is: we have not the foggiest idea, but whatever it is, it will still be called Fortran."

Viel besser kann man eigentlich den Stand der Dinge nicht zusammenfassen, denn Fortran lebt einerseits von der Aversion der Physiker/Chemiker/etc. neue Sprachen zu lernen, wo einem doch Fortran so ans Herz gewachsen ist und auch meistens das tut was man will, und andrerseits von der Anpassungs- und Erneuerungsfähigkeit von Fortran, sodass das Fortran von heute eigentlich eine ganz andere Sprache ist als das Fortran, das als Formula Translator Mitte der 1950er Jahre geschaffen wurde, aber trotzdem im Laufe der Zeit seine Stärken immer beibehalten hat. Kurz gesagt, wenn man Fortran spricht, spricht man eine lebend(ig)e Sprache.

Doch nun ein wenig zur Geschichte von Fortran. Fortran entstand bei IBM zwischen 1954 und 1957 und hat damit während seiner fast 60-jährigen Existenz quasi die ganze Hardwareentwicklung vom Mainframe über PC und Vektorrechnern zu den heutigen Parallelsystemen mitgemacht. Nicht zu vergessen – aus sehr persönlichen Erfahrungen – 8-bit Rechner unter CP/M, wo der Fortran Compiler Ende der 1970er Jahre von einer kleinen, eher unbekannten Softwarefirma namens Microsoft beigesteuert wurde. (Der Autor fürchtet leider, dass die letzte 8" Floppy mit dem Compiler bei einer der Übersiedlungen verloren gegangen ist.)

Ein wesentlicher Grund für die Entwicklung von Fortran bei IBM war laut seinem Erfinder John Backus (eigentlich war er Chef einer kleinen Entwicklergruppe) die Tatsache, dass er nicht gerne programmierte, zumal zur damaligen Zeit Programme für die Großrechner vom Typ IBM 704 in Assembler Code geschrieben wurden und die Anzahl der Anweisungen relativ groß war. Der erste Compiler erschien 1957 und überzeugte seine Skeptiker sehr schnell, da er einerseits die Anzahl der Anweisungen um einen Faktor 20 reduzierte und andrerseits die Geschwindigkeit des generierten Codes mit handgeschriebenen Assembler Routinen mithalten konnte.

Um den Geschwindigkeitskritikern den Wind aus den Segeln zu nehmen, war bereits der erste Fortran Compiler als ein optimierender Compiler ausgelegt, eine Tatsache, die bis zum heutigen Tage Fortran Compiler auszeichnet, und so zur weiten Akzeptanz und zum Überleben der Sprache Fortran kräftig beigetragen hat. Die erste Ausgabe von Fortran, Fortran I, enthielt 32 Anweisungen, wobei allein 14 davon auf Ein- und Ausgabe auf Magnetbänder, Papier und Lochkarten fielen, aber auch Anweisungen zur Steuerung von Schaltern und Lämpchen an der Operatorkonsole beinhalteten. D. h., die Zahl der Anweisungen (implizite Datentypen, IF, DO Loops, GOTO, Labels, Felder) für eine Übersetzung der Formeln in ein Computerprogramm war nicht sehr groß, was zur Folge hatte, dass solche Programme für heutige Programmierer etwas unübersichtlich wirken, um es vornehm auszudrücken, da eine Strukturierung über Unterprogramme und Funktionen erst in der nächsten Ausgabe Fortran II im Jahre 1958 möglich wurde. Dies stellte einen großen Schritt vorwärts in Bezug auf Wartbarkeit und Erweiterbarkeit von Fortran- Programmen dar. Fortran II führte auch zur Übergabe von Daten zwischen den einzelnen Programmteilen über Parameterlisten (Referenzen) und Rückgabewerten eine zusätzliche Anweisung namens COMMON ein, mit der man elegant Daten in Blöcken zusammenfassen konnte, die in den verschiedenen Unterprogrammen gebraucht wurden. Zusätzlich konnte man einem COMMON Block noch einen Namen geben, wodurch eine einfache Strukturierung der Daten möglich war (auf Ähnlichkeiten zu C-Strukturen will ich hier nicht eingehen). Allerdings stellte gerade diese sehr Fortran-typische Anweisung eine immanente Fehlerquelle dar, da im Prinzip nur die Startadresse eines COMMON Blocks übergeben wurde und daher mit einer ungeschickten Änderung in einem Unterprogramm (z. B. konnten nicht gebrauchte Elemente in einem Block neu verwendet werden, denn Speicherplatz war knapp in Zeiten ohne virtuelle Speicherverwaltung) schwer zu findende Laufzeitfehler oder – noch schlimmer – falsche Ergebnisse die Folge waren. Es war also ratsam, sich an ein paar einfache Regeln bei der Verwendung von COMMON Blöcken zu halten, wie z. B. verschiedene Datentypen nicht in einem Block zu mischen. Eine einfache Abhilfe wurde dann erst 30 Jahre später mit der Einführung von Modulen im Fortran 90 Standard geschaffen. Allerdings waren die COMMON Blöcke eine unvermeidbare Sache, falls man OVERLAY Techniken verwenden wollte, eine Technik, um eine große Anwendung, wie z. B. die Lösung der Schrödingergleichung in Festkörpern im knappen Hauptspeicher (z. B. maximal 200 000 oktal Worte für Benutzer der CDC Cyber am TU Rechenzentrum Anfang der 80er Jahre)  unterzubringen. Das Aufkommen von Betriebssystemen mit virtueller Speicherverwaltung, etwa zur selben Zeit, löste dann dieses Problem, allerdings manchmal auf Kosten der Ausführungsgeschwindigkeit.

Bis zur Einführung des ersten offenen Standards für höhere Programmiersprachen, ANSI Fortran 66, wurden noch zwei wichtige Datentypen, DOUBLE PRECISION (üblicherweise 64bit Gleitkommazahl) und COMPLEX, zur Sprache hinzugefügt, die gerade bei numerischen Lösungen von wissenschaftlichen Problemen eine wichtige Rolle spielen, da, um auf mein Fach zurückzukommen, die fünfte Stelle hinter dem Komma bei einer Zahl mit fünf Vorkommastellen signifikant ist. Der ANSI Fortran 66 Standard basiert auf dem 1962 veröffentlichten IBM Fortran IV (Fortran III blieb unveröffentlicht), das im Wesentlichen alle maschinenabhängigen Merkmale aus Fortran II entfernte und zusätzlich noch bool'sche Datentypen und Vergleiche zuließ. Fortran 66 stellte auch eine zusätzliche Neuerung dar, als die Standardisierung von einer privaten Firma IBM auf eine nicht profitorientierte Normungsorganisation, ANSI, überging, wo Firmen und Organisationen in Arbeitsgruppen zum Standard beitragen bzw. sich über einen Standard verständigen können.

Nachdem bereits relativ rasch nach Erscheinen von Fortran 66 verschiedene Firmen begannen, den Standard proprietär zu erweitern, entschloss sich ANSI bereits 1969, den 66er Standard zu erweitern, was schließlich im Fortran 77 Standard mündete, der dann schlussendlich 1978 angenommen wurde. Fortran 77 läutete das Ende der oftmals über weite Bereiche reichenden GOTO Sprunganweisungen durch die Einführung von Block IF und END IF und von IF THEN ELSE Verzweigungen ein, was die Lesbarkeit von Fortran-Programmen deutlich steigerte. Ebenso wurde die Behandlung nicht-numerischer Daten durch den neuen Datentyp CHARACTER vereinfacht.  Eine nicht zu unterschätzende Erleichterung brachte auch die PARAMETER Anweisung mit sich, da sich damit z. B. Feldgrößen mit der Änderung einer Variablen vom Typ PARAMETER an allen Stellen im Programm anpassen ließen, und somit quasi eine "dynamische" Speicherverwaltung zur Übersetzungszeit möglich war; eine richtige dynamische Speicherverwaltung wurde aber erst mit Fortran 90 möglich. Mitte der 70er Jahre begann eine rasante Entwicklung in Programmiertechniken und Hardware, was zur Folge hatte, dass die Festlegung eines Nachfolgers des Fortran 77 Standards sich immer wieder verzögerte, da die Vorschläge teilweise schon überholt waren, als sie eingereicht wurden. Im Wesentlichen hielt sich der Fortran 77 Standard fast 15 Jahre, wobei die meisten verfügbaren Compiler den ANSI Standard um ein paar Anweisungen erweiterten (z. B. DO WHILE oder END DO), wie sie vom MIL-STD-1753 des US Verteidigungsministeriums 1978 festgelegt wurden. Der lange verzögerte Standard Fortran 90 wurde 1991 als ISO und 1992 als ANSI Standard akzeptiert. Fortran 90 war ein großer Schritt und führte eine Menge von Neuerungen ein. Die wichtigsten möchte ich hier nur kurz aufzählen:

  • Freies Format für Fortran-Programme (keine Signifikanz der Spalten 1-6 und 72-80 mehr)
  • Operationen mit ganzen Feldern oder Feldbereichen und nicht mehr nur mit einzelnen Elementen
  • Verwendung von Modulen mitsamt Zugriffsrechten auf einzelne Bereiche
  • Verbesserte Parameterübergabe
  • Abgeleitete und abstrakte Datentypen
  • Dynamische Speicherallokation
  • SELECT CASE zur Vermeidung von langwierigen IF THEN ELSE Konstruktionen
  • und vieles andere mehr

Obwohl Fortran 90/95 auch heute noch den de facto Standard darstellt, ging und geht die Entwicklung weiter. Fortran 95 ist eine Weiterentwicklung des Fortran 90 Standards, das neben der Beseitigung von offenen Fragen des 90er Standards vor allem Konstrukte zur Unterstützung des Programmierens auf Parallelrechnern von HPF (High Performance Fortran) übernahm.

Der nächste Standard 2003 war wieder ein großer Schritt vorwärts, als hier erstmals objekt-orientiertes Programmieren mit Fortran unterstützt wurde, was die Verwendung von objekt-orientierten Paradigmen wie Vererbung oder Polymorphismus ermöglicht. Dieser Standard wird bereits größtenteils von den zurzeit verfügbaren Compilern unterstützt. Wie sehr die Neuerungen dieses Standards bereits in vorhandenen Programmen  umgesetzt werden, wäre sicherlich eine genauere Untersuchung wert. Allerdings wage ich zu bezweifeln, dass vorhandene große Pakete, die über Jahre hinweg entwickelt wurden und im Wesentlichen bei Fortran 90/95 angelangt sind, schnell um objektorientierte Möglichkeiten erweitert werden. Allerdings wäre dann Fortran 2003 oder der 2010 akzeptierte Standard 2008 eine reizvolle Alternative zu C++, da durch die vorhandenen schnellen numerischen Bibliotheken ein Laufzeitvorteil lukrierbar sein sollte.

Dies führt gleich zu weiteren Gründen für das Überleben von Fortran über beinahe 60 Jahre: die Compiler und vorhandenen Programmbibliotheken. Wie bereits oben erwähnt, war selbst der erste Fortran Compiler ein gut optimierender Compiler und diese Tradition wurde fortgesetzt. Im Prinzip lag die Stärke der Fortran Compiler immer in der guten Abstimmung der Optimierungsmöglichkeiten des Compilers mit den Möglichkeiten der eingesetzten Hardware, was bedingt, dass Hardwarehersteller auch ein Team zur Compilerentwicklung hatten bzw. haben oder eng mit einer externen Compilerschmiede kooperieren. Deshalb hatte IBM immer einen eigenen Compiler, der hervorragend auf die jeweilige Architektur, sei es 390 Mainframe oder Power Architektur der Workstations oder Parallel Rechner, abgestimmt war und ist. Ähnliches galt für DEC, deren Fortran sowohl für die VAX Rechner als auch für die Alpha RISC Prozessoren fast so etwas wie ein Goldstandard war. Bezeichnend für die Wichtigkeit von guten Compilern für Hardwarehersteller war auch, dass Intel nach der Verschmelzung von DEC mit COMPAQ (später HP) das DEC Fortran Compiler Team übernahm und damit die Grundlage für den de facto Standard für x86 CPUs, den Intel Fortran Compiler, schuf, der imstande ist, die Möglichkeiten der Intel CPUs auszureizen, was unglücklicherweise für AMD’s x86 CPUs in der Vergangenheit nur in eingeschränktem Maße zutraf. In den letzten Versionen des Intel Fortran Compilers sollte dieses Manko jedoch beseitigt sein. Dies zeigt auch ein Laufzeitvergleich von 16 Fortran Programmen mit typischen numerischen Aufgaben, die mit heute verfügbaren x86 Compilern übersetzt wurden (siehe www.polyhedron.com/compare.html). Ein großer Pluspunkt des Intel Compilers ist aber sein relativ niedriger Preis für Universitäten und nicht-kommerzielle Anwender. Ein dritter großer Hersteller, SUN, stellt seinen SUN Studio Fortran Compiler auch nach der Übernahme durch Oracle kostenlos zur Verfügung. Ebenso kostenlos sind die Compiler der GNU Compiler Suite g77 und gfortran, die auf dem GNU gcc Compiler Backend aufbauen und mit gfortran den 2003 und 2008 Standard teilweise unterstützen. Eine sehr schöne Übersicht über alle verfügbaren Compiler ist z. B. auf www.fortranplus.co.uk/fortran_info.html zu finden.

Ebenso wichtig sind aber auch gute Bibliotheken für mathematische Funktionen oder Operationen, wie z. B. algebraische Matrixoperationen oder effiziente Fast-Fourier Transformationen. Solche werden z. B. von IBM in der ESSL Bibliothek oder von Intel in der MKL-Bibliothek auf die CPU Architektur optimiert zur Verfügung gestellt. AMD bietet mit der ACML (http://developer.amd.com/cpu/Libraries/acml/pages/default.aspx) ebenfalls eine hoch optimierte numerische Bibliothek für eine Reihe von Fortran Compilern zum Herunterladen an. Eine Fülle von hochqualitativen alternativen numerischen Bibliotheken wie LAPACK oder SCALAPACK können auf Netlib (www.netlib.org) gefunden werden, wobei die letzteren in ESSL und MKL aber auch in der ACML integriert sind.

All diese Möglichkeiten bezüglich Compiler und effizienter Bibliotheken zusammen mit den für die Lösung von numerischen Problemen besonders gut geeigneten Eigenschaften des Fortran Standards haben ein Umfeld geschaffen, das Fortran heute und auch in absehbarer Zukunft als Sprache der Wahl zur Lösung von naturwissenschaftlichen Problemen erscheinen lässt. Nicht vergessen sollte man natürlich auch die große Menge von öffentlich verfügbarem hochqualitativen Fortran Code, der sich über die letzten 60 Jahre angesammelt hat, und die Tatsache, dass gerade numerische Codes nicht einfach auf andere Sprachen zu portieren sind, was üblicherweise dazu führt, dass große Teile neu geschrieben werden müssen, was bei einer notorischen Nichtverfügbarkeit von freien Programmierern in wissenschaftlichen Umgebungen auf natürlichen Widerstand stößt, abgesehen natürlich von der Aversion der Wissenschaftler, eine ihrer Meinung nach unnotwendige neue Sprache zu lernen, wie eingangs bereits erwähnt wurde.

Für diesen Artikel wurde neben den angeführten Zitaten sowohl von einschlägigen Wikipedia-Artikeln und darin angeführten Referenzen als auch von Posts auf comp.lang.fortran Gebrauch gemacht.