20. Nyheterna i Fortran 95
Switch to the English version
De flesta av de nya egenskaperna kommer från
HPF.
Fortran 95 publicerades den 15 december 1997 som ISO/IEC 1539-1:1997.
Standardförslaget är publicerat som "Special Issue,
Fortran 95, Committee Draft, May 1995" i Fortran Forum,
Vol. 12, Nr. 2, Juni 1995. Det finns även på nätet,
se min Fortran-sida.
Två viktiga begrepp har tyvärr inte inkluderats vid denna revidering,
nämligen dels avbrottshantering, speciellt viktigt vid
flyttals-beräkningar, dels blandning av programspråk, eng.
mixed language programming.
Arbetet på nästa version av Fortran går bra, se
kapitel 24 och den
officiella hemsidan för Fortran-standarden.
Det nya språket Fortran 95 är nu Fortran 90 plus
- Det nya kommandot FORALL som ett alternativ till DO-kommandot
- Partiell kapsling av FORALL och WHERE satser
- Maskat ELSEWHERE
- Rena (eng. pure) procedurer
- Elementära användardefinierade procedurer
- Rena (eng. pure) procedurer i specifikationer
- Reviderade
MINLOC och MAXLOC
- Utvidgning av CEILING och FLOOR med nyckelordsargumentet
KIND
- Initiering av pekare
- Skönsvärdes-initiering av egendefinierade datatyper
- Ökad kompatibilitet med IEEE-aritmetik
- En inbyggd funktion CPU_TIME för mätning av CPU-tid
- En inbyggd funktion NULL för att nollställa pekare
- Automatisk avallokering av allokerbara fält vid uthopp ur giltighetsområdet
- Kommentarer i NAMELIST vid inmatning
- Minimalt fält vid utmatning
- Fullständig variant av END INTERFACE
Anm. Rena procedurer (funktioner eller subrutiner) är sådana som
saknar sidoeffekter, och vars användning därför kan parallelliseras.
Elementära funktioner är rena funktioner med bara skalära
argument och skalärt resultat. De förhindrar ej parallellisering.
Fem egenskaper har tagits bort från Fortran 90.
- Styrvariabler
i DO-slingan som är reella flyttal eller tal i dubbel precision
- Hopp till END IF från ett yttre block
- PAUSE satsen
- ASSIGN
med tilldelat GOTO och tilldelat FORMAT,
dvs hela begreppet "satsnummervariabel" inklusive
tilldelad hoppsats
- Hollerith-konstanter i FORMAT, dvs editering med nHtext
Dessa är alla från listan över
utdöende
egenskaper hos Fortran 90 (men inte hela listan).
Det är tillåtet för en kompilator att ha utvidgningar till
standarden, förutsatt att dessa kan flaggas. Det är mycket vanligt
för både Fortran 77 kompilatorer och Fortran 90 kompilatorer att ha med
de båda konstruktioner
(se avsnittet 16.7)
som togs bort vid införandet av Fortran 77,
och jag väntar mig att nästan alla Fortran 95 kompilatorer kommer att
ha med alla de från Fortran borttagna konstruktionerna.
I Fortran 90 användes begreppet utdöende
(eng. obsolescent), vilket innebär att vissa ålderdomliga
konstruktioner kan komma att tas bort när Fortran ändras nästa
gång. Fortran 95 har tagit en del konstruktioner från denna lista
och förklarat dem borttagna från språket Fortran. Å
andra sidan har en del ytterligare konstruktioner (numrerade 4 till 9 nedan)
införts som utdöende.
De aktuella utdöende konstruktionerna är
- Aritmetisk
IF-sats
- Avsluta flera DO-slingor på samma sats eller
avsluta en DO-slinga på
annat
sätt än med CONTINUE eller END DO
- Alternativa
återhopp
- Den styrda
hopp-satsen
- Satsfunktioner
- DATA satser
blandade med exekverbara satser
- Funktioner med
textsträng av antagen längd som resultat
- Fix form
av källkoden
- CHARACTER* varianten av
CHARACTER
deklarationen
Jag har inte tidigare diskuterat funktioner med textsträng av
antagen längd som resultat, engelska "assumed character length
functions". Detta var tydligen lyckat eftersom de nu står på
"dödslistan".
En diskussion av begreppet
finns nu.
När de försvinner är det enkelt att koda om dem som subrutiner.
Att ersätta CHARACTER*LAENGD med CHARACTER(LEN=LAENGD) eller
CHARACTER(LAENGD) är enkelt, liksom de andra punkterna ovan.
Till exempel punkt 6 innebär endast att flytta alla DATA satser
till början av programenheten, före de exekverbara satserna.
Satsfunktioner ersätts naturligtvis med
interna funktioner.
20.4 Beskrivning av de nya egenskaperna
En beskrivning av de nya egenskaperna följer.
Det nya kommandot
FORALL
som ett alternativ till DO-kommandot
Kommandot
FORALL
har införts som ett alternativ till DO-slingan. Den
viktigaste skillnaden är att exekveringsordningen i
DO-slingan är mycket strikt, medan den för FORALL
är mindre strikt, vilket underlättar parallell exekvering. För
ytterligare information hänvisas till
HPF Appendix eller direkt till
hemsidan för HPFF.
Partiell
kapsling
av FORALL och WHERE satser
En FORALL konstruktion kan innehålla en WHERE konstruktion.
Maskat ELSEWHERE
Det är nu tillåtet att maska inte bara WHERE satsen i
WHERE konstruktionen, utan även dess ELSEWHERE,
vilken nu därför även kan upprepas.
WHERE (villkor_1)
...
ELSEWHERE (villkor_2)
...
ELSEWHERE
...
END WHERE
Rena procedurer
Rena (eng. pure) funktioner är funktioner utan
sidoeffekter. Att en funktion saknar sidoeffekt kan indikeras med det
nya prefixet PURE.
En lång lista på villkor som måste vara uppfyllda
ges i standardförslaget, sektion 12.6.
Rena subrutiner definieras på ett liknande sätt. Den viktigaste
skillnaden är att "sidoeffekter" är naturligtvis tillåtna
för argument associerade med formella argument specificerade
INTENT(OUT) eller INTENT(INOUT).
Fördelen med att veta att en funktion är ren är att detta
faktum underlättar parallell exekvering.
Elementära användardefinierade procedurer
Elementära funktioner är rena funktioner som bara har skalära
formella argument (dock ej pekare eller procedurer) och med skalärt resultat
(ej heller detta får vara pekare). Att en funktion är
elementär kan indikeras med det nya prefixet
ELEMENTAL. Prefixet RECURSIVE får inte kombineras med
prefixet ELEMENTAL. Prefixet PURE är en automatisk
följd av prefixet ELEMENTAL.
En elementär funktion kan anropas med fält som verkliga argument.
Dessa måste då vara av samma typ och ha samma mönster.
Resultatet är samma fält som om funktionen hade anropats
individuellt med vart och ett av fältelementen, och med värdet
placerat på motsvarande plats i det nya fältet.
Elementära subrutiner definieras på motsvarande
sätt. Den viktigaste skillnaden är att "sidoeffekter"
är naturligtvis tillåtna för argument associerade med
formella argument specificerade INTENT(OUT) eller
INTENT(INOUT).
Fördelen med att veta att en funktion är ren är att detta
faktum underlättar parallell exekvering, i ännu större
omfattning än om funktionen bara vore ren.
Rena procedurer i specifikationer
Rena funktioner kan användas i specifikationer om vissa villkor är
uppfyllda, se standardförslaget, sektion 7.1.6.2.
Sådana specifikationer kan vara att specificera fältgränser
och längder av textsträngar i ett underprogram.
-
Lokaliseringsfunktionerna MINLOC och MAXLOC har utvidgats med det frivilliga
argumentet DIM motsvarande det vid fältfunktionerna
MINVAL
och MAXVAL.
Utvidgning av CEILING och FLOOR med nyckelordsargumentet
KIND
De båda nya (dvs från Fortran 90)
numeriska
funktionerna CEILING och FLOOR har utvidgats med
nyckelordsargumentet KIND, på samma sätt som för
INT och NINT. Resultatet blir ett heltal, men av
specificerat slag (KIND), inte nödvändigtvis standardslaget
för heltal.
Initiering av pekare
Den nya funktionen NULL kan användas vid specifikationen för
att föreskriva att en pekare initialt saknar mål
(eng. initially disassociated), se vidare nedan.
Skönsvärdes-initiering av egendefinierade datatyper
Det är nu möjligt att specificera initialvärden för
egendefinierade datatyper. Detta sker på vanligt sätt med
likhetstecken (eller pekartilldelningssymbolen) följt av värdet
(eventuellt ett flertal värden i ett fält). Denna initiering
behöver inte innefatta alla komponenterna i en datatyp.
Ett enkelt exempel. I avsnitt
10.5 introducerades en gles matris.
Ett numeriskt intressant exempel är en gles matris A med
högst ett hundra noll-skilda element, vilka kan specificeras med
följande sats, där vi nu initierar alla element till 2.0.
TYPE NONZERO
REAL :: VALUE = 2.0
INTEGER :: ROW, COLUMN
END TYPE
och
TYPE (NONZERO) :: A(100)
Man får nu värdet (vilket i detta fall blir 2.0) av A(10)
genom att skriva A(10)%VALUE. Det satta värdet kan ändras
individuellt med en vanlig tilldelningssats, till exempel
A(15) = NONZERO(17.0,3,7)
Ökad kompatibilitet med IEEE-aritmetik
IEEE-aritmetiken har för flyttal två olika representationer av noll,
en för plus noll och en annan för minus noll.
Tidigare tvingade Fortran att noll alltid skulle vara lika, vilket gjorde
att man inte kunde utnyttja tecknet hos noll. Nu gäller att för processorer
som kan åtskilja dem att de skall behandlas som identiska
- Vid alla jämförelseoperationer
- Som in-argument till alla inbyggda funktioner och subrutiner utom för
SIGN
- Som det skalära uttrycket i den (föråldrade) aritmetiska
IF-satsen
För att särskilja de båda fallen måste därför
funktionen
SIGN
användas. Den har därför generaliserats så att
tecknet hos det andra argumentet beaktas även då värdet är noll
(flyttal).
En inbyggd funktion CPU_TIME för mätning av CPU-tid
Subrutinen CPU_TIME(TIME) tillhör naturligtvis klassen
inbyggda
subrutiner. I den skalära flyttalsvariabeln TIME hamnar
aktuell processortid i sekunder. Om processorn inte kan mäta tiden
erhålles i stället ett negativt tal. Som vanligt erhålles
den i en viss beräkning utnyttjade tiden genom att subtrahera två
olika anrop av subrutinen.
Tidsrutinens exakta natur är implementationsberoende, en parallelldator
(med flera processorer)
kan ge ett helt fält av tider, svarande mot de olika processorerna.
Frågan om åtskillnad av CPU-tid och systemtid är likaså
implementationsberoende.
En inbyggd funktion NULL för att nollställa pekare
Denna funktion kan användas vid specifikationstillfället för
att specificera att en pekare initialt saknar mål (eng. initially
disassociated), i exemplet nedan fältet VEKTOR.
REAL, POINTER, DIMENSION(:) :: VEKTOR => NULL()
Funktionens argument behöver ej ges, om det finns med bestämmer det
pekarens karakteristika, annars bestäms dessa från omgivningen.
Funktionen tillhör klassen i
sektion 20,
pekarförfrågansfunktioner.
Automatisk avallokering av allokerbara fält vid uthopp ur
giltighetsområdet
Om användaren inte explicit avallokerar lokala allokerbara fält
då giltighetsområdet lämnas, sker detta numera automatiskt,
och frigör således minnesutrymme.
Kommentarer i NAMELIST vid inmatning
Det blir nu tillåtet att lägga in kommentarer på
vanligt sätt utnyttjande !
Minimalt fält vid utmatning
För att erhålla ett maximalt utnyttjande av antalet positioner
är det nu möjligt att enbart ge det eventuella antalet decimaler
och inte hela fältbredden vid formaten B, F, I, O och Z.
Exempel är I0 och F0.6. Det blir naturligtvis inte ett
fält med noll tecken, utan ett med lagom många tecken.
De enda system jag har hittat detta implementerat på är Cray T3E med
f90
i Programming Environment 3.2.0 (men ej tidigare),
på NAG Fortran 95 (version 4) för UNIX,
samt på MAI:s nya Sun-system.
Fullständig variant av END INTERFACE
Även END INTERFACE kan nu ges en fullständig variant,
så kan i avsnitt 14.4.1 gränssnittet
ges som
INTERFACE SWAP
MODULE PROCEDURE SWAP_R, SWAP_I, SWAP_C
END INTERFACE SWAP
Denna kan även innefatta eventuell generisk specifikation.
Senast modifierad: 19 november 2007
boein@nsc.liu.se