Skip to content

1.2 Basics

1. Characteristics of Fortran77

Fortran 77 is a significant version of the Fortran programming language, which introduced several features and improvements over its predecessor, Fortran 66. Here are the key characteristics of Fortran 77:

1.1 Fixed-Form Source Code

  • Fortran 77 uses fixed-form source code format, where specific columns in the code have particular meanings. For example, columns 1-5 are used for statement labels, column 6 for continuation characters, and columns 7-72 for code.

1.2 Implicit Typing

  • Variables starting with the letters I through N are implicitly integers, while all other variables are implicitly real numbers, unless explicitly declared otherwise. The IMPLICIT NONE statement can be used to disable implicit typing, forcing all variables to be explicitly declared.

1.3 Improved Control Structures

  • Fortran 77 introduced the IF-THEN-ELSE construct for more readable and flexible conditional branching.
  • The DO loop construct was enhanced, allowing more complex looping structures.

1.4 Data Types

  • Fortran 77 supports basic data types: INTEGER, REAL, DOUBLE PRECISION, COMPLEX, LOGICAL, and CHARACTER.
  • The CHARACTER data type was introduced, enabling better handling of strings.

1.5 Array Handling

  • Fortran 77 allows multi-dimensional arrays, enhancing the language’s capability to handle mathematical and scientific computations involving matrices and tensors.

1.6 COMMON Blocks

  • COMMON blocks in Fortran 77 allow sharing of variables between program units (such as the main program and subroutines). This feature enables global variables and facilitates modular programming.

1.7 Intrinsic Functions

  • Fortran 77 includes a rich set of intrinsic functions for mathematical operations, character manipulation, and logical operations. Examples include SIN, COS, LOG, EXP, SQRT, ABS, and LEN.

1.8 Portability

  • Fortran 77 code is highly portable across different computing platforms, which was a significant improvement over Fortran 66. This standardization helped in the widespread adoption of the language in scientific computing.

1.9 Formatted and Unformatted I/O

  • Fortran 77 provides comprehensive input/output (I/O) capabilities, including both formatted and unformatted I/O operations. The READ, WRITE, and FORMAT statements allow detailed control over data input and output.

1.10 Subroutines and Functions

  • Fortran 77 supports the use of subroutines and functions to promote code reuse and modularity. Subroutines are defined using the SUBROUTINE keyword, and functions using the FUNCTION keyword.

1.11 Example Code

Here is a simple example of a Fortran 77 program that demonstrates some of its features:

PROGRAM HelloWorld
PRINT *, 'Hello, World!'
END

Example with Control Structures and Arrays

PROGRAM ArrayExample
INTEGER I, N
PARAMETER (N=5)
REAL A(N), B(N)
! Initialize arrays
DO 10 I = 1, N
A(I) = I
B(I) = A(I) * A(I)
10 CONTINUE
! Print results
PRINT *, 'Array A:', A
PRINT *, 'Array B:', B
END

Explanation

  • The program defines two arrays, A and B, each of size N (which is set to 5).
  • It initializes the array A with values 1 through 5 and computes the square of each element, storing the results in array B.
  • Finally, it prints the contents of both arrays.

2. Limitations

Fortran 77, while a significant advancement in the Fortran language, also has several downsides and limitations. Here are some of the key disadvantages:

2.1 Fixed-Form Source Code

  • Column Dependency: The fixed-form source code format is rigid and prone to errors. For example, specific columns have designated purposes, and accidental misalignment can lead to syntax errors.
  • Line Length: Code lines are limited to 72 characters, which can lead to cumbersome code formatting and the need for continuation lines.

2.2 Limited Modern Programming Constructs

  • No Dynamic Memory Allocation: Fortran 77 does not support dynamic memory allocation. All arrays and variables must have fixed sizes defined at compile time, which limits flexibility in handling data of varying sizes.
  • No Recursive Procedures: Fortran 77 does not support recursive procedures, which are essential for many modern algorithms and programming techniques.

2.3 Lack of Modular Programming Features

  • No Modules: Fortran 77 does not have modules, making it difficult to encapsulate and organize code. Instead, it relies heavily on COMMON blocks, which can lead to namespace pollution and make code maintenance challenging.
  • No Derived Types: The language does not support user-defined data types (derived types), limiting the ability to create complex data structures.

2.4 Primitive Error Handling

  • Fortran 77 has very basic error handling capabilities. There are no sophisticated mechanisms for catching and handling runtime errors, which can make debugging and developing robust applications more difficult.

2.5 Limited String Handling

  • String manipulation capabilities in Fortran 77 are quite limited compared to modern languages. The CHARACTER data type was introduced in Fortran 77, but string operations are still cumbersome and less powerful.

2.6 Verbosity and Readability

  • Fortran 77 code tends to be verbose, making it harder to read and write compared to more modern programming languages. The syntax can be less intuitive, especially for new programmers.

2.7 No Built-In Support for Parallelism

  • While Fortran is used extensively in high-performance computing, Fortran 77 does not have built-in support for parallel programming. Extensions like MPI and OpenMP must be used to achieve parallelism, which can add complexity.

2.8 Poor Standard Library Support

  • The standard library in Fortran 77 is minimal, offering limited built-in functions and utilities. This lack of extensive libraries can make it harder to perform common tasks without writing substantial amounts of code from scratch.

2.9 Maintenance and Portability Issues

  • Due to its age and the evolution of programming practices, maintaining and updating Fortran 77 code can be challenging. Porting legacy Fortran 77 code to more modern systems or integrating it with contemporary software can also be problematic.

2.10. Example Illustrating Some Downsides

Here is a simple example highlighting the fixed-form layout and the limitations in handling dynamic arrays:

PROGRAM Example
INTEGER A(10), B(10)
INTEGER I
DO 10 I = 1, 10
A(I) = I
B(I) = A(I) * A(I)
10 CONTINUE
PRINT *, 'Array A:', A
PRINT *, 'Array B:', B
END

Downsides Illustrated

  • Fixed-Form Layout: The strict column-based format and the need for continuation lines can make the code less readable and more error-prone.
  • No Dynamic Arrays: The arrays A and B must have fixed sizes defined at compile time, limiting flexibility.

3. GOTO Statement

The GOTO statement in Fortran 77, as in many programming languages, is a control flow statement that causes the program to jump to a specified label. It is often considered a controversial feature. Here are the pros and cons of using the GOTO statement in Fortran 77:

3.1 Pros of Using GOTO

  1. Simplicity:

    • Fortran 77 does not have some of the more advanced control structures found in modern languages. In certain simple scenarios, using GOTO can make the code straightforward and easy to write.
  2. Compatibility:

    • Since Fortran 77 and its predecessors used GOTO extensively, older codebases often rely on it. Understanding and maintaining such code may require familiarity with GOTO.
  3. Fine Control:

    • In certain low-level programming scenarios, GOTO can provide fine-grained control over the flow of execution that might be cumbersome to achieve with higher-level constructs.

3.2 Cons of Using GOTO

  1. Readability and Maintainability:

    • GOTO can make the code hard to read and understand, as it creates non-linear flow. This is often referred to as “spaghetti code.”
    • Code with many GOTO statements can be challenging to debug and maintain, especially in larger programs.
  2. Structured Programming:

    • Structured programming principles advocate for control structures like loops (DO), conditionals (IF-THEN-ELSE), and subroutine calls to improve code readability and maintainability. Excessive use of GOTO undermines these principles.
  3. Error-Prone:

    • The use of GOTO can lead to complex and error-prone code, making it easier to introduce bugs, such as infinite loops or jumping to incorrect labels.

3.3 Example of GOTO Usage

Here’s a simple example of using GOTO in Fortran 77:

PROGRAM GotoExample
INTEGER I
I = 1
10 IF (I .GT. 10) GOTO 20
PRINT *, 'I =', I
I = I + 1
GOTO 10
20 PRINT *, 'Loop finished.'
END

3.4 Analysis

  • Readability: The above example is relatively simple, but readability decreases with more complex code involving multiple GOTO statements and labels.
  • Structured Alternative: The same logic can be achieved more readably using a DO loop:
PROGRAM DoLoopExample
INTEGER I
DO 10 I = 1, 10
PRINT *, 'I =', I
10 CONTINUE
PRINT *, 'Loop finished.'
END

Using GOTO in Fortran 77 is generally discouraged except in cases where it simplifies the code or is necessary for compatibility with legacy code. The preference is to use structured programming constructs (like DO loops and IF-THEN-ELSE statements) to improve code readability, maintainability, and reliability. However, understanding GOTO is essential for maintaining and understanding legacy Fortran code.