One of this week’s opportunities to find humour in these dark days was the announcement that the US state of New Jersey despirately needed COBOL programmers. Of course, this was due to pandemic mass layoffs overwhelming the neglected state unemployment insurance scheme so this isn’t really that funny—but pickings are slim at present, and people take their amusement where they can.
I don’t have any experience with COBOL, alas, but it did remind me of the semi-obsolete language I’ve been meaning to look at for years: FORTRAN, or rather Fortran because I’m not quite yet ready to subject myself to anything older than Fortran90, when they changed the capitalisation.
Fortran was designed for numerical computation, which
is very much my programming jam. I usually encounter it
in (typically older) binary R packages: on Linux R has a
preference for downloading and compiling the source, and
if your system lacks the GNU Fortran compiler
gfortran) you may get caught out by this!
It’s certainly happened to me in the past, although I
will note that this has not been an issue with
I won’t pretend to have suddenly become an expert,
but I have played around a bit over the last few days.
My own idea of a “hello world” program is testing
primality, i.e. whether a number has divisors other than
1 or itself. I was obsessed with prime numbers as a kid,
particularly around the time when I learned to program
QBASIC on an old Windows 98SE, and
used to daydream about disproving the Riemann
hypothesis and cracking RSA encryption. Teenagers
have the strangest life plans.
With apologies for doubtless non-standard and inconsistent coding style, here is my code:
!This is file : prime ! Author = petra ! Started at: 06.04.20 ! Program prime Implicit None integer(kind = 16):: test real:: upper logical:: res character(100):: cmdtemp integer(4):: args, itarg = command_argument_count() args = 1 itarg do while (itarg .le. args) call get_command_argument(itarg, cmdtemp) read(cmdtemp, *)test = isPrime(test) res print "(i30': 'l1)", test, res = itarg+1 itarg end do contains Function isPrime (val) Implicit None logical:: isPrime integer(kind = 16):: val integer(kind = 16):: counter real:: upper if (val .le. 1) then = .false. isPrime return else if (val .eq. 2) then = .true. isPrime return else if (modulo(val, 2) .eq. 0) then = .false. isPrime return end if = sqrt(real(val)) upper = 3 counter do while (counter .le. upper) if (modulo(val, counter) .eq. 0) then = .false. isPrime return end if = counter+2 counter end do = .true. isPrime End Function isPrime End Program prime
This program (compiled with
gfortran prime.f90) takes a list of numbers
and outputs whether they are prime (
F). For example:
[petra@inoc fortran-scratchings]$ ./a.out 1 2 3 4 5 6 7 23456789 1: F 2: T 3: T 4: F 5: T 6: F 7: T 23456789: T
23456789 is one of my favourite numbers: it’s the largest easy to memorise prime I know. On the graphics calculator I had in highschool this would have taken a while, but with a vaguely modern computer and Fortran it’s as near to instant as I could hope.
I really wish I had a Fortran compiler and manual on my computer as a kid. I’m not sure how much I can really do with it now, but it’s certainly fun!