Q: What does IMPLICIT NONE mean?

A: Back in the 1950s, when Fortran was first developed, memory was very expensive, and because of this, a typical computer might have only a few KB of main memory. So, programmers wanted their Fortran programs to be as short as possible.

For this reason, the developers of the original Fortran language decided to make data declaration implicit. Instead of having to explicitly declare the type of a variable

INTEGER :: x

you could simply use it in your program, and the compiler would decide it was either an integer or a real number, based on the first letter of the variable name: if it started with I, J, K, L, M or N, it was assumed to be an integer, but if it started with any other letter, it was assumed to be a real.

Unfortunately, this feature can lead to all kinds of trouble, because it's a common mistake to mistype a character of a variable name. So, while you might mean one variable, you'd end up using another.

Here's an example:

% cat ruin.f90
  PROGRAM ruin
    INTEGER :: bankrupt = 1
    bankrpt = bankrupt - 1
    IF (bankrupt > 0) THEN
      PRINT *, 'Bankrupt!'
    ELSE
      PRINT *, 'Whew!'
    END IF
  END PROGRAM ruin
% f90 -o ruin ruin.f90
% ruin
 Bankrupt!

Notice that, in this program, we have a statement that says

    bankrpt = bankrupt - 1

The variable on the left hand side of the equals sign in this assignment statement is bankrpt, not bankrupt; that is, it's missing the u. So, what we want is for the value of bankrupt to change from 1 to 0, in which case our company won't go bankrupt. But because of the typo, that doesn't happen, and so we do go bankrupt.

Now, suppose we add into our program the IMPLICIT NONE statement.

% cat dontruin.f90
  PROGRAM dontruin
    IMPLICIT NONE
    INTEGER :: bankrupt = 1
    bankrpt = bankrupt - 1
    IF (bankrupt > 0) THEN
      PRINT *, 'Bankrupt!'
    ELSE
      PRINT *, 'Whew!'
    END IF
  END PROGRAM dontruin
% f90 -o dontruin dontruin.f90
f90: Error: dontruin.f90, line 4:
  This name does not have a type, and must have an explicit type.
    [BANKRPT]
        bankrpt = bankrupt - 1
--------^

This time, the compiler catches the typo, so we can fix our program and avert disaster.