VIntage Fortran (VIF) is my experimental compiler for FORTRAN II/IV and FORTRAN 66/77. A goal for VIF was to have high precision data types REAL*32 and COMPLEX*64, considering that most multi-precision applications require twenty up to sixty digits. VIF is probably the only vintage Fortran implementation offering these types. Here you can download the current VIF source distribution. VIF builds a vintage library with (selected) FOSS subprograms from BLAS, LINPACK, SLATEC etcetera.

VIF is a gcc front end that does not emulate the Fortran programming and storage model as does for example f2c. This is a trade-off between completeness and object code efficiency. Therefore VIF does not compile little-used archaic statements that have no straightforward C equivalent, specifically ENTRY, alternate RETURN, or some EQUIVALENCE statements. Furthermore, old Fortran had no reserved words and spaces in statements had no meaning outside character strings. VIF has reserved words and spaces in statements are significant.

Despite these restrictions, VIF compiles most vintage code. I like to think this is because at the time, programmers were already keen on legible and portable code, avoiding Fortran's idiosyncrasies. If you need to compile code with statements that are unique to Fortran, you may want to use production-quality FOSS solutions like f2c or GNU fortran.

A caveat when compiling vintage code is that in the old days, different machines had different representations of types, which are not always compatible with the IEEE standard common today. For instance, a REAL value occupied a 64-bit word in CRAY-1 FORTRAN, a 36-bit word in PDP-10 FORTRAN and a 32-bit word in IBM FORTRAN.

VIF can immediately execute a program upon successful compilation, like WATFOR or WATFIV, or a JCL CLG-type procedure under MVS or z/OS. For example, next trivial code xmach.f prints machine parameters for REAL*32 analogeous to the SLATEC D1MACH function:

      real*32 x1mach
      do k = 1, 5
      print *, k, x1mach(k)
      end do
      end

We can execute this code with VIF like so, specifying -g:

$ vif -g xmach.f
** main       ** end of compilation 1
** linker     ** object size 372280 bytes
** statistics ** 1 subprogram, no errors, no warnings
** execution  **
1  3.3621031431120935062626778173217526025980793448464712401088272298088533e-4932
2  1.1897314953572317650857593266280071307634446870965102374726748212332616e+4932
3  1.1319598848533390459386399113609739725853163997673922736978268612419382e-0072
4  2.2639197697066780918772798227219479451706327995347845473956537224838764e-0072
5  3.0102999566398119521373889472449302676818988146210854131042746112710819e-0001

Below is a list with the cross-referenced source files of the current version. VIF links to FOSS vintage library subprograms that are not indexed here.

VIF C source files

File Synopsis Lines
assign.c Compile assignment statements. 180
autosave.c Compile storage classes, SAVE statement. 181
banner.c Banner for listing files. 169
call.c Compile subprogram calls. 167
code.c Routines to emit C object code. 468
common.c Compiler COMMON statements. 146
data.c Compile DATA statements. 336
decls.c Compile declarations. 309
diag.c Diagnostic routines. 100
10  dimension.c Compile DIMENSION statements. 119
11  emit.c Emit C object code. 205
12  equivalence.c Compile EQUIVALENCE statements. 233
13  expr.c Compile Fortran expressions. 603
14  factor.c Compile Fortran expression factors. 315
15  fold.c Constant folder. 558
16  format.c Compile FORMAT statements. 438
17  fpp.c Fortran preprocessor. 155
18  goto.c Compile GOTO statements. 137
19  implicit.c Implicit declaration routines. 185
20  intrinsic.c Compile intrinsic functions. 630
21  macro.c Compile function statements. 179
22  modules.c Compile subprograms. 602
23  parameter.c Compile PARAMETER statement. 75
24  renum.c Vintage Fortran statement renumbering tool. 574
25  rts.c Runtime support. 295
26  rts-io.c Runtime support for Fortran IO. 989
27  rts-jit.c Just-in-time compilation of FORMAT strings. 390
28  rts-lapack.c Runtime support for LAPACK subprograms. 805
29  rts-math.c Runtime support for math operations. 468
30  rts-real16.c Runtime support for REAL*16 and COMPLEX*32. 132
31  rts-real32.c Runtime support for REAL*32 and COMPLEX*64. 2436
32  rts-slatec.c Runtime support for SLATEC subprograms. 384
33  rts-wapr.c Runtime support implementing the W-function. 359
34  scan.c Fortran scanner. 693
35  slice.c Compile array slices. 203
36  statements.c Compile statements. 652
37  table.c Symbol table routines. 310
38  transput.c Compile Fortran IO. 954
39  type.c Type routines. 342
40  vif.c VIF driver. 662

VIF Fortran source files

File Synopsis Lines
fortran-ii.f FORTRAN II library functions for VIF. 44
fortran-iv.f FORTRAN IV intrinsic library functions for VIF. 450
ml.f Machine Learning subprograms for VIF. 210

VIF include files

File Synopsis Lines
rts-real32.h Runtime support for REAL*32 and COMPLEX*64. 321
vif.h VIF include file. 832

The number of source lines in this version is 18291.


Posts in "Computing history"

Marcel van der Veer Computing history
Fortran - lingua franca with a promising future behind it
March 2022

I wrote a simple compiler that translates most Fortran IV/66/77 source code …


Marcel van der Veer Computing history
VM/CMS and MVS/TSO reunited
October 2021

Virtualisation began half a century ago as a method of sharing mainframe resources between different operating systems, applications or users …


Marcel van der Veer Computing history
Algol68C on MVS revisited
August 2018

As the author of Algol 68 Genie I am interested in having access to other Algol 68 compilers for reference purposes …


Marcel van der Veer Computing history
Running Algol68C on MVS
October 2012

Recently, Algol68C Release 1.3039 was made public for download …




© 2002-2024 J.M. van der Veer (jmvdveer@xs4all.nl)