2.3 Fortran IV

«O defeito mais óbvio no FORTRAN II para muitos de seus usuários era o tempo gasto na compilação. Embora as instalações do FORTRAN II permitissem a compilação separada de sub-rotinas e, assim, eliminassem a necessidade de recompilar um programa inteiro a cada etapa da depuração, o tempo de compilação era longo e, durante a depuração, o tempo considerável gasto na otimização era desperdiçado. Sugeri repetidamente aos responsáveis ​​do FORTRAN que agora eles deveriam desenvolver um compilador e/ou interpretador rápido, sem nenhuma otimização para uso durante a depuração e para trabalhos de curta duração. Infelizmente, os desenvolvedores do FORTRAN IV pensaram que poderiam ter o melhor dos dois mundos em um único compilador, que era rápido e produzia código otimizado. Não consegui convencê-los de que dois compiladores teriam sido muito melhores do que o compromisso que se tornou o compilador original do FORTRAN IV. O último não foi tão rápido quanto os compiladores posteriores, como WATFOR [Cress, Dirksen e Graham 1970], nem produziu um código tão bom quanto o FORTRAN II. (Para mais discussões sobre desenvolvimentos posteriores com o FORTRAN, consulte [Backus e Heising 1964].)» (John Backus, The History of Fortran I, II, and III, IBM Research Laboratory, San Jose, California)

A IBM começou o desenvolvimento do Fortran IV em 1961 para atender as demandas de seus clientes.

Resumo das melhorias com relação ao Fortran II:

  • O tipo de dado pode ser explicitado na declaração da variável;
  • As variáveis podem ser declaradas como sendo dos tipos DOUBLE PRECISION, LOGICAL, ou COMPLEX;
  • O tipo de dado LOGICAL pode assumir os valores .TRUE. ou .FALSE.;
  • Podem ser usados IF lógicos;
  • As matrizes podem ser dimensionadas na declaração da variável, não sendo mais necessária uma declaração DIMENSION em separado;
  • As cadeias de caracteres na declaração FORMAT podem estar envoltas por apóstrofes, não sendo mais necessário contar os caracteres;
  • As declarações de entrada e saída READ, PRINT, PUNCH, READ INPUT TAPE e WRITE OUTPUT TAPE foram substituídas pelas declarações READ(unidade, formato) e WRITE(unidade, formato);

Extensões da IBM:

  • Tipos de dados REAL e DOUBLE PRECISION podendo ser referidos como REAL*4 e REAL*8;
  • Tipo de dado COMPLEX*16 permitindo que tanto a parte real quanto a imaginária de um número complexo sejam de precisão dupla;
  • Declaração IMPLICIT, que altera a regra do tipo de dado da variável baseado na primeira letra.

Exemplo:

C     NÚMEROS PRIMOS DE 5 A 40
      INTEGER NUMERO, RESTO, DIV
      LOGICAL TEMDIV
      DO 20 NUMERO = 5,40,2
      TEMDIV = .FALSE.
      DIV = 1
    5 DIV = DIV + 2
      RESTO = NUMERO - ((NUMERO / DIV) * DIV)
      IF (RESTO .NE. 0) GO TO 10
      TEMDIV = .TRUE.
      GO TO 15
   10 IF (DIV .LT. (NUMERO/2)) GO TO 5
   15 IF (TEMDIV) GO TO 20
      WRITE(*, 105) NUMERO
   20 CONTINUE
      STOP
  105 FORMAT(I4, 6H PRIMO )
      END

Makefile:

num_primos: num_primos.f
	gfortran -std=legacy num_primos.f -o num_primos
clean:
	rm num_primos

Execução:

   5 PRIMO
   7 PRIMO
  11 PRIMO
  13 PRIMO
  17 PRIMO
  19 PRIMO
  23 PRIMO
  29 PRIMO
  31 PRIMO
  37 PRIMO

Referências: