Modernes Fortran by hbf25307

VIEWS: 37 PAGES: 41

									                   Modernes Fortran




         Modernes Fortran




                                 Universität Ulm
Dr. Volker Typke   26.9.2003     Kommunikations- und Informationszentrum
                                Motivation



Fortran steht in dem Ruf,
- eine veraltete Sprache zu sein,
- nicht geeignet für moderne Programmiertechniken.

Meine Meinung:
Dieses Vorurteil ist die Folge fundamentaler Unkenntnis
und basiert vermutlich auf Eigenschaften, die Fortran zu
einer Zeit hatte, als die Programmiersprache C noch nicht
existierte!

=> Vorstellung neuer Eigenschaften und Sprachmittel


                                         Universität Ulm
Dr. Volker Typke    26.9.2003            Kommunikations- und Informationszentrum
                                     Inhalt


            - Entwicklung von Fortran
            - Programmiersprache F
            - Vergrößerte Standardbibliothek
            - Neue Anweisungen
            - Typvereinbarungen und Attribute
            - Anfangswerte
            - Module
            - Wertzuweisungen
            - Operatoren für eigene Datentypen
            - Überladen von Operatoren
            - Überladen der Wertzuweisung
            - Generische Unterprogramme
            - Rekursive Funktionen und Subroutinen
            - Optionale Parameter in Unterprogrammen
            - Objektorientiertes Programmieren
            - Portierung f77 -> f95
            - Ausblick
                                              Universität Ulm
Dr. Volker Typke         26.9.2003            Kommunikations- und Informationszentrum
                             Historie von Fortran

Im Prinzip soll jede Programmiersprache, die international
genormt ist, alle 5 Jahre überprüft werden: bei Fortran hat
es immer "etwas länger" gedauert:

        Fortran II
        Fortran IV (f66)             1966
        Fortran 77 (f77)             1978
        Fortran 90 (f90)             1991 (sollte f88 werden)
        Fortran 95 (f95)             1997
        Fortran 2000 (f2k)           2003 ???

Aktuelles Fortran ist f95: ISO/IEC 1539-1
Nach Verabschiedung eines Standards dauert es noch einige
Zeit, bis der neue Standard auf allen Plattformen verfügbar
ist.
                                            Universität Ulm
  Dr. Volker Typke      26.9.2003           Kommunikations- und Informationszentrum
                      Sprach-Aktualisierungen


Bei allen Revisionen eines Standards wird unterschieden
zwischen Sprachelementen, die

        - unverändert bleiben
        - erweiterte Bedeutung erhalten
        - aus dem Sprachumfang gestrichen werden
        - bei künftigen Revisionen wegfallen werden
        - neu hinzugefügt werden

In diesem Beitrag beschränke ich mich auf Sprachelemente,
die gegenüber f77 neu hinzugekommen sind, bzw. auf
die Folgen, die sich einstellen, wenn bestimmte Eigen-
schaften gestrichen werden, die aus Kompatibilitätsgründen
weiterhin im Sprachumfang enthalten sind.
                                       Universität Ulm
Dr. Volker Typke      26.9.2003        Kommunikations- und Informationszentrum
                       Programmiersprache F (1)


 Modernes Fortran                   =            Fortran95

 Eine Untermenge von Fortran95 stellt die Programmier-
 sprache F dar: korrekte F-Programme sind stets auch
 korrekte f95-Programme.

 Den F-Compiler kann man sich für den akademischen
 Bereich kostenfrei herunterladen zur Benutzung auf
 einem PC unter dem Betriebssystem Linux von der
 Adresse

           ftp://ftp.swcp.com/pub/walt/F


                                           Universität Ulm
Dr. Volker Typke        26.9.2003          Kommunikations- und Informationszentrum
                       Programmiersprache F (2)



  Die Programmiersprache F besteht sozusagen aus dem
  "modernen" Teil von f95: sie entsteht aus f95, wenn folgende
  Sprachelemente gestrichen werden:

  - numerische Anweisungsmarken
  - alternativer Rücksprung aus Unterprogrammen
  - gemeinsamer Abschluß bei geschachtelten DO-Schleifen
  - Anweisungen zur Speicherbelegung: COMMON, EQUIVALENCE,
    ENTRY, SEQUENCE, NAMELIST
  - äquivalente und redundante Sprachmittel: INCLUDE, DATA,
    BLOCKDATA, interne Unterprogramme
  - zukünftig wegfallende Anweisungen: Formelfunktion, logische
    IF-Anweisung, reelle Parameter in DO-Anweisungen,
    "Lochkarten"-Format für Quelltext
  - SAVE und I/O in Funktionen (Funktionen sind "pure")

                                            Universität Ulm
Dr. Volker Typke        26.9.2003           Kommunikations- und Informationszentrum
                               Standardbibliothek


   Ein wesentliches Kennzeichen für f90/f95 ist die gegenüber
   f77 wesentlich erweiterte Standardbibliothek. Typisch ist,
   daß nicht nur Funktionen (FUNCTION) hinzugefügt wurden,
   sondern auch Subroutinen (SUBROUTINE). Beispiele für neue
   Funktionen sind:

             matmul, dot_product, epsilon, allocated, ...

   für Subroutinen:

             cpu_time, date_and_time, system_clock, ...

   Man kann davon ausgehen, daß die Routinen der Standard-
   bibliothek vom Hersteller auf die jeweilige Architektur opti-
   miert wurden; die Benutzung der Routinen aus der Standard-
   bibliothek ist daher dringend zu empfehlen.

                                                Universität Ulm
Dr. Volker Typke           26.9.2003            Kommunikations- und Informationszentrum
                         Neue Sprachelemente


 Prinzipiell neu ist die Eigenschaft, daß der Rückgabewert
 einer FUNCTION ein Feld sein darf (in f77 war nur ein Skalar
 möglich; Felder mußten aus einer SUBROUTINE übergeben
 werden).

 Es gibt eine größere Anzahl neuer Anweisungen: ALLOCATE,
 CASE, CONTAINS, CYCLE, DEALLOCATE, DO ohne Laufvariable,
 END DO, END IF, END SELECT, EXIT, FORALL,
 INTERFACE, INTERFACE ASSIGNMENT, INTERFACE OPERATOR,
 MODULE, MODULE PROCEDURE, NULLIFY, PRIVATE, PUBLIC,
 SELECT, TYPE, USE, WHILE, WHERE

 Außerdem wird die Typvereinbarung durch eine Anzahl von
 Attributen erweitert: ALLOCATABLE, DIMENSION, INTENT,
 OPTIONAL, PARAMETER, PRIVATE, PUBLIC, POINTER, SAVE,
 TARGET

                                            Universität Ulm
Dr. Volker Typke        26.9.2003           Kommunikations- und Informationszentrum
                              Typvereinbarungen

Zur Vereinbarung von Datenobjekten stehen die üblichen
Datentypen von Fortran zur Verfügung:
INTEGER, REAL, DOUBLE PRECISION, COMPLEX, LOGICAL,
CHARACTER

Diese Grundtypen werden durch die o.a. Attribute ergänzt.
Die Struktur der Typvereinbarung sieht dann folgendermaßen
aus:

typ[(kind=konstante[,len=länge])][, attribute] :: variablenname
                                           [=vorbesetzung]

Beispiele:

          integer, parameter :: atome=20
          real, dimension(-10:10) :: name1,name2
          real(kind=double), dimension(:,:), allocatable :: name3
          character(len=80) :: zeile
                                                Universität Ulm
Dr. Volker Typke           26.9.2003            Kommunikations- und Informationszentrum
                                Typ(kind=...)


Wenn man die Schreibweise typ(kind=konstante) wählt, dann
hat man die Möglichkeit, Mindestanforderungen für den
Zahlenbereich und die Rechengenauigkeit zu stellen.
Die benötigte konstante muss vorher definiert werden; dazu
stehen zwei Standardfunktionen zur Verfügung:

      SELECTED_INT_KIND, SELECTED_REAL_KIND

Für Integer-Zahlen benutzt man SELECTED_INT_KIND, z.B.

         integer, parameter :: kurz=selected_int_kind(5)

Die Konstante kurz bezeichnet Integer-Zahlen im Zahlenbe-
reich von -105 bis +105.
                                           Universität Ulm
 Dr. Volker Typke       26.9.2003          Kommunikations- und Informationszentrum
                             Typ(kind=...) (2)



Für Real-Zahlen benutzt man SELECTED_REAL_KIND, z.B.

   integer, parameter :: double=selected_real_kind(14,200)

Die Konstante double bezeichnet Real-Zahlen mit einer Mantis-
senlänge von mindestens 14 Stellen im Zahlenbereich von
mindestens 10-n bis 10+n mit 2n=200.

Falls es auf einem Rechner mehrere Möglichkeiten gibt, die
Anforderungen zu erfüllen, dann wird der kleinste Wert ausge-
wählt. Falls die Anforderungen nicht erfüllt werden können,
dann ist das Ergebnis der Funktionsaufrufe negativ.

                                          Universität Ulm
  Dr. Volker Typke     26.9.2003          Kommunikations- und Informationszentrum
                          Attribut ALLOCATABLE

Das Attribut ALLOCATABLE erlaubt es, die Größe von Feldern
erst zur Laufzeit festzulegen, je nachdem, wie groß das gerade
behandelte Problem ist. In der Typvereinbarung muss nur an-
gegeben werden, wieviele Indizes das betreffende Feld haben
muss:

   real(kind=double), dimension(:,:), allocatable :: koordinaten

Zur Laufzeit kann man dann die Problemgröße, z.B. die Anzahl
der Atome, einlesen und dann mit der Anweisung allocate die
tatsächlich benötigte Feldgröße festlegen:

          read(unit=5,fmt=*) atome
          ........
          allocate(koordinaten(1:atome,1:3))
          ........
          deallocate(koordinaten)

                                               Universität Ulm
Dr. Volker Typke          26.9.2003            Kommunikations- und Informationszentrum
                   Attribute SAVE, INTENT, OPTIONAL


 Diese Attribute können nur in Unterprogrammen vorkommen !

 SAVE: Normalerweise ist beim Aufruf von Unterprogrammen
       nicht garantiert, dass Variable bei erneutem Aufruf noch
       die Werte besitzen, die sie beim vorherigen Verlassen
       des UPs hatten. Das Attribut SAVE sorgt dafür, dass
       entsprechend gekennzeichnete Variable ihre Werte
       behalten.
 INTENT: Das Attribut legt fest, ob ein formaler Parameter nur
       ein Eingabeparameter (IN), nur ein Rückgabeparameter
       (OUT) oder ein Ein- und Rückgabeparameter (INOUT) ist.
 OPTIONAL: Abhängig vom Vorhandensein eines als optional
       vereinbarten formalen Parameters können im Unterpro-
       gramm zusätzliche oder andere Ausführungswege ein-
       geschlagen werden.
       => erfordert zusätzliche Programmierung mit PRESENT
       und INTERFACE.
                                          Universität Ulm
Dr. Volker Typke        26.9.2003         Kommunikations- und Informationszentrum
                       Attribute POINTER, TARGET


    Auch Fortran enthält seit f90/f95 die Möglichkeit, mit Pointern
    zu arbeiten, z.B. um verkettete Listen oder Baumstrukturen
    aufzubauen. Zusätzlich kann mit diesen Attributen das erreicht
    werden, was in f77 die EQUIVALENCE-Anweisung bewirkte.
    Ein Objekt kann nur eines der beiden Attribute (POINTER oder
    TARGET) besitzen.
    Das Attribut TARGET ist für ein Objekt notwendig, wenn ein
    Pointer auf dieses Objekt zeigen soll.

    Beispiel:
            real, pointer :: v1,v2,v3
            real, dimension(1:3), target :: v
            ....
            v1 => v(1)
            v2 => v(2)
            v3 => v(3)
            ....
                                                Universität Ulm
Dr. Volker Typke           26.9.2003            Kommunikations- und Informationszentrum
                      Attribute POINTER, TARGET (2)

   Beispiel 2:
   Die Anweisungen von f77

             REAL A(10),B(10),C(10),Z(100)
             EQUIVALENCE (A,Z),(B,Z(25)),(C,Z(91))

   werden in f95 ersetzt durch:

             real, dimension(1:10), pointer :: a,b,c
             real, dimension(1:100), target :: z
             ....
             a => z(1:10)
             b => z(25:34)
             c => z(91:100)
             ....

   Achtung: Die Gestalt (Datentyp, Feldeigenschaften) der Objekte
          auf der rechten und linken Seite muss übereinstimmen.
                                                 Universität Ulm
Dr. Volker Typke            26.9.2003            Kommunikations- und Informationszentrum
                     Attribute PUBLIC, PRIVATE



Die Attribute PUBLIC und PRIVATE können nur in Modulen
(ausserhalb der evtl. im Modul enthaltenen Unterprogramme)
vorkommen und definieren die Sichtbarkeit von Objekten.

PUBLIC: Objekte mit diesem Attribut können in allen Program-
     men, Unterprogrammen und Modulen benutzt werden,
     die dieses Modul über eine USE-Anweisung importieren.

PRIVATE: Objekte mit diesem Attribut sind außerhalb des
     Moduls nicht sichtbar.




                                      Universität Ulm
  Dr. Volker Typke    26.9.2003       Kommunikations- und Informationszentrum
                       Eigene Typ-Definitionen



In Fortran können eigene Typen für Objekte definiert werden
und für diese Objekte eigene Operatoren.

Die Form der Typ-Definition ist:

        TYPE [PRIVATE | PUBLIC] :: typname
             Komponente
             Komponente
             ....
        END TYPE typname

Komponente ist dabei eine der oben genannten Typverein-
barungen mit entsprechenden Attributen.

                                       Universität Ulm
 Dr. Volker Typke      26.9.2003       Kommunikations- und Informationszentrum
                        Eigene Typen: Beispiel (1)


  Beispiel:

  type :: datum
    integer :: tag
    character(len=3) :: monat
    integer :: jahr=2003
  end type datum

  Nach dieser Definition des Datentyps datum lassen sich jetzt
  Objekte definieren, z.B. mit den Anweisungen:

  type(datum) :: geburtstag,urlaub
  type(datum), dimension(1:40) :: Mitarbeiter

  Für alle Objekte ist als jahr der Wert 2003 voreingestellt.


                                                Universität Ulm
Dr. Volker Typke          26.9.2003             Kommunikations- und Informationszentrum
                          Eigene Typen: Beispiel (2)


  In eigenen Typen können auch andere eigene Typen benutzt
  werden:

             type :: versuch
               integer :: nummer
               type(datum) :: zeitpunkt
               real, dimension(1:10) :: messwerte
             end type versuch
             type(versuch) :: messung

  Zugriff auf die Komponenten:

             geburtstag%monat="Aug"
             geburtstag%tag=12
             mitarbeiter(10)%tag=31
             messung%zeitpunkt%tag=12

                                                Universität Ulm
Dr. Volker Typke           26.9.2003            Kommunikations- und Informationszentrum
                                  Anfangswerte

 Wenn die Anweisungen DATA bzw. BLOCKDATA nicht mehr
 benutzt werden (sollen), dann muss die Belegung mit Anfangs-
 werten in der Typvereinbarung erfolgen:

           integer :: n=1
           integer, save :: n=1
           real, dimension(1:3) :: a=(/ 1.0,2.0,3.0 /)

 Für 2- und mehrdimensionale Felder muss die Standardfunktion
 reshape zu Hilfe genommen werden:

           real, dimension(1:2,1:3) :: b=reshape( &
           (/ 1.0,2.0, 3.0,4.0, 5.0,6.0 /),(/ 2,3 ))

 Die Standardfunktion reshape sorgt dafür, dass der lineare Array
 (/ 1.0, .... 6.0 /) umgebaut wird zur Matrix
            ( 1.0 3.0 5.0 )
            ( 2.0 4.0 6.0 )
                                                  Universität Ulm
Dr. Volker Typke           26.9.2003              Kommunikations- und Informationszentrum
                                       Module (1)

  Module sind Konstrukte, die wesentlich neue Programmiermög-
  lichkeiten erschließen. Sie werden zu vielerlei Zwecken einge-
  setzt, insbesondere zu Syntaxprüfungen zur Compile-Zeit, aber
  auch z.B. als Ersatz für die COMMON- und BLOCKDATA-
  Anweisungen, zur Definition von Verknüpfungsoperatoren, zur
  Zusammenfassung von Unterprogrammen und vielem anderen.

  Formaler Aufbau:

            MODULE name
             Typspezifikationen
             Variablendefinitionen
             Sichtbarkeitsdefinitionen
            CONTAINS                          )
             SUBROUTINE subname )
             ....                             ) kann entfallen
             FUNCTION funname                 )
             ....                             )
            END MODULE name
                                                  Universität Ulm
Dr. Volker Typke           26.9.2003              Kommunikations- und Informationszentrum
                                       Module (2)

Fall: Module ohne CONTAINS-Anweisung

Ein solches Modul dient dazu, globale Objekte, also Objekte, die
in einem Hauptprogramm und in Unterprogrammen oder anderen
Modulen benötigt werden, zu definieren und gegebenenfalls mit
Anfangswerten zu belegen. In dieser Form kann ein Modul die
COMMON- und BLOCKDATA-Anweisungen ersetzen. Objekte sind
jedoch nicht nur die Namen von Variablen und Feldern, sondern
auch Konstanten, selbstdefinierte Typen und Verknüpfungsopera-
toren, Namen von Unterprogrammen, usw.
Entscheidender Punkt: in anderen Programmeinheiten (Haupt-
programm, andere Module usw.) sind die Objekte eines Moduls
nur dann verfügbar, wenn ihr Sichtbarkeitsattribut auf PUBLIC
gesetzt wurde und dieses Modul im Vereinbarungsteil der anderen
Programmeinheit durch eine USE-Anweisung importiert wurde.
Alles, was nicht explizit auf PUBLIC gesetzt wird, ist PRIVATE, also
nur innerhalb des Moduls benutzbar, nicht in anderen Programm-
einheiten.
                                                Universität Ulm
 Dr. Volker Typke          26.9.2003            Kommunikations- und Informationszentrum
                                    Module (3)

  Beispiel:

  module vardef
   integer, parameter, public :: double=selected_real_kind(14,200)
   real(kind=double), dimension(:), allocatable, public :: b
  end module vardef

  program teste_modul
   use vardef
   implicit none
   real(kind=double) :: a=1.0_double
   ....
   allocate(b(-10:100))
   b(0)=a
   ....
  end program teste_modul


                                             Universität Ulm
Dr. Volker Typke        26.9.2003            Kommunikations- und Informationszentrum
                             Wertzuweisungen (1)

Zusätzlich zu den Wertzuweisungen, die von f77 bekannt sind,
gibt es einige Neuerungen:

a) Wertzuweisung an Felder:

          real(kind=..), dimension(1:10,-10:10) :: a
          ....
          a=1 ! Jedes Feldelement erhält den Wert 1

b) Feldkonstruktoren: x=(/ werteliste /)

          real, dimension(1:5) :: x
          ....
          x=(/ 1.0,2.0,3.0,4.0,5.0 /)

   Bei mehrdimensionalen Feldern muss die Funktion reshape
   benutzt werden; alle Elemente müssen gleichen Typ und
   gleiche Länge haben.
                                            Universität Ulm
Dr. Volker Typke           26.9.2003        Kommunikations- und Informationszentrum
                                Wertzuweisungen (2)
        c) Eigene Datentypen:

                   type :: datum
                     integer :: tag
                     character(len=3) :: monat
                     integer :: jahr
                   end type datum
                   type(datum) :: geburtstag
                   ....
                   geburtstag=datum(12,"Aug",1940)

        d) Pointer:

                   real, dimension(:,:), pointer :: a
                   real, dimension(1:5,1:10), target :: b
                   ....
                   a => b(1:5,1:10)

                                                   Universität Ulm
Dr. Volker Typke              26.9.2003            Kommunikations- und Informationszentrum
                         Eigene Operatoren


Wenn man eigene Datentypen (Objekte) erzeugt, dann ist es
wichtig, auch Operatoren definieren zu können, die auf solche
Objekte wirken können oder die zwei Objekte A und B
miteinander verknüpfen, z.B. A .Name. B.
Die Definition des Operators .Name. geschieht mit Hilfe der
Anweisungen

          INTERFACE OPERATOR (.Name.)

und

          PUBLIC :: OPERATOR (.Name.)

Ein Modul, in dem ein solcher Operator definiert wird, hat dann
folgendes Aussehen:
                                         Universität Ulm
Dr. Volker Typke      26.9.2003          Kommunikations- und Informationszentrum
                              Eigene Operatoren (2)


               module xyz
               implicit none
               interface operator (.name.)
                 module procedure funcname
               end interface operator (.name.)
               public :: funcname
               public :: operator (.name.)
                   <weitere Vereinbarungen>
               contains
               function funcname(a,b) result(c)
                   <Anweisungen zur Definition der Verknüpfung>
               end function funcname
               end module xyz

                                                  Universität Ulm
Dr. Volker Typke             26.9.2003            Kommunikations- und Informationszentrum
                     Überladen von Operatoren

Diese Technik wird benötigt, wenn durch den selben Operator
Objekte unterschiedlicher Typen bearbeitet werden sollen.

Beispiel:
Im Geburtstag steht statt des Monatskürzels die entsprechende
Ziffer:

=> der Objekttyp ist anders, weil eine Komponente anders ist.
=> Es muss für jeden Fall eine Funktion definiert werden;
alle diese Funktionen werden in der MODULE PROCEDURE -
Anweisung aufgezählt. Die Auswahl der richtigen Funktion
erfolgt automatisch aufgrund der verknüpften Typen.

(generische selbstdefinierte Operatoren)

                                       Universität Ulm
  Dr. Volker Typke     26.9.2003       Kommunikations- und Informationszentrum
                   Überladen vordefinierter Operatoren




Vordefinierte Operatoren sind z.B. + - * / > < >= <= usw.

Auch diese Operatoren können eine zusätzliche Bedeutung
erhalten durch "Überladen".

Achtung: Dabei darf eine vordefinierte Bedeutung nicht ver-
ändert werden !

=> Nur sinnvoll im Zusammenhang mit eigenen Typen.




                                         Universität Ulm
Dr. Volker Typke        26.9.2003        Kommunikations- und Informationszentrum
                     Überladen der Wertzuweisung

In ähnlicher Weise wie das Überladen vordefinierter Opera-
toren kann auch die Wertzuweisung überladen werden.
Achtung: Auch hier darf die vordefinierte Bedeutung für kon-
ventionelle Datentypen nicht verändert werden !
Realisierung über ein Interface:

         INTERFACE ASSIGNMENT (=)
         ....
         END INTERFACE ASSIGNMENT (=)

In diesem Fall muss die MODULE PROCEDURE eine Sub-
routine sein mit 2 Aktualparametern; die Aktualparameter
müssen die folgenden Eigenschaften haben:
1. Parameter: Variable; intent(out)
2. Parameter: Ausdruck; intent(in) oder intent(inout)
                                        Universität Ulm
 Dr. Volker Typke       26.9.2003       Kommunikations- und Informationszentrum
                            Generische Prozeduren

Nach den vorhergehenden Beispielen zum Überladen ist es
nicht schwierig, auch die Methode des Überladens von eigenen
Unterprogrammen, also die Erzeugung generischer Unterpro-
gramme zu verstehen: je nach Attributen der übergebenen
Parameter wird das jeweils zuständige Unterprogramm
automatisch ausgewählt.
        MODULE xyz
        ....
        INTERFACE name
          MODULE PROCEDURE prozedur1,prozedur2,...
        END INTERFACE name
        ....
        CONTAINS
        ....
        FUNCTION prozedur1(...)
        ....
        FUNCTION prozedur2(...)
        ....

                                                 Universität Ulm
 Dr. Volker Typke           26.9.2003            Kommunikations- und Informationszentrum
                          Rekursive Unterprogramme

  In f77 war es nicht erlaubt, dass sich ein Unterprogramm selbst
  aufruft, weder direkt noch indirekt. In f90 sind nun rekursive
  Aufrufe erlaubt.

  Beispiel:
  Für die Fakultäten f(n) = n! der natürlichen Zahlen gilt:

            f(n) = f(n-1)*n und f(0) = 1

  recursive function fakultaet(n) result(fak)
  integer, intent(in) :: n
  integer :: fak
  if(n == 0) then
    fak=1
    return
  else
    fak=fakultaet(n-1)*n
  end if
  end function fakultaet
                                                    Universität Ulm
Dr. Volker Typke             26.9.2003              Kommunikations- und Informationszentrum
                        Optionale Parameter


In f95 ist es möglich, Unterprogramme zu definieren, die mit
einer unterschiedlichen Anzahl von Aktualparametern aufge-
rufen werden können. Hierfür müssen alle Formalparameter,
die evtl. weggelassen werden dürfen, das Attribut OPTIONAL
erhalten.

Falls bei einem aktuellen Aufruf optionale Formalparameter
nicht besetzt wurden, dann dürfen diese Parameter an keiner
Stelle in der aufgerufenen Programmeinheit in irgendeiner
Form benutzt werden !

Ausnahme: mit der Standardfunktion present kann (und muss !)
geprüft werden, ob ein optionaler Formalparameter aktuell be-
setzt wurde.
                                       Universität Ulm
  Dr. Volker Typke    26.9.2003        Kommunikations- und Informationszentrum
                        Optionale Parameter (2)



In F ist es vorgeschrieben, dass alle UPs in einem Modul ent-
halten sein müssen, der durch USE importiert wird. In diesem
Fall müssen (außer der Prüfung mit present) keine weiteren
Maßnahmen ergriffen werden.

Im vollen f95 ist diese Regel nicht gefordert. Damit hier die
Benutzung optionaler Parameter richtig funktioniert, muss ein
Schnittstellenblock definiert werden, der die notwendige Infor-
mation bereitstellt:

         INTERFACE
          Spezifikationsteil des UP
         END INTERFACE

                                        Universität Ulm
 Dr. Volker Typke       26.9.2003       Kommunikations- und Informationszentrum
                   Objektorientiertes Programmieren

 Der bisherige Überblick zeigte, dass der größte Teil
 der Eigenschaften und Techniken, die für objektorien-
 tiertes Programmieren benötigt werden, in Fortran ent-
 halten sind:
 Variable und Funktionen mit Attribut private in Modulen
 realisieren Daten-Kapselung und Information Hiding.
 Es können eigene Datentypen, generische Funktionen,
 Operatoren und Wertzuweisungen für Objekte und damit
 Klassen von Objekten definiert werden.
 Innerhalb von Typdefinitionen können Objekte benutzt
 werden, die in anderen Klassen definiert wurden: dies
 realisiert in großem Umfang die Vererbung. Die Ver-
 erbung von Methoden ist ebenfalls realisierbar, erfordert
 jedoch mehr Programmierung als in anderen
 OO-Sprachen.
                                       Universität Ulm
Dr. Volker Typke       26.9.2003       Kommunikations- und Informationszentrum
                   Objektorientiertes Programmieren (2)



Ein weiteres Konzept der OO-Programmierung ist bekannt
unter dem Namen Laufzeit-Polymorphismus bzw. „Dynamic
Dispatching“: hierbei ist erst zur Laufzeit bekannt, auf
welche Objekte Operationen ausgeführt werden. Dies läßt
sich über Pointer und generische Funktionen ebenfalls in
f95 realisieren.

Insgesamt kann man feststellen, dass viele Konzepte der
OO-Programmierung in Fortran verfügbar sind und zu mehr
Programmiersicherheit und -flexibilität ausgenutzt werden
können. Auch die Wartung „fertiger“ Programme kann
dadurch erleichtert werden.

                                         Universität Ulm
Dr. Volker Typke         26.9.2003       Kommunikations- und Informationszentrum
                        Portierung f77 -> f95


Obwohl die Portierung von älteren f77-Programmen nach
f95 empfehlenswert ist, ist damit doch einiger Arbeitsaufwand
verbunden. Hilfestellung dazu gibt es vor allem durch die
NAG-Tools, die auf den Servern des Rechenzentrums
bereitstehen: Das Kommando option NAGWare stellt eine
Reihe von Tools zur Verfügung, die aufgelistet werden. Mit
dem Kommando nag_tools wird ein GUI geöffnet, in dem man
auf die einzelnen Tools zugreifen kann. Zur Portierung
f77 -> f95 ruft man dann nach Auswahl einer f77-Quelldatei
nacheinander die folgenden Tools auf:
nag_pfort      f77 portability verifier
nag_decs       f77 declaration standardizer
nag_struct f77 restructurer
nag_prest90 f95 precision standardizer
                                       Universität Ulm
 Dr. Volker Typke     26.9.2003        Kommunikations- und Informationszentrum
                    Portierung f77 -> f90 (2)




 Wenn alle Tools fehlerfrei beendet wurden, dann steht
 eine Datei bereit, die die neue f95-Quelle enthält. Die
 ursprüngliche f77-Quelle bleibt erhalten !
 Allerdings ist mit dieser Umwandlung nicht die Umorga-
 nisation in Hauptprogram + Module verbunden, die einen
 großen Teil der zukunftsorientierten Eigenschaften von
 Fortran ausmacht: an dieser Stelle ist Handarbeit
 notwendig.
 (Nach meiner Erfahrung ist dabei insbesondere der F-
 Compiler nützlich.)



                                     Universität Ulm
Dr. Volker Typke    26.9.2003        Kommunikations- und Informationszentrum
                                Ausblick

 Nach gegenwärtigem Stand ist mit der Fertigstellung
 des nächsten Release des Fortran-Standards in diesem
 Jahr nicht mehr zu rechnen, zudem dauert es einige Zeit,
 bis Compiler auf der Basis von f2k verfügbar sind. Aber
 man kann anhand der Erweiterungen, die jetzt schon von
 manchen Herstellern in die Compiler eingebaut werden,
 erkennen, welche neuen Eigenschaften kommen werden.
 Bei SUN gehört dazu:
 - Attribut allocatable in eigenen Datentypen und
   bei Funktionsergebnissen
 - stream I/O
 - Attribut value

 Insgesamt werden die OO-Techniken weiter ausgebaut,
 z.B. Vererbung.
                                           Universität Ulm
Dr. Volker Typke    26.9.2003              Kommunikations- und Informationszentrum
                          Zusammenfassung



Fortran ist auch heute noch die Sprache, die zur Lösung von
Problemen aus dem technisch-wissenschaftlichen Bereich
am besten geeignet ist:

          - stabil
          - effizient
          - modern
          - sehr gut optimierbar
          - reichhaltige Bibliothek von intrinsic Funktionen
          - umfangreiche Bibliotheken von Unterprogrammen
             (NAG, IMSL, Lapack, BLAS)
          - geeignet für Parallelisierung
          - ausführliche Fehlerdiagnostik zur Compile-Zeit
                                        Universität Ulm
Dr. Volker Typke       26.9.2003        Kommunikations- und Informationszentrum

								
To top