C vs. FORTRAN (was C official DOD langauge?)
Charles Noren
noren at dinl.uucp
Thu Jun 7 03:26:27 AEST 1990
I've been getting additional e-mail about a C vs. FORTRAN
comparison list. I may have betrayed a language bias which
I don't want to do, additionally I've been making unfair
comparisons of old FORTRAN compilers to modern C compilers.
The risk of comparing languages is the tendency to start
religious holy wars in support of one language over another.
This certainly was not the intent of the orignal asker nor do
I want to do that. What I'm trying to do is stick my neck out
with raising a few ideas and solicit comment from the network
to help the orignal poster to make an intelligent decision of
whether or not move from FORTRAN to C. I would say the answer
is not obvious to me (I welcome e-mail flames and will summarize
to my best the important points -- as you can probably tell, I'm
no compiler guru). Also, take whatever I say with a grain of
salt. I have a bias towards C and the comments may reflect this
(and, I should note, my bias does not have entirely rational
causes).
This discussion probably does not fit the charter of comp.lang.c
so I'm directing follow-ups to comp.lang.misc.
I was an old user of FORTRAN, FORTRAN IV in fact. Modern FORTRANs
have evolved over time and thus some of the things I listed as C
advantages are also found in modern FORTRAN compilers. These, I'm
told, include:
Modern FORTRAN enhancements:
1. Data Structures. FORTRAN IV did not have them, modern
FORTRAN compilers do.
2. Cleaner code structures. Apparently the newer FORTRAN
compilers have modern code structures. As one person
noted, his FORTRAN code is essentially free of statement
labels and indented for readability.
3. Recursive subroutine calls. Most, if not all, modern
FORTRAN compilers can call subroutines recursively.
This is many a feature of the underlying implementation
of how arguments are passed to subroutines/functions.
(Question to langauge definition guru's: Are recursive
and reentrancy issues specified in the formal langauge
specifications of C and FORTRAN?)
4. Free form code. Modern FORTRAN compilers allow for free
form entry of code, with similar restrictions that apply
to C code with its pre-processor statements (e.g., #define).
And now a C advantage list.
C Advantages over FORTRAN:
1. Data Pointer Types. FORTRAN apparently still does not
have a pointer type. Underlying argument passing
mechanisms in FORTRAN subroutines probably use pointers,
but the language definition does not have a data pointer
type. Data pointers conveniently allow referrences to
physical memory (useful for microprocessor controllers,
perhaps not useful for virtual memory machines) and the
"more natural" creation and maintenance of some data
structures such as linked lists.
2. Function Pointer Types. One person commented that it is
possible to pass a single function explicitly in FORTRAN,
but a "table" of pointers to functions cannot be created
created in FORTRAN.
3. Ability to have variable argument lists. As some have
pointed out, this feature in C is somewhat awkward
(this is in the eye of the beholder) and thus not
considered by some as a major advantage.
4. Macros. In most C implementations, macros are expanded
in seperate program from the actual C compiler, known as
the C Pre-Processor (cpp). One person suggested that
FORTRAN code could be run through cpp an thus have macros.
I have not tried this, but it is an interesting idea.
5. Dynamic memory allocation. f77 does not have this, but
apparently f9x will have dynamic memory allocation.
FORTRAN Advantages over C:
1. Lack of pointer types. Pointers in C (and how their
relation to and distiction from arrays) often are a
stumbling block to new C programmers (and sometimes
old C programmers).
2. FORTRAN environments probably have more mature math
libraries. Some C programmers pointed out that they
link to some FORTRAN math libraries.
3. Fortran compilers have been around longer and are
generally better at optimization than C compilers.
4. The Fortran language is designed so that compilers
can make useful assumptions for code optimization,
which cannot be made for C compilers. Two examples:
a. Aliasing is not permitted in Fortran.
For instance, if you declare two array arguments in
a Fortran subroutine, those arguments cannot be the
same array -- if they are read and write arguments.
This permits the subroutine to be compiled
with very fast vector instructions (on machines that
support vectorization such as Crays).
(One person mentioned that there are are good ways
for compilers to get around the aliasing problem --
so this is not such a disadvantage to C. I must
say that I plead ignorance here.)
(Question: It's been so long since I've used
FORTRAN, but how does the EQUIVELANCE statement
affect or not affect aliasing?)
b. The C for statement does not have a well defined
"control variable" and thus cannot be automatically
vectorized.
5. *Natural* array subscripts in C must start with zero,
which for some is counter intuative (of course the C
programmer might ask what is so intuative about starting
with 1 ;-)). One person mentioned this can cause
optimization problems by defeating alias optimizations in
C, again I don't know if this is the case. Modern FORTRAN
compilers, I'm told, allow for subscripts to start at
any value (including negative integer values). Several
people reminded my that C arrays do not have to be zero
based. With macros and pointers one could use any integer
value in an array reference. However, it would seem that
FORTRAN, with its way specifying a starting index (if it
truely is part of "standard" FORTRAN and not just a vendor
language enhancement) has the advantage here.
6. C does not permit multidimensional array parameters of
different sizes. C is certainly powerful enough the
work around this, but it does not have the built-in
stuff that FORTRAN has (with its possible built-in
optimization).
7. C does not have the COMPLEX data type. Of course
through data structures this kind of thing could be
implemented in C. However, it is built-in in FORTRAN,
with libraries already built to support it, and
probably built-in optimization.
8. C has somewhat confusing reserved word adjectives
for storage classes, which also vary in meaning depending
on the context. A classic example is the C reserved
word "static". It has an aspect of meaning "unchanged"
in that variables declared as such inside functions
retain there last value from function exit and the
next invocation of the function. "static" also has the
meaning of global only the to module file the "static"
function or "static global" data resides (in other words
its local to that file).
9. Dynamic memory. Due to the use of pointers in C,
dynamic memory is used often in C. How and when to use
dynamic memory (and which are the best dynamic memory
functions) can cause debate with C programmers. With the
use of dynamic memory come subtle bugs (memory leaks) which
can be hard to trace.
I have certainly missed some points and corrupted others.
Flames and comments are welcome.
Thanks to the following people whose comments I've
incorporated (but don't blame them for my errors):
o Andrew Mullhaupt (mailrus!uunet!Morgan.COM!amull)
o a person from Microsoft (whose name I could not locate in
the mail header).
o John Sahr (thalatta.com!calvin!johns at cs.utexas.edu)
o another person I could not identify from the mail header.
o Roger Cole (cole at luke.lanl.gov).
o Dan Bernstein (brnstnd at stealth.acf.nyu.edu).
--
Chuck Noren
NET: ncar!dinl!noren
US-MAIL: Martin Marietta I&CS, MS XL8058, P.O. Box 1260,
Denver, CO 80201-1260
Phone: (303) 971-7930
More information about the Comp.lang.c
mailing list