42
Uvod u FORTRAN-90 « Numeriˇ cke metode » Ivo Batisti´ c Fiziˇ cki odsjek, PMF Sveuˇ cilište u Zagrebu predavanja 2005/2006, dopunjeno 2007

Uvod u FORTRAN-90 - grdelin.phy.hrgrdelin.phy.hr/~ivo/Nastava/Numericke_metode/predavanja/01_pred.pdf · Fortran kao jezik za programiranje definiran je nizom pravila koja se vremenom

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.