|
|
• Het Vintage Fortran-project
• Downloads
• Portabiliteit van oude Fortran broncode
• Opmerkingen, vragen of bugmeldingen
• Broncode met kruisverwijzingen
VIntage Fortran (VIF) is mijn niche-compiler voor vintage Fortran, dat wil zeggen Fortran 66/77. VIF is experimenteel in de zin dat het archaïsche Fortran-machinemodel niet geëmuleerd wordt, en daarom enkele zelden gebruikte, verouderde of niet-porteerbare statements niet kan vertalen. Dit is een afweging tussen volledigheid en efficiëntie. Persoonlijk gebruik ik VIF om er vintage simulatiesoftware mee uit te voeren.
VIF implementeert multi-precisie typen REAL*16 en COMPLEX*32, wat indertijd niet ongewoon was. Een nuttige uitbreiding die VIF biedt is de implementatie van REAL*32 en COMPLEX*64. Dit zou moeten volstaan voor veel toepassingen die meervoudige precisie vragen, en die doorgaans twintig tot zestig decimalen vereisen. VIF is waarschijnlijk de enige vintage Fortran-implementatie die deze typen aanbiedt.
Daarnaast vereist VIF dat gereserveerde symbolen door witruimte van variabelenamen worden gescheiden, in tegenstelling tot Fortran. Spaties binnen namen hebben echter geen betekenis. Het negeren van witruimte buiten CHARACTER-strings was een weinig gebruikte functie in vintage Fortran, als deze al werd gebruikt.
VIF omvat een wiskundige bibliotheek met klassieke pakketten zoals BLAS, ARPACK, LAPACK en ODRPACK. Deze hoogwaardige pakketten worden tegenwoordig bijvoorbeeld gebruikt in SciPy, Mathematica, GNU Octave en MATLAB. Deze legacy-code voldoet aan de toenmalige Fortran-standaard en de destijds aanbevolen codeerpraktijken. Ik ga ervan uit dat mensen de eigenaardigheden van Fortran liever vermeden om porteerbare code te schrijven.
Hieronder kunt u de huidige brondistributie downloaden. Nogmaals, VIF is een experimentele niche-compiler. Wellicht geeft u de voorkeur aan een productie-compiler, zoals GNU Fortran.
|
Als u een echte vintage-ervaring wilt, kunt u de klassieke FORTRAN H-compiler gebruiken op MVS of VM/CMS.
Een aandachtspunt bij het vertalen van vintage code is dat verschillende machines vroeger verschillende woordlengtes hadden. Een REAL-waarde kon, afhankelijk van de hardware, een 32-bits, 36-bits of 64-bits woord innemen. Als u dus code voor een CRAY-1 wilt vertalen, moet u nagaan of u REAL moet converteren naar DOUBLE PRECISION. Porteerbare programma’s uit die tijd roepen routines zoals D1MACH aan voor details over een typeweergave. Het volgende eenvoudige fragment x1mach.f geeft machineparameters voor REAL*32 weer, analoog aan de functie D1MACH:
REAL*32 x1mach
DO k = 1, 5
print *, k, x1mach(k)
END DO
END
VIF kan een programma onmiddellijk uitvoeren zodra de compilatie is geslaagd, net als WATFOR of WATFIV, of zoals een JCL procedure van het type CLG onder MVS of z/OS. We kunnen het bovenstaande fragment met VIF als volgt uitvoeren, door optie -g op te geven:
$ vif -g x1mach.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
Stuur opmerkingen, vragen of bugmeldingen naar jmvdveer@algol68genie.nl; wij stellen uw feedback zeer op prijs.
Bronbestanden met kruisverwijzingen van de huidige VIF-versie zijn hier beschikbaar.