fortran66のブログ

fortran について書きます。

DEC Visual Fortran 5.0 (DVF5)

DEC社 の Windows 95/NT4 対応の Fortran90 コンパイラ。Microsoft は Fortran 言語開発から撤退するにあたり、引継ぎを DEC に任せました。バージョンが5から始まるのは、MS-FPS4 の後を継いだためだと思われます。MS-FPS4 からは優待割引の upgrade path が用意されていました。

当時の DEC はαプロセッサのワークステーション(WS)を出しており、ダウンサイジングでミニコン事業がお先真っ暗ながらまだ元気がありました。売りは、 DEC のブランド力と Fortran コンパイラのフロントエンド部分を VAX や α-WS 用と共通化したことによる信頼性でした。MS-FPS4 とは全くの独立開発なコンパイラですと宣伝していました。(当時 α-WS を使うようになっていたので、フロントエンドの共通化は確かに有難かったです。)

バグ対応のパッチも定期的に出て最終的に 5.0D まで update されました。現在 DEC 社が消滅した関係で、パッチは公式には配られていませんが、DVF-X86-50D でググると引っかかります。Newsletter も充実していてサポートの安心感がありました。

ただトレースバック機能がなかったため、実行時エラーが起きた時のデバッグが面倒でした。

  • 実行例 Sort二題

Shell sort と Quick sort でソートを行います。

VMWare NT4 上にて

MODULE m_sort
IMPLICIT NONE
CONTAINS
!---------------------------------------
FUNCTION shell(x) RESULT(res) ! Shell Sort
REAL, INTENT(IN) :: x(:)
REAL :: res( SIZE(x) ), tmp
INTEGER :: i, j, igap
res = x
igap = SIZE(x)
DO WHILE(igap > 0)
 DO i = igap, SIZE(x)
  DO j = i - igap, 1, -igap
   IF ( res(j) < res(j + igap) ) THEN
    tmp           = res(j)
    res(j)        = res(j + igap)
    res(j + igap) = tmp
   ELSE
    EXIT
   END IF
  END DO
 END DO 
 igap = igap / 2
END DO
RETURN
END FUNCTION shell
!---------------------------------------
RECURSIVE FUNCTION qsort(x) RESULT(res) ! Quick Sort
REAL, INTENT(IN) :: x(:)
REAL :: res( SIZE(x) )
IF ( SIZE(x) > 1 ) THEN
 res = (/ qsort(PACK( x(2:), x(2:) > x(1) )), x(1), qsort(PACK( x(2:), x(2:) <= x(1) )) /) 
ELSE
 res = x
END IF
RETURN
END FUNCTION qsort
!---------------------------------------
END MODULE m_sort
!===========================================
PROGRAM test
USE m_sort
IMPLICIT NONE
REAL :: x(10000)
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(x)
PRINT *, shell(x) - qsort(x)
STOP
END PROGRAM test

追記:H22-2-24 Shell SortでIF-THEN-ELSEのELSE節が抜け落ちていたので訂正しました。



Version 6 用だった気もしますが・・