16. Inkompatibilitetsproblem

16.0 Inledning

16.1 Inkompatibilitet mellan olika Fortran 90 implementationer.

Den nya standarden har en sak som tyvärr lämnar fältet fritt för variationer mellan olika implementationer. Det är slagen KIND, vilka kan ges olika heltalsvärden svarande mot olika precisioner. Härvid har NAG valt att använda 1 för enkel precision och 2 för dubbel precision, medan Cray har baserat sig på IBM:s gamla utvidgning av Fortran 66 genom att ange antalet bytes i ordet. NAG använder exempelvis KIND=2 för dubbel precision medan Cray i stället skriver KIND=16. Det kan här nämnas att å andra sidan har NAG valt att lägga in IBM:s variant REAL*4 som synonym för REAL och REAL*8 som synonym för DOUBLE PRECISION i sin Fortran 90.

16.2 Skillnad i behandling av logiska variabler.

Den nya standarden är mer ordrik och explicit, varför en del regler är tydligare formulerade och sannolikheten därför är större att de måste följas. Ett exempel är jämförelse av logiska variabler, som under Fortran 90 måste ske med .EQV. eller .NEQV. medan detta i praktiken gick i Fortran 77 även med .EQ. och .NE.

16.3 Små saker av stor betydelse.

Man använde ofta tidigare variabelnamnet SUM för att exempelvis lagra det temporära värdet vid en summation i en DO-slinga. Det namnet är numera mindre lämpligt, eftersom SUM är namnet på en automatisk summation, se avsnitt 14 om fältfunktioner i Appendix 5. Andra farliga variabelnamn kan vara ALL, HUGE, INDEX, INT, KIND, MASK, PRESENT, REPEAT, SCALE, SIZE, TINY och TRIM. Om man använder ett "upptaget" namn blir den normala effekten att den inbyggda funktionen blir otillgänglig.

I en del gamla Fortran-dialekter användes TYPE för utskrift på skrivmaskinsterminalen och PRINT för utskrift på radskrivaren. Begreppet TYPE har nu fått en helt ny betydelse, nämligen för att deklarera användardefinierade datatyper.

16.4 Undertryckning av radframmatning.

Ett problem som kan uppstå vid flyttning från Fortran 77 till Fortran 90 beror på en vanlig avvikelse från standard. Den avvikelse jag tänker på är användningen i FORMAT av $, för att undertrycka radframmatningen innan användaren skall ge ett värde, vilket är en vanlig utvidgning av Fortran 77. Eftersom denna avvikelse normalt ej finns i Fortran 90 erhålles där kompileringsfel, varför en annan lösning måste sökas.

Under många Fortran 77 implementationer skrev man således

        PROGRAM TEST
        REAL X
        WRITE(*,10)
 10     FORMAT(' GE X = ',$)
        READ(*,*) X
        WRITE(*,*) X
        END
I Fortran 90 använder man i stället icke-avancerande in/utmatning, "non-advancing I/O", man skriver därför skrivsatsen på följande sätt under Fortran 90
        WRITE(*,'(A)',ADVANCE='NO') ' GE X = '
Dessa båda program ger samma resultat, man blir uppmanad att ge värdet på variabeln X på samma rad som texten
         GE X = 
Icke avancerande in/utmatning kan ej användas på liststyrd in/utmatning eller på NAMELIST.

16.5 Varierande system för hantering av matriser.

Eftersom Fortran 77 saknar dynamisk minnesallokering måste man där "ta till" en tillräcklig dimensionering i anropande programenhet, och hålla ordning på "ledande dimension" i den anropade programenheten. När man utnyttjar Fortran 90 rutiner vill man dock i allmänhet ha ett fält som överensstämmer med matrisens logiska storlek. En tilldelning som åstadkommer denna transformation är enkel att göra. Vi antar att en kvadratisk matris från den anropande programenheten finns i aktuell programenhet som fältet A med dimensioneringen A(IA,*), dvs med IA som den ledande dimensionen, och att vi vill föra över värdena till ett fält B, med dimensioneringen B(N,N), där N samtidigt är matrisens matematiska dimension. Följande sats utför önskad operation om IA >= N.
        B = A(1:N,1:N)

16.6 Deklarationer

Deklaration av variabler kan nu samlas i en sats per variabel. Under Fortran 77 deklarerade man till exempel
        REAL A, B, C
        PARAMETER (A = 3.141592654)
        DIMENSION B(3)
        DATA B / 1.0, 2.0, 3.0 /
        DIMENSION C(100)
        DATA C /100*0.0/
dvs en variabel kunde förekomma på flera rader. Under Fortran 90 kan man naturligtvis skriva som tidigare, men man bör i stället skriva
        REAL, PARAMETER        :: A = 3.141592654
        REAL, DIMENSION(1:3)   :: B = (/ 1.0, 2.0, 3.0 /)
        REAL, DIMENSION(1:100) :: C
        DATA C /100*0.0/

16.7 Bakåt- och framåtkompatibilitet.

Mycket viktigt vid införandet av en ny programspråksstandard är att gamla program (åtminstone sådana som följer den utgående standarden) kan användas även under den nya.

När man gick från Fortran 66 till Fortran 77 tog man bort den utvidgade DO-slingan (möjligheten att, om man inte ändrar några av DO-slingans styrparametrar, hoppa ut ur slingan och sedan hoppa in igen, dvs något av motsatsen till strukturerad programmering) och Hollerith-konstanter (utom i FORMAT). Detta innebär att det finns program som uppfyller Fortran 66 men ej uppfyller Fortran 77. De flesta leverantörer har dock valt att låta dessa två begrepp ligga som utvidgningar i sin version av Fortran. För Fortran 90 gäller att inget tagits bort från Fortran 77. En viktig praktisk fråga blir dock huruvida leverantörerna kommer att fortsätta att behålla de båda saker som egentligen skulle ha försvunnit då Fortran 77 kom. Detta är tillåtet.

Innan antagen dimension (asterisken * som sista dimension) infördes i samband med Fortran 77 "fuskade" man i stället med att ge en etta (1) för den sista dimensioneringen. Denna metod fungerar inte alls under de flesta Fortran 90 system! Tre mycket små skillnader mellan Fortran 77 och Fortran 90 har noterats av Cray, och gäller allmänt.

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. Dessa konstruktioner är

Ytterligare information om utdöende egenskaper ges i Status för Fortran 95, vilken beskriver det aktuella läget för nästa version av standarden. Se speciellt den nya listan över borttagna egenskaper och den reviderade listan över utdöende egenskaper.

En grupp High Performance Fortran Forum har utarbetat ett förslag för att hantera parallell databehandling i Fortran, i första hand i form av ett tillägg till Fortran 90. Syftet med detta projekt HPF är att erbjuda ett flyttbart (portabelt) språk som ger ett effektivt utnyttjande av olika parallella system. Projektet framlade ett slutligt förslag den 3 maj 1993, och syftar mot en de facto standard. Se vidare Appendix 9.

Något förenklat kan man säga att Fortran 90 effektivt klarar vektorprocessorer, medan HPF även klarar parallella processorer.

Bland de nya saker som överväges för nästa version av Fortran kan nämnas förbättrad parallell databehandling, avbrottshantering, parameteriserade datatyper samt datatyper med ärvda egenskaper. Avsikten är att komma med en revision under 1996, med några försiktigt utvalda nya egenskaper. Dessförinnan kommer ett par rättelser/förtydliganden (eventuellt även ett tillägg för avbrottshantering) från ISO i form av "Technical Corrigendum" till Fortran 90. En tidig version av dessa rättelser/förtydliganden finns i Fortran Forum, Vol 11, nummer 1, mars 1993, som SPECIAL ISSUE: Fortran 90; Errata, Amendments, and Interpretations, progress to date, 48 sidor.

Den nuvarande statusen för nästa version av Fortran finns beskrivet i filen Fortran 95.

16.8 Skillnader mellan olika Fortran-standarder

EgenskapFortran 66Fortran 77Fortran 90Fortran 95
Fix formFix formFixFri(Fix)Fri
Hela Fortran 66=-2-2-2-5-5
Hela Fortran 77-===-5-5
Hela Fortran 90--==-5-5
Hela Fortran 95---14-14==
Fortsättning markerad i kolumn 6 på nästa rad+++-+-
Fortsättning markerad med & sist på gamla raden---+-+
Blank rad som kommentar-+++++
Signifikanta blanka---+-+
Generiska funktioner-+++++
Användardefinierade generiska funktioner--++++
REAL*8------
KommentarsymbolCC   *C   *   !!C   *   !!
Filtyp i Unix.f.f.f.f90.f.f90
Filtyp i DOS.FOR.FOR.FOR.F90.FOR.F90

Ovan innebär till exempel -2 i position Hela Fortran 66 / Fortran 90 att två egenskaper försvunnit vid övergången från Fortran 66 till Fortran 90. Detta gäller både vid fix form och fri form hos källkoden.

I de fyra första raderna anger ett likhetstecken = att det gäller oförändrat, ett minus - att flera egenskaper saknas.

I de följande sju raderna anger ett plus + att egenskapen finns, ett minus - att den inte finns.

Fix form av källkod bör undvikas under Fortran 95!

REAL*8 är en alternativ benämning på DOUBLE PRECISION som införts av IBM och användes även av Digital. Fler varianter i samma stil finns.

Som kommentarsymbol rekommenderas utropstecknet !, som accepteras även i flera implementationer av Fortran 77.

Under UNIX finns egentligen inget som heter filtyp, och dessa är inte specificerade i Fortran-standarderna utan är informella fabrikantstandarder.

Övningar.

(16.1) Kompilera och kör något av dina mindre program med Fortran 90 utnyttjande fix form. Viss körinstruktion finns i Appendix 6, NAG:s Fortran 90.
Lösning.

(16.2) Modifiera programmet genom att byta ut eventuella kommentarer inledda med C eller * mot ! och försök att utnyttja Fortran 90 fri form.
Lösning.

(16.3) Vad händer om följande lilla program körs under fix form respektive fri form?

        LOGICAL L
        L = .FALSE.
        IF (L) THEN Z = 1.0
        ELSE Y = Z ENDIF
        END
Lösning.

Programbibliotek Innehåll Felsökning


Senast modifierad: 3 maj 1999
boein@nsc.liu.se