I’m familiar with the FORTRAN programming language. Heck, the first formal programming class I ever took was in 1978 in FOTRAN-IV on punched cards (don’t laugh kids, I’ll tell you to get off of my lawn if you do).
My next exposure to this venerable language was in college when I took my intro to CS course in the amazing, whizz bang “new” FORTRAN-77. In that class, I got done with my final so quickly that I spent the rest of the time using VT-100 escape codes on the VAX-11/784 to animate a beer truck across the terminal – again written in FORTRAN-77.
My final trip to FORTRAN-ville was a year later in an algorithm analysis class where we had to solve the “Towers of Hanoi” problem using recursion in both FORTRAN-77 and Pascal. The only catch – FORTRAN-77 didn’t support recursion so we had to build and manage our own stack.
OK. Fast forward to a couple of weeks ago. I had been reading about the BCHS (pronounced “beaches”) web programming stack (see this page for more details) which essentially is using C for your middle-tier code with CGI to write web applications. Now, regardless of whether or not this was serious or a joke (there seemed to be some debate on this on Reddit at the time), it got me thinking.
I remember CGI programming from the mid 90’s. Essentially the idea is that you have a chunk of code running on the web server (be it a script or compiled code, it really doesn’t matter) that kicks out HTML for its output. This allowed you (way, way, way back in the day) to access crazy things like relational databases and such to generate dynamic web pages and perform I/O with users.
I went down the path that said, “Hey. If you can do this with C, why not other languages?” I tried thinking what the most absurd, crazy, old-fashioned thing you could use and came with COBOL! Of course! That would be the funniest thing imaginable. Unfortunately, even doing a multi-year stint as a mainframe CICS programmer back in the 80’s and 90’s, I never used COBOL (I used PL/I for those who were curious – a pretty cool language for its time actually). This left me with FORTRAN – the language I knew from college and my brief punch-carded middle-school experience.
I did some sniffing around in the ports tree and discovered that OpenBSD has the GNU version of FORTRAN and it appears to be fairly recent. I did some further investigation and hit a wall – we only support FastCGI with our httpd web server and surely that wasn’t the same thing as straight up CGI that I remembered. After some searching, I confirmed my suspicion – FastCGI counts on a long-running process that the web server communicates with via sockets so that it doesn’t have the overhead of firing up and tearing down a process for each web transaction (boy they sure got smarter after the mid 90’s on this web stuff <grin>).
Not to be deterred, I decided to use the Apache web server from ports. Installing that was pretty simple via pkg_add and turning on CGI access wasn’t that tough either. All I had to do was uncomment the LoadModule call to the cgi_module, add a ScriptAlias to a virtual /cgi-bin directory (to contain my scripts outside of the htdocs tree) and add the ExecCGI option to my htdocs directory tree.
From there, I wrote a little shell script to test things and stuck it in my /var/www/cgi-bin directory as testcgi.cgi:
echo "Content-type text/plain"
echo "Hello world!"
I then invoked http://127.0.0.1/cgi-bin/testcgi.cgi and got the content “Hello world!” in my web browser. Note the blank line after the content-type header – if you miss that, you will suffer with 500 errors until your web searching fu teaches you the error of your ways.
Now for the fun, let’s use FORTRAN to write our CGI script. This should be crazy. I can’t wait for all of the uppercase characters and sequence/line numbers in my xterm under vim. I’ll fee like Indiana Jones in the Temple of Doom or something – a crazy technology archaeological expedition! Off to wikipedia and the web to re-learn this language enough to write out strings.
Well, the first thing I learned was we are much more polite in this millennium than we were in the last – we don’t shout the name of the language any more. FORTRAN (which stood for FORmula TRANslation) was now Fortran. Also, there were new standards that were established after the 1977 version I was used to. They had one in 1990, 1995, 2003 and 2008. Apparently there was even a 2015 version undergoing standards ratification. Huh. Looks like people still use this crazy old thing.
Some more research turned up an interesting fact – 15% of the world’s software is written in Fortran. I started looking at some of the language features that had been added over the years (more out of curiosity than for any other reason) and was shocked, nay horrified to find out that they added recursion. That would have made my data structures class in college a heck of a lot easier!
I kept looking and discovered other interesting things. For one, user defined types! We didn’t have those in FORTRAN-77. Also fun things like object oriented features, operator overloading, free-form formatting, case-insensitive intrinsic functions, generics…
Holy crap! I suddenly felt like the prototypical old guy at the high school reunion who discovered that the nerd you remembered had grown up to be attractive and successful. My world-view (the one that said all curly-brace languages were naturally superior to all others) was in jeopardy.
The only thing that could save me would be if our Fortran compiler on OpenBSD was too archaic for any of this funny-business to work. Then I would be justified again. My heart rate started to settle down to a more normal level at this thought.
I started sniffing around in the ports tree and discovered I already had most of what I needed installed. With the latest (in our tree at least) gcc installed, all I had to do was add the g95 compiler via pkg_add. I did so, and then tried invoking it with a simple ‘g95 –version’.
No joy. No binary with that name on my system. Huh? I did a ‘find / -name g95’ and still came up dry. I then did some web searching (notice I don’t say “googling” any more now that I’ve switched to duck duck go for my web searching) and discovered that, silly me, it isn’t called “g95” it is called “gfortran”. OK, I tried that ‘gfortran –version’.
No joy. No binary with THAT name on my system. WTF? After some more searching, I discovered that we call it “egfortran” on OpenBSD and all was right with the world.
I tried my little test program that I did before with a shell script, but this time did it in Fortran as testcgi.f and came up with:
print *, "Content-Type: text/plain"
print *, "Hello World!"
end program testcgi
When I used the command-line ‘egfortran testcgi.f’ I was expecting to run a.out and move on with my life. Nope! All sorts of crazy error messages.
After some more searching, I found the ‘-ffree-form’ compiler flag. It worked. (Edit: I later have learned that if you use a .f90 file suffix, the switch is not necessary.) I copied the resulting a.out binary into my /var/www/cgi-bin directory and renamed it to testcgi.cgi and went back to my browser. Drum roll please….
Fail! I got a 500 error. This really stymied me for quite some time until I picked up on a subtle thing. When I ran my binary from the command-line, I suddenly noticed that every line of text was preceded with a blank space in column 0 (or would that be column 1 in a Fortran world?). Anyhow, after some web searching I discovered that I could use a format specifier and all would be fine. This left me with the following, which worked:
print '(a)', "Content-Type: text/plain"
print '(a)', "Hello World!"
end program testcgi
So now that I have scratched that initial itch, I’m curious to see how far Fortran can take me with a more interesting problem to solve. Look for an upcoming post that will delve into that.