A Fortran feature history cheat sheet¶
Original IBM 704 FORTRAN¶
Features marked with asterisks *
were gone by FORTRAN IV.
Fixed form input with comment and continuation cards
INTEGER and REAL types, implicit naming conventions
DIMENSION and EQUIVALENCE statements
Assignment statements
Arithmetic (3-way) IF statement
IF statements for checking exceptions and sense switches, manipulating lights
GO TO, computed GO TO, ASSIGN, and assigned GO TO statements
DO loops: positive expressions, 1 trip minimum
extended DO loop ranges
PAUSE, STOP, and CONTINUE statements
Formatted I/O: FORMAT, READ, WRITE, PRINT, PUNCH and
*
READ INPUT / WRITE OUTPUT TAPEUnformatted I/O: READ/WRITE
*
TAPE/DRUMENDFILE, REWIND, and BACKSPACE statements
FREQUENCY statement (optimization hint - survived into FORTRAN IV)
Hollerith constants
Intrinsic functions (all names ending in F
*
)statement functions (names ending in F only
*
)
FORTRAN II¶
SUBROUTINE and FUNCTION subprograms
END statement (with five Sense Switch override argument
*
) (Sense Switch 4, if on: “Causes FORTRAN II to produce a program optimized with respect to index registers.”)CALL and RETURN statements
COMMON (blank only)
DOUBLE PRECISION and (single) COMPLEX data types
6-character identifiers
Bitwise assignment statements with ‘B’ in column 1 (IBM 7090 only)
Double precision with ‘D’ in column 1 (ditto); complex with ‘I’; funcs with ‘F’
FORTRAN IV¶
DATA statement
labeled COMMON
BLOCK DATA subprograms
LOGICAL type and expressions, logical IF statement
Removal of weird original features (
*
above)Quoted character strings
NAMELIST
EXTERNAL subprograms for use as actual arguments
alternate RETURN, ENTRY
&666 label actual arguments for assigned GO TO alternate return
implicit RETURN at END
FORTRAN 66¶
max 3 array dimensions; subscripts only like
C*V+K
; lower bounds all 1adjustable array dummy arguments (dimension of dummy array is dummy argument)
FORTRAN 77¶
array dimension lower bounds other than 1
IF THEN / ELSE IF THEN / ELSE / END IF construct
DO loops with negative expressions and zero trip counts
OPEN, CLOSE, and INQUIRE statements
Direct-access I/O
IMPLICIT statement (was in FORTRAN IV)
CHARACTER data type (was in FORTRAN IV)
PARAMETER statement
SAVE statement
Generic intrinsic names
lexical string comparisons
Obsolescent or deleted features: Hollerith constants and data; H edit descriptors; overindexing; extended range DO loops
(non-standard option) recursion
.EQV. and .NEQV.
implicit RETURN at END
MIL-STD-1753 Fortran (1978)¶
DO WHILE, DO / END DO
INCLUDE statement
IMPLICIT NONE
Bit manipulation intrinsics (IAND, IOR, IEOR, ISHFT, ISHFTC, MVBITS, &c.)
Fortran 90¶
ALLOCATABLE attribute/statement, ALLOCATE and DEALLOCATE statements
keyword= actual arguments
Derived TYPEs, PRIVATE, SEQUENCE; structure components
Modules
POINTER and TARGET attributes, NULLIFY statement
Free form source
Long identifiers
Inline ! comments
Array expressions and assignments
WHERE construct
RECURSIVE procedures
INTERFACE
generic procedures
operator overloading
new declaration syntax with ::
EXIT and CYCLE statements
SELECT CASE construct
Portable kind specifications
INTENT on arguments
Obsolescent features beyond those removed in Fortran 95 below: alternate return, computed GO TO, statement functions, intermixed DATA,
CHARACTER*x
form, assumed-lengthCHARACTER*(*)
functions, fixed form source
Fortran 95 (acquiring some HPF features)¶
FORALL construct
nested WHERE
Default initialization of derived type components
initialization of pointers to NULL()
(clarification) automatic DEALLOCATE at end of scope
extended intrinsics, e.g. DIM= arguments
PURE subprograms
removed features (obsolescent in Fortran 90): floating-point DO index variables, GO TO an END IF from outside, PAUSE statement, ASSIGN statement and assigned GO TO and formats, H edit descriptor
Fortran 2003¶
KIND and LEN parameterized derived types (still not widely available with correct implementations)
PROCEDURE pointers and pointer components
FINAL subroutines
type-bound procedures
GENERIC bindings
PASS attribute
type-bound generic OPERATOR(+) and ASSIGNMENT(=)
EXTENDS(type)
type-bound procedure overriding; NON_OVERRIDABLE attribute to prevent it
ENUM / ENUMERATOR :: / END ENUM
ASSOCIATE / END ASSOCIATE construct
CLASS polymorphic declarator
SELECT TYPE / END SELECT construct, TYPE IS and CLASS IS clauses
Abstract interface allowed on DEFERRED type-bound procedure meant to be overridden
Structure constructors with keyword=
ALLOCATE statement now works on scalars
Assignment to allocatable array with automatic (re)allocation
CALL MOVE_ALLOC(from, to) intrinsic
Finer-grained PUBLIC/PRIVATE
PROTECTED attribute and statement
USE module, OPERATOR(.foo.) => OPERATOR(.bar.)
Lower bounds on pointer assignment; expansion of vector RHS to multidimensional pointer
INTENT allowed on POINTER dummy argument, defined to pertain to the pointer rather than to its target
VOLATILE attribute
IMPORT statement in INTERFACEs
ISO_FORTRAN_ENV intrinsic module
Unicode, SELECTED_CHAR_KIND()
63-char names and 256-line statements
BOZ constants in INT/REAL/CMPLX/DBLE intrinsic calls
[array constant] with optional [type::…] specifier
Named constants in complex constant values
SYSTEM_CLOCK(COUNT_RATE=real type) now allowed
MAX, MAXLOC, MAXVAL, MIN, MINLOC, MINVAL on CHARACTER
Negative zero on ATAN2, LOG, SQRT
IEEE underflow control
Derived type I/O: DT edit, GENERIC READ/WRITE bindings
ASYNCHRONOUS attribute and I/O, WAIT statement
FLUSH statement
IOMSG=str
OPEN(ACCESS=’STREAM’)
OPEN(ROUND=mode), overrides on READ/WRITE; Rx edits
OPEN(DECIMAL=COMMA/POINT), overrides on READ/WRITE; DC and DP edits
OPEN(SIGN=)
KIND= type parameters allowed on specifiers, e.g. NEXTREC=n for cases where n is not default kind of INTEGER
Recursive I/O (also mentioned in Fortran 2008)
NEW_LINE()
I/O of IEEE-754 negative zero, infinities and NaNs
Fortran 66-style optional comma in 2P[,]2E12.4 edit descriptor
Interoperability with C
Fortran 2008¶
SUBMODULE, MODULE PROCEDURE
Coarray references and image control statements
DO CONCURRENT as a non-parallel construct
CONTIGUOUS attribute and statement, IS_CONTIGUOUS() intrinsic
Simply contiguous arrays
Maximum rank now 15
64-bit INTEGER required as SELECTED_INT_KIND(18)
ALLOCATABLE members with recursive types
Implied-shape array declarations, e.g.
INTEGER :: x(0:*) = [0, 1, 2]
Pointer association initialization in declaration with => to SAVE target
Generalization of expressions allowed in DATA statement subscripts and implied DO subexpressions
FORALL(INTEGER(kind) :: …) kind specification
Intrinsic types in TYPE statements, e.g. TYPE(INTEGER)
Multiple type-bound procedures on one PROCEDURE statement
Structure constructors can omit ALLOCATABLE components
ALLOCATE(arr, SOURCE=x or MOLD=x) sets shape without needing explicit bounds on arr
ALLOCATE(polymorphic, MOLD=x) sets type
z%RE, z%IM
POINTER-valued functions as variables suitable for LHS of =, &c.
OPEN(NEWUNIT=u)
G0 edit descriptor
(*(...))
format item unlimited repetitionRecursive I/O
BLOCK construct
EXIT statement for constructs other than DO
STOP statement constant generalized
BGE(), BGT(), BLE(), BLT() unsigned integer comparisons
DSHIFTL(), DSHIFTR()
LEADZ(), POPCNT(), POPPAR(), TRAILZ()
MASKL(), MASKR()
SHIFTL(), SHIFTR(), SHIFTA()
MERGE_BITS()
IALL(), IANY(), IPARITY()
STORAGE_SIZE() in bits
RADIX argument to SELECTED_REAL_KIND()
COMPLEX arguments to ACOS et al.
ACOSH(), ASINH(), ATANH()
ATAN(x,y) synonym for ATAN2()
Bessel functions
ERF(), ERFC(), ERFC_SCALED(), GAMMA(), HYPOT(), LOG_GAMMA()
NORM2()
PARITY()
CALL EXECUTE_COMMAND_LINE()
MINLOC(BACK=.TRUE.), MAXLOC(BACK=.TRUE.)
FINDLOC()
More constants and functions in intrinsic module ISO_FORTRAN_ENV.
Implicit SAVE attribute assumed for module/submodule variables, procedure pointers, and COMMON blocks.
CONTAINS section can be empty in a procedure or type.
Internal procedures may be passed as actual arguments and assigned to procedure pointers.
Null pointer or unallocated allocatable may be passed to OPTIONAL dummy argument, which then appears to not be present.
POINTER INTENT(IN) dummy arg may be associated with non-pointer TARGET actual
Refinement of GENERIC resolution rules on pointer/allocatable, data/procedure
IMPURE for ELEMENTAL procedures (still PURE by default of course)
Obsolescence of ENTRY
A source line can begin with a semicolon.
Fortran 2018¶
Obsolescence of COMMON, EQUIVALENCE, BLOCK DATA, FORALL, labeled DO, specific names for generic intrinsics
Arithmetic IF and non-block DO deleted
Constant properties of an object can be used in its initialization
Implied DO variables can be typed in array constructors and DATA
Assumed-rank arrays with DIMENSION(..), SELECT RANK construct
A file can be opened on multiple units
Advancing input with SIZE=
G0.d for integer, logical, character
D0.d, E0.d, EN0.d, ES0.d, Ew.dE0, &c.
EX hex floating-point output; hex acceptable for floating-point input
Variable stop code allowed in (ERROR) STOP
new COSHAPE, OUT_OF_RANGE, RANDOM_INIT, REDUCE intrinsics
minor tweaks to extant intrinsics
IMPORT statement for BLOCK and contained subprograms
IMPLICIT NONE can require explicit EXTERNAL
RECURSIVE becomes default; NON_RECURSIVE added
DO CONCURRENT locality clauses