4 ms·
I have a buddy at US Fish and Wildlife where they do river flow modeling with Fortran routines from the seventies formerly compiled on Windows machines. He was
by theophrastus 10y ago
I have a buddy at US Fish and Wildlife where they do river flow modeling with Fortran routines from the seventies formerly compiled on Windows machines. He was finding it increasingly difficult to get his all-powerful shadowy IT division to install a compliant MS Fortran compiler, and linux (somehow deemed governmentally untenable?) was out of the question. So i helped him get his ~2000 Fortran lines into C/C++. woowee... but did i see some hairy spaghetti code. A favorite maneuver was to jump out of a loop, change the loop counter on a subroutine branch, and jump back into the middle of the loop.
- hughw 10y agoChange the loop counter? That's supposed to be impossible in Fortran, isn't it? Maybe that's a language extension?
- theophrastus 10y agoThis was from code originally from about 1978ish, which compiled on a Microsoft Fortran compiler from the 2000s. It looked something like (without indents): DO I=1,10000 ... IF (QQQ .LT. RIX70) THEN CALL IXNARF( I, J, R1, R7, XL23 ) GOTO 23 ... END IF 111 CONTINUE ... END IXNARF could change 'I' (because Fortran 77 passed arguments by reference not value) and sometime after line (er... "card") 23 it might jump back into the loop at 111. oh and there was like three comments in the whole several thousand lines, including my favorite at the top of one of the main loops: C CHUGGA CHUGGA CHUGGA
- sevenless 10y agoI remember you could change the value of 3 in Fortran 77. Then there was the proposal for a Fortran COME FROM statement. http://www.fortran.com/fortran/come_from.html http://www.fortran.com/fortran/come_from.html
- semi-extrinsic 10y agoI believe Intercal implements the COME FROM statement.
- sun_n_surf 10y ago`C CHUGGA CHUGGA CHUGGA` I laughed way harder at this that it warranted.
- sampo 10y ago> Change the loop counter? That's supposed to be impossible in Fortran, isn't it? It is impossible inside the loop, even in F77. But if a global variable is used as a loop counter, and the variable is altered in a subroutine, then the code altering the variable is not inside the loop. At least not in the eyes of the Fortran compiler. $ cat test.f08 program test integer i do i = 1,3 call sub print *,i end do contains subroutine sub i = 3 end subroutine sub end program test $ gfortran --std=f2008 test.f08 $ ./a.out 3
- greglindahl 10y ago... just because it does that in gfortran doesn't mean it's standard-conforming code.
- ams6110 10y agoWhat is the "standard" fortran compiler for scientific computing? Do a lot of people use gfortran? Or something commercial?
- greglindahl 10y agoThere is no "standard" compiler. There is a Fortran standard, and there are standard-conforming compilers and standard-conforming programs. There are popular compilers, like gfortran and the Intel compiler. My point had nothing to do with popularity. My point is that non-standard-conforming programs can have anything happen when they execute, including starting World War III (see https://www.google.com/search?q=fortran+"start+world+war" https://www.google.com/search?q=fortran+"start+world+war"), and showing output from one compiler doesn't prove anything.
- sampo 10y ago> What is the "standard" fortran compiler for scientific computing? Not so long ago, supercomputers typically had Portland Group, Cray and Pathscale compilers installed. Nowadays it's pretty much Intel and gfortran.
- hughw 10y agoTo elaborate: When people mention that supercomputing relies on Fortran code because it runs faster, that's primarily because the compiler knows the program can't modify a loop counter. So an optimizer can shovel off big arrays to array processors (1970s), GPUs (now), registers, etc, and do parallel or superscalar computation. The FOR loop become a hint that tells the compiler it can take extraordinary measures on the nested instructions. You could do the same thing in C if you use compiler directives, or in other languages like Pascal, but there's a critical mass of Fortran code, so that's where vendors put the effort.
- fusiongyro 10y agoAliasing also complicates matters in C.
- jes 10y agoIt's been many years, but I seem to remember porting the NCAR Graphics Package written in FORTRAN IV to FORTRAN 77 on a Data General MV series box. If memory serves, they had a trick to create simulated pointers, by declaring a one element array somewhere in memory, and then indexing way outside of its bounds in order to point into other areas of memory. I don't remember the details, but I seem to remember there was a statement ("EQUIVALENCE"?) that facilitated this magic.
- walshemj 10y agoWhy was there such an issue I have to ask? Intel do Fortran compilers as do many other suppliers.