Upload
truongkien
View
247
Download
4
Embed Size (px)
Citation preview
Uvod u FORTRAN-90« Numericke metode »
Ivo Batistic
Fizicki odsjek, PMFSveucilište u Zagrebu
predavanja 2005/2006, dopunjeno 2007
Pregled predavanja
Uvod
Primjer FORTRANskog programa
Prevodenje u izvršni program
Fortran-90 i Fortran-77
Prevodenje fortranskog programa
Objektni zapis i izvršni program
Naredbe u FORTRANskom programu
Automatizacija poslova
Uvod
◮ Fortran je prvi tz. programski jezik više razine. Programski jeziciviše razine su: C, C++, Ada, Pascal, Cobol, . . . .(programski jezik niže razine je npr. Assembler ili Assemblylanguage )
◮ Fortran je razvijen 50-tih godina prošlog sto-ljeca u IBM-u.Ocem Fortrana smatra se John Backus .(http://www-history.mcs.st-andrews.ac.uk/Biographies/Backus.html)
◮ Fortran postaje komercijalno dostupan 1957. godine.(2007. je pedesetogodišnjica Fortrana.)
◮ Fortran je skracenica od The IBM Mathematical FormulaTranslating System.
Razvoj Fortrana
◮ Fortran kao jezik za programiranje definiran je nizom pravila kojase vremenom nadograduju. Nadogradnja je motiviranaprilagodavanju Fortrana suvremenim konceptima u programiranju(objektno programiranje) kao i olakšavanju uporabe Fortrana urazvijanju aplikacija.
◮ Postoji medunarodno tijelo (povjerenstvo) koje se donosi odluke ipreporuke o nadogradnji Fortrana(http://www.nag.co.uk/sc22wg5/).
◮ Razvoj Fortrana može se podjeliti u nekoliko stadija:
◮ FORTRAN (1957)◮ FORTRAN II (1958)◮ FORTRAN IV (1961)◮ FORTRAN 66 (1966)
◮ FORTRAN 77 (1977)◮ Fortran 90 (1992)◮ Fortran 95◮ Fortran 2003◮ Fortran 2008
Razvoj Fortrana
◮ Radi se na razvijanju Fortrana 2008 koji ce vjerojatno ukljucivatidodatne pravila za razvoj programa na višeprocesorskimracunalima i grozdovima.
◮ Nezavisno od medunarodnih pravila, svaka tvrtka koja razvijaFortranski prevoditelj ima neka svoja dodatna proširenja jezika,ali i neke nedostatke u poštovanju i primjeni dogovorenih pravila.Tu je obicno rijec o nekim svojstvima koja se cesto ne koriste.(Treba uvijek nastojati razvijati program prema dogovorenim iprihvacenim standardima, a ne koristiti svojstva specificna zaFortran neke tvrtke.)
◮ Šala: Kako ce izgledati programski jezik za razvoj znanstvenihaplikacija u buducnosti?
Razvoj Fortrana
◮ Radi se na razvijanju Fortrana 2008 koji ce vjerojatno ukljucivatidodatne pravila za razvoj programa na višeprocesorskimracunalima i grozdovima.
◮ Nezavisno od medunarodnih pravila, svaka tvrtka koja razvijaFortranski prevoditelj ima neka svoja dodatna proširenja jezika,ali i neke nedostatke u poštovanju i primjeni dogovorenih pravila.Tu je obicno rijec o nekim svojstvima koja se cesto ne koriste.(Treba uvijek nastojati razvijati program prema dogovorenim iprihvacenim standardima, a ne koristiti svojstva specificna zaFortran neke tvrtke.)
◮ Šala: Kako ce izgledati programski jezik za razvoj znanstvenihaplikacija u buducnosti?
Razvoj Fortrana
◮ Radi se na razvijanju Fortrana 2008 koji ce vjerojatno ukljucivatidodatne pravila za razvoj programa na višeprocesorskimracunalima i grozdovima.
◮ Nezavisno od medunarodnih pravila, svaka tvrtka koja razvijaFortranski prevoditelj ima neka svoja dodatna proširenja jezika,ali i neke nedostatke u poštovanju i primjeni dogovorenih pravila.Tu je obicno rijec o nekim svojstvima koja se cesto ne koriste.(Treba uvijek nastojati razvijati program prema dogovorenim iprihvacenim standardima, a ne koristiti svojstva specificna zaFortran neke tvrtke.)
◮ Šala: Kako ce izgledati programski jezik za razvoj znanstvenihaplikacija u buducnosti?To nitko ne zna, ali ce se sigurno zvati Fortran!
Jednostavni FORTRANski program
! komentarProgram hello
print *,’Pozdrav svijetu’end program
Naredbe u FORTRANu: program, end, printTo su rezervirane rijeci koje se ne smiju koristiti zaimena varijabli, funkcija, procedura, programa itd.
Naredbe pocinju i završavaju u jednom redu.
Komentar pocinje s usklicnikom !
String je omeden s jednostrukim navodnim znakom (’)
Jednostavni FORTRANski program
! komentarProgram hello
print *,’Pozdrav svijetu’end program
Naredbe u FORTRANu: program, end, printTo su rezervirane rijeci koje se ne smiju koristiti zaimena varijabli, funkcija, procedura, programa itd.
Naredbe pocinju i završavaju u jednom redu.
Komentar pocinje s usklicnikom !
String je omeden s jednostrukim navodnim znakom (’)
Usporedba s C-programom
/* komentar */#include <stdio.h>main(){
printf("Pozdrav svijetu!\n");}
Naredba za ispis: printf
String je omeden s dvostrukim navodnim znakom (").
Naredbe Naredbe mogu ici preko više linija a završavaju stocka-zarezom (;).
Komentar pocinje s /* a završava s */.
Što raditi s FORTRANskim programom ?
◮ Spremiti program u datoteku koja završava s ’.f90’, npr. datotekus imenom hello.f90.
◮ Kompajlirati program iliprevesti program napisan u fortanskom jeziku u izvršni program(mašinski).Kako ? Pomocu prevoditelja ili engl. compiler-a - kompajlera :
prompt> ifort hello.f90 -o hello.exe
Što raditi s FORTRANskim programom ?
◮ Spremiti program u datoteku koja završava s ’.f90’, npr. datotekus imenom hello.f90.
◮ Kompajlirati program iliprevesti program napisan u fortanskom jeziku u izvršni program(mašinski).Kako ? Pomocu prevoditelja ili engl. compiler-a - kompajlera :
prompt> ifort hello.f90 -o hello.exe
Što raditi s FORTRANskim programom ?
◮ ifort je fortranski prevoditelj, koji je napravio Intel .
◮ hello.exe je izvršni program:
prompt> ./hello.exePozdrav svijetuprompt>
Imena datoteka s FORTRANskim programom
◮ Nastavke ’.f90’ imaju datoteke napisane u Fortranu-90.
◮ Za programe napisane u fortranu-77 uobicajeno je koristitinastavak ’.f’.
◮ Nastavci mogu biti i ’.for’, ’.hpf’, ’.f95’, ’.F’, ’F90’, ’.F95’, ’.FOR’,’.HPF’, ’.fpp’, . . . .
◮ Nastavci s velikim slovima cesto oznacavaju programe kojisadrže pseudo-fortranske naredbe. Takova datoteka prolazidodatnu obradu (s tz. predprocesorskim programom) prijekonacnog prevodenja u objektnu datoteku.
Usporedba FORTRANa-77 i FORTRANa-90
◮ Fortran-90
! komentarProgram hello
print *,’Pozdrav svijetu’end program
◮ Fortran-77
c234567890123456789012345678901234567890c komentarc234567890123456789012345678901234567890
Program helloprint *,’Pozdrav svijetu’
end program
O FORTRANu-77
◮ Koristi se fiksni format zapisa programa:◮ mjesta 1-5 u retku se koriste za labela.◮ popunjeno 6. mjesto indicira da je linija nastavak fortranske
naredbe iz prethodne linije.◮ mjesta 7-72 rezervirana za pisanje fortranskih naredbi.
◮ nema naredbi koje rade s vektorima i matricama.Fortran-90 ima naredbe koje rade s vektorima i matricama (tj.
skupovima podataka)
O FORTRANu-90
◮ Koristi se slobodni format zapisa programa:◮ Mjesta 1-6 nisu rezervirana◮ Naredba u liniji može biti vrlo dugacka◮ Naredba se nastavlja na slijedeci red ako završava s
ampersandom (&) na kraju◮ Na istoj liniji može biti više naredbi, a medusobno su razdvojene s
tocka-zarezom (;).
◮ Fortran-90 ima naredbe koje rade s vektorima i matricama.
◮ Bolja kontrola nad vrstama podataka
◮ Dinamicko rezerviranje memorije skupove podataka (velikematrice ili vektore).
primjer FORTRAN-77
c234567890123456789012345678901234567890c komentarc234567890123456789012345678901234567890
Program helloprint *,’Pozdrav i mir cijelom
& svijetu’go to 100
print *,’ovo nece biti ispisano’100 continue
end program
◮ naredba go to 100 forsira program da se nastavi izvoditi odmjesta oznacenog s labelom 100
◮ continue ne cini išta, program se naprosto nastavlja od tog mjestanadalje.
primjer FORTRAN-77
c234567890123456789012345678901234567890c komentarc234567890123456789012345678901234567890
Program helloprint *,’Pozdrav i mir cijelom
& svijetu’go to 100
print *,’ovo nece biti ispisano’100 continue
end program
◮ naredba go to 100 forsira program da se nastavi izvoditi odmjesta oznacenog s labelom 100
◮ continue ne cini išta, program se naprosto nastavlja od tog mjestanadalje.
primjer FORTRAN-90
Program helloprint *,’Pozdrav i mir cijelom &
svijetu’print *,’svim bicima’ ; print *,’u svemiru i okolici’
End program
◮ & (ampersand, and) oznacava nastavak naredbe u slijedeci red
◮ ; (tocka-zarez) razdvaja više fortranskih naredbi
primjer FORTRAN-90
Program helloprint *,’Pozdrav i mir cijelom &
svijetu’print *,’svim bicima’ ; print *,’u svemiru i okolici’
End program
◮ & (ampersand, and) oznacava nastavak naredbe u slijedeci red
◮ ; (tocka-zarez) razdvaja više fortranskih naredbi
O fortranskim prevoditeljima
◮ Linux◮ Intelovi prevoditelji - slobodni za personalnu uporabu, ali uz
registraciju na njihovom web-site-u:http://developer.intel.com/software/products/
◮ Gnu prevoditelji: gfortran, gcc, g++, . . .◮ NAG prevoditelj: f95 - može se dobiti trial verzija s njihovog
web-site-a: http://www.nag.com/◮ PGI prevoditelji: pgcc, pgf77, pgf90, pghpf, . . . - može se dobiti
trial verzija s njihovog web-site-a: http://www.pgroup.com/
◮ MS-windows:
◮ F-Fortran - web-site: http://www.fortran.com/F/◮ gnu-Forran - web-site: http://www.cygwin.com/◮ Salford FTN95 - može se dobiti besplatna personalna verzija na
njihovom web-site: http://www.silverfrost.com/◮ Lahey/Fujitsu Fortran - može se dobiti trial verzija s njihovog
web-site-a: http://www.lahey.com/downloads.htm
Prevodenje (kompailiranje)
prompt> ifort hello.f90 -o hello.exe
◮ Program za prevodenje (naredba)
(f95 za NAGov prevoditelj, pgf90 za PGI prevoditelj, gfortran zaGNU)
◮ Ime datoteke s fortranskim programom. Nastavak ’.f90’indicira da se radi o Fortranu-90 u slobodnom formatuzapisanom.
◮ Iza ove opcije slijedi ime izvršnog programa .
Ime izvršnog programa može biti bilo što, npr. hello ili hello.x iliolleh ili virus.com(Ipak dobro se je konzistentno držati odredenog pravila)
Najcešce korištene opcije kod prevoditelja
-o xxx.exe Ime izvršnog programa
-O Optimiziraj izvršni program
-c Ne napravi kompletni izvršni programnego samo napravi datoteku s tz. objektnim zapisom.(Datoteka završava s ’.o’ ili ’.obj’ kod MS windows-a.)
-llapack koristi biblioteku pomocnih programa(soubrutine-a) ’liblapack.a’ ili ’liblapack.so’
-L /usr/lib/ Biblioteku traži na tom mjestu na disku racunala
Primjeri prevodenja
prompt> ifort -O -c hello.f90
(rezultat prevodenja je hello.o)
prompt> ifort -O hello.o -o hello.exe \-L/usr/local/lib -llapack -lblas
Primjeri prevodenja pod MS-windowzima
Setting Environment for FTN95 for Microsoft .NET and Win32
C:\Program Files\Salford Software\FTN95>z:
Z:\>cd mrvicaxp\NM_01
Z:\mrvicaxp\NM_01>ftn95 hello[FTN95/Win32 Ver. 4.9.0 Copyright (C) Silverforst Ltd 1993-2005]
NO ERRORS [<HELLO> FTN95/Win32 v4.9.0]
Z:\mrvicaxp\NM_01>slink hello.objCreating executable: Z:\mrvicaxp\NM_01\hello.exe
Z:\mrvicaxp\NM_01>hello.exehello world
Što je hello.o a što hello.exe
Objekti zapis (hello.o) je tocni ili ekvivalentni optimizirani mašinskizapis (prijevod) programa, s tim da ne postoje:
◮ dijelovi mašinskog programa koji se brinu za razmjenu podatakas vanjskim jedinicama racunala (tipkovnica, ekran, tvrdi disk,CD/DVD, mreža, ...)
◮ dijelovi mašinskog programa vanjskih funkcija i podprograma kojeprogram poziva (koristi).
Što je hello.o a što hello.exe
Postoje dvije vrste izvršnih programa hello.exe: staticki povezani i onikoji se dinamicki povezuju prije samog izvodenja.
◮ Staticki povezani izvršni programi su gotovo potpuni, osim što imjoš nedostaje dio programa za komunikaciju s vanjskimjedinicama racunala.
◮ Dinamicki povezanim programima nedostaju i vanjske funkcije ipotprogrami koji se nalaze u dinamickim bibliotekama. Dinamickabiblioteka se kopira u glavnu memoriju racunala u trenutkuizvodenja, ako nije vec prije tamo iskopirana.
Svi programi izvode se unutar nekog operacijskog sustava. Izmeduprograma i vanjskih jedinica uvijek stoji operacijski sustav. Pristup donjih je moguc samo kroz posredovanje operacijskog sustava.
Kako znati je li je program dinamicki ili staticki povezan ?
prompt> ldd hello.exelinux-gate.so.1 => (0xffffe000)libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7f18000)libcxa.so.5 => /opt/intel/intel_fc_80/lib/libcxa.so.5 (0xb7ef2000)libunwind.so.5 => /opt/intel/intel_fc_80/lib/libunwind.so.5 (0xb7eec000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7db6000)/lib/ld-linux.so.2 (0xb7f60000)prompt>
Dinamicke biblioteke potprograma koje se povezuju u trenutku izvodenja.
prompt> ldd hello_static.exenot a dynamic executableprompt>
Struktura/format izvršnog programa
prompt> size hello.xtext data bss dec hex filename
302911 24616 10236 337763 52763 hello.x
za ELF-format (linux)
text Mašinske naredbe programa.
data Podaci i konstante s unaprijed poznatim vrijednostima.
bss Podaci cije vrijednosti nisu unaprijed poznate.
dec Ukupna velicina svih sekcija.
Primjer FORTRANskog programa s varijablama
◮ Program
PROGRAM hello
CHARACTER(len=10) :: poruka
poruka = ’Pozdrav svijetu’PRINT *,poruka
END PROGRAM
◮ Izvodenje
prompt> ./hello.exePozdrav svprompt>
Primjer FORTRANskog programa s varijablama
◮ Naredba ’CHARACTER(len=10) :: poruka’ rezervira mjesto umemoriji i toj memorijskoj lokaciji daje ime ’poruka’.
◮ U nastavku programa, kada se navede rijec ’poruka’, onda toznaci bilo da se u tu memorijsku lokaciju stavljaju podaci, bilo dase iz te memorijske lokacije izvlace podaci kako bi se negdje zanešto iskoristili.
◮ Naredba poruka = ’Pozdrav svijetu’ znaci "u memorijsku lokaciju’poruka’ upiši string ’Pozdr ...’. Ocito 10 bytova nije dovoljno zacijeli string, pa je upisano samo prvih 10.
◮ Naredba PRINT *,poruka kaže iz memorijske lokacije ’poruka’uzmi podatke pa ih proslijedi podprogramu PRINT radi ispisa.
Još jedan primjer programa
PROGRAM zbrojiINTEGER :: aa = 1a = a + 1PRINT *,a
END PROGRAM
◮ Naredba ’INTEGER :: a’ rezervira memorijsku lokaciju podimenom ’a’ u koju kanimo spremati cijele brojeve.
◮ Naredba ’a = 1’ u memorijsku lokaciju ’a’ sprema broj jedinicu.
◮ Naredba ’a = a + 1’ uzima sadržaj memorijske lokacije ’a’, njemupribraja jedinicu te rezultat pribrajanja ponovo stavlja umemorijsku lokaciju ’a’.
Još jedan primjer programa
◮ Naredba ’a = a + 1’ u matematici je besmislena. Naredbe uprogramu ne smijemo identificirati kao matematicke operacije.
◮ Varijable ’a’ nisu matematicke varijable nego imena memorijskihlokacija.
◮ Naredba ’a = . . . ’ znaci ono što je izracunato na desnoj straniznaka jednakosti spremi u memorijsku lokaciju ’a’.
◮ Dio naredbe ’a+1’ znaci uzmi sadržaj iz memorijske lokacije ’a’ ipribroji mu jedinicu.
◮ Znak jednakosti nije ’znak jednakosti’ iz matematike negopremještanje rezultata ’desne strane’ u neku memorijsku lokacijunaznacenu s imenom na ’lijevoj strani’.
◮ Nije mogu ce imati naredbu ’a + 1=a’. Na lijevoj strani treba bitiime neke memorijske lokacije.
Još jedan primjer programa
◮ Kod izvodenja dijela naredbe ’a+1’, uzmi sadržaj iz memorijskelokacije ’a’ i pribroji mu jedinicu, ocito da treba imati nekiprivremeni neimenovani memorijski prostor za njegovoprovodenje.
◮ Program prevoditelj ce se pobrinuti za rezervaciju te privremenememorijske lokacije.
◮ Ako bi pisali program u assembleru, mašinskom jeziku, onda bimi bili ti koji bi morali voditi racuna u tim privremenimmemorijskim lokacijama.
Make naredba
Makefile datoteka:
FC = ifortFFLAGS =# =======================all: hello.exe
hello.exe: hello.f90$(FC) $(FFLAGS) hello.f90 -o $@
clean:rm -f *.o *.exe
prompt> makeifort hello.f90 -o hello.exe
Make naredba
◮ make omogucuje automatizaciju prevodenja aplikacije.
◮ Ako se u imeniku nalazi datoteka Makefile tada ce naredba makeizvršavati one naredbe definirane u sekciji all (default-nasekcija/cilj).
◮ Ili, naredba make cilj izvršavat ce one naredbe koje su definiraneu sekciji cilj.Npr. naredba make clean ce izbrisati datoteke koje završavaju s*.o ili *.exe, one koje su rezultat prevodenja.
◮ Ako hello.exe ima noviji datum stvaranja od hello.f90, naredbamake nece ništa raditi.
Makefile datoteka
Prvi dio Makefile datoteke
FC = ifortFFLAGS =
◮ Prva linija definira varijablu koja sadrži ime prevoditelja
◮ Druga linija definira varijablu koja sadrži opcije koje dajemoprevoditelju. U ovom slucaju tih opcija nema.
Drugi dio Makefile datoteke
all: hello.exe
hello.exe : hello.f90
$(FC) $(FFLAGS) hello.f90 -o $@
clean:rm -f *.o *.exe
◮ all je ime sekcije ili cilja koji se izvodi kada ni jedna sekcija nijedana kao argument make naredbi.
◮ Iza dvotocke slijedi ime datoteke koja mora postojati, ili bitinapravljena, da bi se cilj mogao ostvariti (uvjet).
◮ Iza linije s imenom cilja slijedi niz linija koje pocinju s TABom ikoje sadrže komande koje je potrebno izvršiti da bi se cilj ostvario.
◮ Kao ime cilja, tj. hello.exe može se koristiti $@.
Složenija Makefile datoteka
FC = ifortFFLAGS =LFLAGS =# =======================.SUFFIXES: .f90 .exe .o
.f90.o:$(FC) $(FFLAGS) -c $<
.o.exe:$(FC) $< -o $@ $(LFLAGS)
# =======================all: hello.exe
hello.exe: hello.f90
clean:rm -f *.o *.exe
MS windoz-verzija Makefile datoteke
FC = ftn95FFLAGS =LINK = slinkLFLAGS =# =======================all: hello.exe
hello.obj: hello.f90$(FC) $(FFLAGS) hello
hello.exe: hello.obj$(LINK) $<
clean:del *.obj *.exe
Vrste podataka - slijedece predavanje
U FORTRANu postoji nekoliko osnovnih vrsta podataka, te veci brojnjihovih podvrsta.
Niz znakova ili string odredene duljine. Memorijska lokacija serezervira i imenuje naredbom CHARACTER(len=...) ::ime.
Cijeli brojevi koji po apsolutnoj vrijednosti nisu veci od nekogmaksimalnog broja. Memorijska lokacija se imenuje irezervira naredbom INTEGER :: ime.
Realni brojevi koji imaju ogranicen broj decimalnih mjesta, i manji supo iznosu od nekog maksimalno moguceg.
Logicki podaci: istina ili laž.
Iz ovih osnovnih podataka (i njihovih podvrsta) moguce se konstruiratisloženije podatke.