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.

20.1 Nya egenskaper

Det nya språket Fortran 95 är nu Fortran 90 plus
  1. Det nya kommandot FORALL som ett alternativ till DO-kommandot
  2. Partiell kapsling av FORALL och WHERE satser
  3. Maskat ELSEWHERE
  4. Rena (eng. pure) procedurer
  5. Elementära användardefinierade procedurer
  6. Rena (eng. pure) procedurer i specifikationer
  7. Reviderade MINLOC och MAXLOC
  8. Utvidgning av CEILING och FLOOR med nyckelordsargumentet KIND
  9. Initiering av pekare
  10. Skönsvärdes-initiering av egendefinierade datatyper
  11. Ökad kompatibilitet med IEEE-aritmetik
  12. En inbyggd funktion CPU_TIME för mätning av CPU-tid
  13. En inbyggd funktion NULL för att nollställa pekare
  14. Automatisk avallokering av allokerbara fält vid uthopp ur giltighetsområdet
  15. Kommentarer i NAMELIST vid inmatning
  16. Minimalt fält vid utmatning
  17. 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.

20.2 Borttagna egenskaper

Fem egenskaper har tagits bort från Fortran 90.
  1. Styrvariabler i DO-slingan som är reella flyttal eller tal i dubbel precision
  2. Hopp till END IF från ett yttre block
  3. PAUSE satsen
  4. ASSIGN med tilldelat GOTO och tilldelat FORMAT, dvs hela begreppet "satsnummervariabel" inklusive tilldelad hoppsats
  5. 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.

20.3 Utdöende egenskaper

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

  1. Aritmetisk IF-sats
  2. Avsluta flera DO-slingor på samma sats eller avsluta en DO-slinga på annat sätt än med CONTINUE eller END DO
  3. Alternativa återhopp
  4. Den styrda hopp-satsen
  5. Satsfunktioner
  6. DATA satser blandade med exekverbara satser
  7. Funktioner med textsträng av antagen längd som resultat
  8. Fix form av källkoden
  9. 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.
  1. 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.

  2. Partiell kapsling av FORALL och WHERE satser

    En FORALL konstruktion kan innehålla en WHERE konstruktion.

  3. 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
    
    
  4. 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.

  5. 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.

  6. 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.

  7. Reviderade MINLOC och MAXLOC

    Lokaliseringsfunktionerna MINLOC och MAXLOC har utvidgats med det frivilliga argumentet DIM motsvarande det vid fältfunktionerna MINVAL och MAXVAL.

  8. 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.

  9. 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.

  10. 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)
    
  11. Ö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 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).

  12. 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.

  13. 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.

  14. 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.

  15. Kommentarer i NAMELIST vid inmatning

    Det blir nu tillåtet att lägga in kommentarer på vanligt sätt utnyttjande !

  16. 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.

  17. 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.

Optimering Lärobok i Fortran 90/95, Innehåll Programspråket F


Senast modifierad: 19 november 2007
boein@nsc.liu.se