Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
ComputergrundlagenProgrammieren – Fortran77/90
Maria Fyta
Institut für ComputerphysikUniversität Stuttgart
Wintersemester 2012/13
Was sind Programme?I In dieser Vorlesung: Python, C, Fortran, LATEX, bashI Sind das alle Typen von Programmiersprachen?
Wie kann man Programmiersprachen klassifizieren?
I Kein Prozessor versteht Python-, C-, Fortran- oderShell-Befehle
I Was muss alles passieren, um ein Programm laufen zu lassen?
Wie wird aus unserem Programm etwas, dass derProzessor ausführen kann?
Was soll das Program leisten?Zum Beispiel
I eine Liste sortierenI Echtzeitanalyse von MesswertenI Computersimulation eines Moleküls
Top-down AnalyseI schrittweises Zerlegen in TeilproblemeI gibt Einsicht in die KomplexitätI Welche Teile gibt es schon? Bibliotheken, ...
Wer kann mir helfen?I Wer hat Erfahrung mit ähnlichen Problemen?
AufwandsabschätzungI Lohnt sich das Programmieren überhaupt?
Methodenwahl
Wahl der Rechenstrukturen/AlgorithmenI aufteilen in möglichst kleine sinnvolle EinheitenI möglichst allgemein formulieren → wiederverwendbarI welche bekannten Algorithmen kann ich benutzen?
Wahl von Datentypen und -strukturenI Ganz-, Fließkommazahlen, Strings, ...I Listen, Tupel, Wörterbücher, KlassenI Datenbanken
Wahl der ProgrammierspracheI Skriptsprachen für Automatisierung und kleine AufgabenI Compilersprachen für sehr rechenaufwändige und oft
wiederkehrende Aufgaben
Implementation
ProgrammierenI modular programmieren: Teilprobleme in getrennten
Funktionen, Modulen, KlassenI Probleme von außen nach innen bearbeiten (Top–Down)I Kommentare nicht für „Reservecode“ missbrauchen
DokumentierenI schon während des ProgrammierensI Kommentare im Code und Anleitung/Hilfe
Testen (Benchmarking)I möglichst einzelne Teile getrennt testenI so früh wie möglichI Tests müssen schnell ausführbar sein
Testen des ProgrammsFunktion des Programms
I generische Fälle prüfen, etwa ZufallszahlenI Extremwerte: leere Eingabe, 0, Grundzustand, ...I Beispiele mit bekannter Lösung (benchmarking)I z.B. harmonischer Oszillator, ideales Gas, ...I bekannte implizite EigenschaftenI z.B. Energieerhaltung, ...
FehlerbehandlungI alle Fehlermeldungen sollten in Tests ausgelöst werdenI Verhalten bei nicht erlaubten Eingaben überprüfen
EffizienzI Laufzeit des Programms bei generischer EingabeI Fest- und Hauptspeicherbedarf
Programmiersprachen
Imperative SprachenBeispiele: Python, C, Fortran, Shell, BASIC...
I Die meisten Sprachen sind imperativI Programme erklären, wie ein Problem gelöst werden sollI Umsetzung des von Neumann-Rechners: Befehle und SchleifenI prozedural heißen Sprachen, die Prozeduren kennen
Beispiele: alle außer einfachem BASIC
Deklarative SprachenI Keine von Neumann-artigen Befehle, kein innerer ZustandI Rekursion anstatt SchleifenI funktional, basierend auf Funktion im mathematischen Sinn
Beispiele: Haskell, Erlang, Scheme...I logisch, basierend auf Fakten, Axiomen und logischer Ableitung
Beispiele: Prolog
Objektorientierte Sprachen
Dozent
-vorlesungen: Liste von Vorlesungen+halteVorlesung(vorlesung:Vorlesung)
+haltePrüfung(vorlesung:Vorlesung): Note
+getTitel(): String
Person
+name: String+getName(): String
+getTitel(): String
Student
+kurs: Kurs
+vorlesungen: Liste von Vorlesungen+hoertVorlesung(vorlesung:Vorlesung)
+machePrüfung(vorlesung:Vorlesung)
+getTitel(): String
I Objektorientierung ist ein sprachunabhängigesProgrammiermodell
I Ziel ist die bessere Wartbarkeit und Austauschbarkeit vonSoftware durch starke Isolation von Teilproblemen
I Speziell darauf ausgelegt sind z.B. C++, Java, Python,...
TerminologieI Klasse: beschreibt Eigenschaften und Methoden von Objekten
Beispiel: Klassen sind z.B. Dozent, Student, PersonI Objekt: eine Instanz einer Klasse. Ein Objekt hat stets eine
Klasse, aber es kann viele Instanzen gebenBeispiel: Axel Arnold ist ein Dozent, Maria Fyta auch
I Eigenschaften: Datenelemente von ObjektenBeispiel: Dozent hat Name, Titel und zu haltende Vorlesungen
I Methoden: Funktionen einer KlasseBeispiel: Personen können ihren Namen sagen
I Datenkapselung: Eigenschaften werden nur durch Funktionender Klasse verändertBeispiel: der Name einer Person kann nicht geändert werden
I Vererbung: Klassen können von anderen abgeleitet werden,erben dadurch deren Eigenschaften und FunktionenBeispiel: Jede Person hat einen Namen
Interpreter- und CompilersprachenPython-Skript
Python-Interpreter
Ausgabe
interpretiert
produziert
Ausgabe
Binärprogramm
C-Compiler+Linker
C-Quellcode
übersetzt
erzeugt
produziert
InterpretersprachenI Z.B. Python, Java, C#, Basic, PHP, ShellsprachenI Das Programm wird vom Interpreter gelesen und ausgeführtI Es wird nie in Maschinencode für den Prozessor übersetztI Ausnahme: Just-in-Time (JIT) Compiler
Interpreter- und CompilersprachenPython-Skript
Python-Interpreter
Ausgabe
interpretiert
produziert
Ausgabe
Binärprogramm
C-Compiler+Linker
C-Quellcode
übersetzt
erzeugt
produziert
CompilersprachenI Z.B. C/C++, Fortran, Pascal/DelphiI Compiler übersetzt in maschinenlesbaren CodeI Nicht portabel, erschwerte Fehlersuche, deutlich schnellerI Interpreter selbst müssen compiliert werden
Vom Sourcecode zum Programm
programm.c
Präprozessor
Parser
Zwischencode-Generator
Optimierer
Code-Generator
Assembler
Objekt-Datei
Linker
Binärprogramm
Compiler
I Ein Programm durchläuft viele Schritte bis zur fertigenausführbaren Datei
I Präprozessor, Compiler, Assembler und Linkersind meist separate Programme
I meist mehrere Objektdateien aus verschiedenenQuelltextdateien
Vom Sourcecode zum Programm
programm.c
Präprozessor
Parser
Zwischencode-Generator
Optimierer
Code-Generator
Assembler
Objekt-Datei
Linker
Binärprogramm
Compiler
PräprozessorI Im Prinzip sprachunabhängig, rein textbasiertI Bindet weitere Quelltextdateien einI Erlaubt den Einsatz von Makros (Ersetzungen)
Beispiel: TEST(...) wird überall durch if (...) ersetzt
Der CompilerI Parser übersetzt den Quellcode in einen Syntaxbaum
=
a +
×
int 3 c
×
int 2 b
a = 2 ∗ b + 3 ∗ c
I Zwischencode-Generator erzeugt daraus Pseudocode, etwa:
r1 = b r2 = r1× 2 r3 = c r4 = r3× 3 r5 = r2+ r4 a = r5
I Optimierer versucht, diesen zu verbessern, z.B. durchI ProzessorregisterzuweisungI Einfügen kurzer Funktionen, Entrollen von SchleifenI Suche nach gemeinsamen Termen, ...
I Code-Generator erzeugt Assembler aus dem Zwischencode
Der Assembler
programm.c
Präprozessor
Parser
Zwischencode-Generator
Optimierer
Code-Generator
Assembler
Objekt-Datei
Linker
Binärprogramm
Compiler
obj1.o:... call 0000Defined:Undefined: blupp
obj2.o:...Defined: bluppUndefined:
Der Assembler erzeugt eine Objektdatei mitI MaschinencodeI den Speicherpositionen von globalen Variablen und FunktionenI Stellen, an denen Stellen Information über solche Positionen
aus andere Objektdateien benötigt wird
Der Linker
programm.c
Präprozessor
Parser
Zwischencode-Generator
Optimierer
Code-Generator
Assembler
Objekt-Datei
Linker
Binärprogramm
Compiler
obj1.o:... call 0000Defined:Undefined: blupp
obj2.o:...Defined: bluppUndefined:
I Verbindet mehrere solcher Objektdateien zu einer ausführbarenDatei (Binary) oder einer Bibliothek
I Bibliotheken sind Sammlungen von ObjektdateienI Der Linker verbindet Zugriffe zwischen ObjektdateienI Nur wenn alle Zugriffe aufgelöst wurden, entsteht ein Binary
Dynamisches Linken
programm.c
Präprozessor
Parser
Zwischencode-Generator
Optimierer
Code-Generator
Assembler
Objekt-Datei
Linker
Binärprogramm
Compiler
obj1.o:... call 0000Defined:Undefined: blupp
obj2.o:...Defined: bluppUndefined:
I Beim dynamischen Linken wird das Linken gegen dieBibliotheken erst beim Starten des Programms erledigt.
I Dadurch können Teile des Programms geupdated werdenI Und mehrfach benutzte Bibliotheken werden nur einmal
geladenI Erfordert spezielle dynamische Bibliotheken (.so, .dylib oder
.dll)
Programmiersprache Fortran (77/90)
Literaturempfehlung:Vorlesungsskript von Heidrun Kolinsky zu FORTRAN 90/95:[www.rz.uni-bayreuth.delehrefortran90vorlesungindex.html]G. Schmitt (1996): Fortran–90–Kurs technisch orientiert, R. OldenbourgVerlag, MünchenW. Brainerd, C. Goldberg and J. Adams (1996): Programme’s Guide toFortran 90, Springer–Verlag M. Kallweit & F. Kindermann, ’CrashkursFortran’
Fortran (FORmula TRANslation)
GeschichteI die erste jemals tatsächlich realisierte höhere
Programmiersprache (1953: J.W. Backus – IBM)I Fortran ist eine prozedurale und in ihrer neuesten Version
zusätzlich eine objektorientierte ProgrammierspracheI Fortran wird insbesondere für numerische Berechnungen
eingesetztI mehrmals erweitert (FORTRAN I, FORTRAN II, FORTRAN
IV, FORTRAN-66, FORTRAN-77, Fortran 90, Fortran 95,Fortran 2000, Fortran 2003, Fortran 2008 und zuletzt Fortran2010)
I zahlreiche Sprachelemente wurden aus später entstandenenProgrammiersprachen übernommen
I verschiedene Varianten; darunter HPF (high performanceFortran)
EigenschaftenI für numerische Berechnungen vorgesehen und optimiert;
umfangreiche BibliothekenI restriktiver als C und kann leichter optimiert werdenI Potenz-Operator ** (in vielen Hochsprachen nicht vorhanden)I Fortran90: Vektor- udn Matrix-Operationen wurden
standardisiertI Compiler unterscheidet nicht zwischen Groß- und
Kleinschreibung (case insensitive")I Ab Fortran90 ist die dynamische Speicherverwaltung standard
CompilerI Kommerzielle: IBM SUN, HP, Intel, Absoft, PGI, NAGI Freie: GNU Fortran, OpenWatcomI Transcompiler(f2c): Übersetcung von Fortran77 in C (NAG
benutzt als Zwischensprache C)I ftnchek Programmierwerkzeug für eine separate Prüfung der
Übereinstimmung von Argumentlisten
NamensyntaxI Keine Schlüsselwörter (z.B. program, integer, real, do, if, else,
...) dürfen verwendet werden.I Ein Name darf in Fortran bis zu 31 Zeichen lang sein und muss
mit einem Buchstaben beginnen.I Für die auf das erste Zeichen folgenden Zeichen dürfen alle
alphanumerischen Zeichen sowie Unterstriche verwendetwerden.
ProgrammstrukturProgrammkopf: program <Programmname>Deklarationsteil: besteht aus einer Reihe von Konstanten- undVariablenvereinbarungen.Anweisungsteil: eine strikte Aneinanderreihung vonauszuführenden Befehlen (kann mit Hilfe von Flussdiagrammenmodelliert werden); Zeilennummern können auf AnweisungenhinweisenProgrammende:end program <Programmname>
Program Beispiele
Hello Worldprogram hellowrite (* ,*) ’Hello World !’end program helloUmrechnungstabelle: Fahrenheit nach Celsiusprogram celsius_tableimplicit nonereal :: Fahrenheit , Celsiuswrite (* ,*) ’ Fahrenheit Celsius ’write (* ,*) ’ ————————–’do Fahrenheit = 30.0 , 220.0 , 10.0Celsius = (5.0/9.0) * ( Fahrenheit -32.0)write (* ,*) Fahrenheit , Celsiusend doend program celsius_table
VariablendeklarationI Variablen: standardmäßig über ihren Anfangsbuchstaben
deklariertBezeichner die mit einem Charakter von i-n beginnen stehenfür eine INTEGER-Variable oder einenINTEGER-Funktionswertalle übrigen Bezeichner stehen für REAL-Werte
I Änderung der Vordefinition von Variablen:implicit <Variablentyp> <Variablenbereich>
I BeispieleI IMPLICIT NONE: keine implizite Deklaration. Durch diesen
Befehl müssen alle benutzten Variablen explizit definiertwerden
I IMPLIZIT CHARACTER(LEN=20) (H-I,L-N): allenichtdeklarierte Bezeichnet, deren erster Buchstabe H-I oderL-N ist, bezeichnet ein Zeichen
I IMPLICIT COMPLEX (x,c,z) : alle nichtdeklariertenBezeichner, deren erster Buchstabe x oder c oder z ist,bezeichnen komplexe Zahlen
I IMPLIZIT REAL*8 (A-F): alle nichtdeklarierten Bezeichner,deren erster Buchstabe A-F ist, bezeichnen reelle Zahlen
DeklarationenVariablentypen und-wertebereicheDatentyp Erweiter. Erläuterung Wertebereichlogicalinteger ganze Zahlen (-27+1) - (27+1)
ganze Zahlen (-215+1) - (215+1)(Standard) ganze Zahlen (-231+1) - (231+1)
real *4 (Standard) reelle Zahlen -1038.53-1038.53
*8 reelle Zahlen -10308.25-10308.25
character (Standard) einzelnes Zeichen alle möglichen Zeichen(LEN=x) Zeichenkette Länge x alle möglichen Zeichen
Quelle: M. Kallweit & F. Kindermann, ’Crashkurs Fortran’, Uni. Würzburg
Variablenvereinbarung:<Variablentyp> :: <Variable>
Konstantenvereinbarung:parameter (<Variable>=<Variablenwert>,...)
Eingabe/AusgabeOpen/Close
open (unit,file,status,action,iostat)
I unit=<unitnumber>: eine nichtnegative integer-ZahlI file=<Dateiname>: Dateiname in Form einer Zeichenkette
mit den entsprechenden Anführungs und SchlusszeichenI status=<Schlüsselwort>: Zustand der Datei.
Optionen:’old’, ’new’, ’unknown’,’replace’,’scratch’I action=<Aktionsangabe>: was mit der Datei geschehen
soll. Optionen: ’read’, ’write’ ’readwrite’I iostat=<Name einer Variablen vom Datentypinteger>) : wie erfolgreich das Betriebssystem, eineVerknüpfung zwischen der unit number und derangegebenenen Datei auf der Festplatte herstellen konnte(reibungslos → Rückgabewert=0)
Eingabe/Ausgabe
Open/Close
close (unit=<unit number> oder close <unit number>
Delete option:close (unit=<unit number>,status=’delete’
I Standard input: 5 und 100I Standard output: 6 und 101I Standard error: 0 und 102
Read/write/close
I read(unit,file,error,iostat,slist)I write(unit,format,iostat)I close(unit)
slist:iostat, status, err, form, blank,...
Falls keine ’unit’ für read gegeben, erzeugt z.B. write(20,*) einefort20.dat Datei.
I Option endBeispiel: read(10,*,end=100) → read am Ende derDatei wird die Anweisung mit Zeilennummer 100 in derQuelldatei durchgeführt (z.B. 100 print*,’end of file’).
Printprint*, ’Text’, Variable[Ausgabe nur auf dem Bildschirm.]
Lesen und schreibenread(*,*)<Variable> Liest den vom Benutzer einzugebenden Wert
der <Variable> von der Konsole einwrite(*,*)<Variable> Schreibt den Wert der <Variable>
unformatiert auf die Konsolewrite(*,*)’<Text>’ Schreibt den eingegebenen
<Text> auf die Konsolewrite(*,’(f6.3)’)<Variable> Schreibt den Wert der <Variable>
im Format f6.3 auf die Konsole
Formatierungsbefehle
i4 : Integerzahl mit maximal 4 Stellena7 : Character mit maximal 7 Stellen
f6.3 : Realzahl mit insgesamt 6 Stellen (inkl. Trennzeichen) und 3Nachkommastellen
3x : 3 Leerzeichen
WertzuweisungenBefehl:<Variable>=<Variablenwert>Der <Variablenwert> muss nicht unbedingt eine festeZahl/Zeichenkette sein. Er kann sich genauso aus der Verknüpfungmeherer anderer Variablen zusammensetzen.Beispiele:
x=3x=y*exp(z)x=y+z+abs(c)a=b+sqrt(c)a=max(b,c)d=mod(3,2)*sign(-1)...
Kontrollstrukturen
Schleifen
do-Schleifen realisieren die Wiederholung von AnweisungenI Befehl:do <Laufindex>=<von>,<bis>(,<Schrittweite>)<Anweisungsblock>enddoStandardmässig ist als Schrittweite 1 eingestellt.
I Beispiel:do i=2,5write(*,*) i,i**i,log(i)enddo
Kontrollstrukturen
Verzweigungen
Sollen Anweisungen nur unter einer Bestimmten Bedingungausgeführt werden, so können diese Anweisungen in einif-Statement geschrieben werden.
I Befehl1:if(<Bedingung1>)then(elseif(<Bedingung2>)then )else <Anweisungsblock3>)endif
I Befehl2:alternativ: if(<Bedingung>)<Anweisung>
Verzweigung - Beispiele
I if(i.ge.0)thenparam=1elseparam=2endifWenn i größer als 0 ist, dann nimmt param1 die Zahl 1
I j=1; sum=0dosumme=summe+j ; j=j+1if(j.gt.i)exitenddo
Unterprogramme[Unterprogramme müssen deklariert werden]
SUBROUTINEI Programmabschnitte können definiert werden, die in einem
Programm mehrmals in gleicher Form verwendet werdenkönnen.
I Programmabschnitte können definiert werden, die in einemProgramm mehrmals in gleicher Form verwendet werdenkönnen
I die Übergabe von Variablen ist möglichI besitzt jedoch keinen Rückgabewert
FUNCTIONI dient zur Berechnung eines WertesI an eine Funktion können mehrere Werte übergegeben werden,
die zur Bestimmung des Funktionswerts benötigt werden.I alle eingegebene Variablen müssen deklariert werden
Unterprogramme - Befehle
SUBROUTINEI subroutine<Subroutinenname>((<Variable1>,...))<Variablendeklaration><Programmabschnitt>end subroutine <Subroutinenname>
FUNCTIONI <Variablentyp> function<Funktionsname>((<Variable1>,...))<Variablendeklaration><Werteberechnung>end function <Funktionsname>
SUBROUTINE: Beispielsubroutine sum1(a,b)integer a,bb=b+aprint*,a,bend subroutine sum1
FUNCTION: Beispielinteger function sum1(a,b)integer :: a,bsum1=a+bend function sum1
Aufruf von SUBROUTINE und FUNCTION!sum.f90!Performs summations and saves input and summation in a fileprogram summationimplicit noneinteger :: sum, a, sum1print*, ’This program performs summations. Enter 0 to stop.’open(unit=10, file=”sum.dat")sum = 0doprint*, "Value:"read*, aif (a == 0) thenexitelsecall sum1(a,sum) !<== subroutine callsum=sum1(sum,a) ! <== function callend ifwrite(10,*) aend doprint*, ”Sum =", sumwrite(10,*) ”Sum =", sumclose(10)end program summation
Sonstige AnweisungenI call system ((<Variable1>,...)) : durchführt
einen Befehl des BetriebsystemsI COMMON block (Fortran77), Module(Fortran90): Informationen zwischen einzelnenProgrammeinheiten (Hauptprogramm und Unterprogrammen)teilen und austauschen
I Beispiel: πmodule kreiszahlimplicit nonesavereal , parameter :: pi = 3.141593end module kreiszahlsubroutine kreisumfang (r,u)use kreiszahlusw...
Sonstige AnweisungenI Do while: Anweisungsblock ausgeführt wenn logischer
Ausdruck den Wert .true. aufweist ; dann erneut geprüftdo while (< logischer Ausdruck >)Anweisungsblockend doprogram do_whileimplicit noneinteger :: i = 1, n = 1do while (write (* ,*) i, n n = n + ii = i + 1end doend program do_while
I Go to (Fortran77), cycle (Fortran90)realisiert bedingungsabhängige Sprünge innerhalb desAnweisungsteils einer Programmeinheit
Sonstige AnweisungenI ALLOCATABLE/ALLOCATE/DEALLOCATE: dynamische
Speicherzuweisung
MODULE data_arrayINTEGER nREAL, DIMENSION(:,:,:), ALLOCATABLE :: dataEND MODULEPROGRAM mainUSE data_arrayREAD (input, *) nALLOCATE(data(n, 2*n, 3*n), STAT=status):DEALLOCATE (data)
I ...und vieles mehr...
Frohe Weinachtenund
einen guten Rutsch!!!