This comparison of FORTRAN and C eloquently exposes deficiencies in the original C language. Happily some of them have been redressed.
I speak hardly any FORTRAN so I must rely on the descriptions in the document. I may have misinterpreted them.
A killer feature of FORTRAN. C90 workarounds are terrible. Fortunately, C99 rescues us:
void vector_add(int n, int x[n], int a[n], int b[n]) {
for(int i = 0; i < n; i++) x[i] = a[i] + b[i];
}
If the dimension of the vectors should be last:
void vector_add(int n; int x[n], int a[n], int b[n], int n) {
for(int i = 0; i < n; i++) x[i] = a[i] + b[i];
}
This feature is also a GNU C extension.
The C99 committee listened to FORTRAN
programmers and introduced <tgmath.h>, a type-generic edition
of <math.h>. With this
header, we no longer have to choose wisely from log, logf,
logl, … We simply write
log.
I hate this limitation of C. Luckily, most of the time it doesn’t bother me.
GNU C nested functions seem at least as powerful, though it is a shame there is no notation for anonymous functions. But yes, standard C is lacking here.
I’m jealous of this feature, though I can tolerate
workarounds. Observe we need more than exp, expf, expl: we also require a routine
tuned for the case when the base is a float and the exponent
is an integer.
Pointers can hamper compiler optimization, but they can
also help. Hopefully, the restrict keyword of C99 will alleviate the
thornier problems with explicit pointers.
Except for inner loops, the savings are slight. However, C programmers should be aware that some situations call for replacing dynamic allocation with static allocation.
The C99 restrict feature
levels the playing field in theory, but FORTRAN might have
the upper hand because all pointers are restricted by
default, and FORTRAN programmers are more conscious of the
difference between restricted and explicit pointers.
Another feature that was at last addressed with C99. Also, GNU C supports 80-bit and 128-bit floating point types.
This is indeed confusing for beginners. The size 1 array trick can take some of the pain away, but ultimately a C programmer must acquire familiarity with pointers and memory addresses.
I would have also mentioned x[]. This is perhaps even more perplexing,
as its meaning is context-dependent. I wonder if this is
necessary for maximum performance. Would C be less efficient
with syntactic separation of arrays and pointers?
The documents lists other FORTRAN advantages, but I found these less compelling. In fact, some seem like FORTRAN disadvantages, as I appreciate case sensitivity, reserved words, recursion, and a smaller standard library.
I don’t understand why being able to pass all variables by reference is touted as a benefit. Why would it generate more efficient assembly than passing pointers around?