1-2 COMPARISON OF FORTRAN AND C ******************************** (Thanks to Craig Burley for the excellent comments) The world of computing sometimes adopts silly fashions, too often good companies and products fell from grace, and lesser ones gain the upper hand. Some new examples for the uselessness of quality are the MS empire and Compaq buying Digital Equipment Corporation. It seems that the fashion winds (in the US, in the UK it seems to be different) blows now in the numerical computing world towards C and C++. This strange trend is probably driven by people who are not experienced numerical programmers. See the article by Dr. John Prentice: Fortran 90 as a language of choice for science students and the one by Jerrold Wagener: Fortran 90 and Computational Science Fortran still predominates in the numerical computing area, but it seems to lose ground, the following points may help you make up your mind. (Partly adapted from the Fortran FAQ) a) FORTRAN tends to meet some of the needs of scientists better. Most notably, it has built in support for: o Variable-dimension array arguments in subroutines, this feature makes it possible to write general purpose routines without explicitly specifying array dimensions passed to them. Standard C lacks this important feature (some compilers like gcc have it as non-standard extension) and the workarounds are very cumbersome. This feature by itself is sufficient to prefer Fortran over C in numerical computing. o A rich set of useful generic-precision intrinsic functions. Such functions can be highly optimized (written in assembly language with optimized cache utilization), and they make programs standard at a higher level (and more portable). o Builtin complex arithmetic (arithmetic involving complex numbers represented as having real and imaginary components). o Array index-ranges may start and end at an arbitrary integer, the C convention of [0,N-1] is usually inconvenient. o Better I/O routines, e.g. the implied do facility gives flexibility that C's standard library can't match. The Fortran compiler directly handles the more complex syntax involved, and as such syntax can't be easily reduced to argument passing form, C can't implement it efficiently. o A compiler-supported infix exponentiation operator which is generic with respect to both precision and type, AND which is generally handled very efficiently, including the commonly occurring special case floating-point**small-integer. o Fortran 90 supports an array notation that allows operations on array sections, and using vector indices. The new intrinsic functions allow very sophisticated array manipulations. The new array features are suitable for parallel processing. o Fortran 90 supports automatic selection of numeric data types having a specified precision and range, and makes Fortran programs even more portable. o Fortran extensions for parallel programming are standardized by the High Performance Fortran (HPF) consortium. Fortran 90 supports useful features of C (column independent code, pointers, dynamic memory allocation, etc) and C++ (operator overloading, primitive objects). b) The design of FORTRAN allows maximal speed of execution: o FORTRAN 77 lacks explicit pointers, which is one reason that it is more amenable to automatic code optimization. This is very important for high-performance computing. Fortran 90 allows explicit pointers restricted to point only to variables declared with the "target" attribute, thus facilitating automatic optimizations. o Fortran was designed to permit static storage allocation, saving the time spent on creating and destroying activation records on the stack every procedure call/return. Recursive procedures are impossible with static allocation, but can be simulated efficiently when needed (very rare). o Fortran implementations may pass all variables by reference, the fastest method. o Fortran disallows aliasing of arguments in procedure-call statements (CALL statements and FUNCTION references), all passed argument lists must have distinct entries. Fortran disallows also aliasing between COMMON (global) variables and dummy arguments. These restrictions allows better compiler optimizations. c) There is a vast body of existing FORTRAN code (much of which is publicly available and of high quality). Numerical codes are particularly difficult to port, scientific establishments usually do not have large otherwise idle programming staffs, etc. so massive recoding into any new language is typically resisted quite strongly. d) FORTRAN 77 tends to be easier for non-experts to learn than C, because its 'mental model of the computer' is much simpler. For example, in FORTRAN 77 the programmer can generally avoid learning about pointers and memory addresses, while these are essential in C. More generally, in FORTRAN 77 the difference between (C notation) x, &x, and often even *x is basically hidden, while in C it's exposed. Consequently, FORTRAN 77 is a much simpler language for people who are not experts at computer internals. Because of this relative simplicity, for simple programming tasks which fall within its domain, (say writing a simple least-squares fitting routine), FORTRAN 77 generally requires much less computer science knowledge of the programmer than C does, and is thus much easier to use. Fortran 90 changes the picture somewhat, the new language is very rich and complex, but you don't have to use or even know about all this complexity. e) The C standard requires only a basic double-precision mathematical library, and this is often what you get. The FORTRAN standard, on the other hand, requires single & double precision math, many vendors add quad-precision (long double, REAL*16) and provide serious math support. Single-precision calculations may be faster than double-precision calculation even on machines where the individual machine instructions takes about the same time because single-precision data is smaller and so there are less 'memory cache misses'. Quad-precision (long double) calculations are sometimes necessary to minimize roundoff errors. If you have only double-precision mathematical routines, the basic mathematical primitives will take up unnecessary CPU time when used in single-precision calculations and will be inexact if used with 'long double'. f) FORTRAN is designed to make numerical computation easy, robust and well-defined: 1) The order of evaluation of arithmetical expressions is defined precisely, and can be controlled with parentheses. 2) The implicit type declaration feature saves time/typing (however it makes your program vulnerable to annoying and hard to detect bugs). 3) Case insensitivity eliminates bugs due to 'miscased' identifiers. 4) The lack of reserved words in the language gives the programmer complete freedom to choose identifiers. 5) The one statement per line principle (of course continuation lines are allowed with a special syntax) makes programs more robust. 6) Added blanks (space characters) are insignificant (except in character constants) this also contributes to the robustness of FORTRAN programs. 7) Linking with the mathematical library doesn't require any compiler option (in C you to have to use "-lm"). g) Last but not least, FORTRAN compilers usually emit much better diagnostic messages. In summary, we can say that the difference between Fortran and C, is the difference between a language designed for numerical computations, and a language designed for other purposes (system programming). +---------------------------------------------+ | | | SUMMARY OF FORTRAN ADVANTAGES | | ============================= | | a) Scientifically oriented | | b) Better optimized code | | c) A lot of existing code | | d) Easier to learn | | e) More efficient mathematics | | f) Easier to use and more robust | | g) Better diagnostics | | | +---------------------------------------------+Return to contents page