fortran66のブログ

fortran について書きます。

【メモ帳】FORTRAN で書かれた BASIC 処理系 独米日

ドイツ、アメリカ 

先日、The Cyber Vanguard さんの所に、『FOSBIC: BASIC compiler in FORTRAN IV.』というのがあっておやと思ったのですが、Virtually Fun さんの所にも『FOSBIC1 compiler』の記事が上がっていることに気づきました。こちらでは、実際にこの処理系を MS-FORTRAN POWERSTATION for NT で動かして、Mandelbrot 図形を描かせておられました。

GitHub にあるソースの能書きを読むと、「This is the FOSBIC1 compiler developed at the University of Gießen, Germany in the late 70s for the CDC 3300 batch system.」とあります。Virtually Fun のコメント欄によると、経済学部の先生によるもののようです。

cyber.dabamos.de

virtuallyfun.com

github.com

さらに能書きによれば、この処理系は元々は米国人が書いたようで、「it is a modified version of a BASIC compiler named UWBIC from University of Washington, developed by William Sharp in 1967, for their IBM 7094.」とあります。

日本

ちなみに、日本では戸川隼人著のサイエンス社のテキストの中に、BASIC 処理系が載っています。

こちらの処理系も FORTRAN66 水準で書かれていますが、FORTRAN66 は文字型変数がないので整数型変数などに押し込んで文字処理をしなければならず、今時の言語でやるより相当な工夫が必要と思われます。なおこのサイエンス社の演習書には FORTRAN77 版もあって、こちらにも BASIC 処理系の作成があります。FORTRAN77 には文字型変数もあり文字処理関数も入っているので、大分楽になったのではないかと思います。

www.saiensu.co.jp

5 総合演習−BASICを作る

5-1 基本設計

5-1-1 BASIC概説

5-1-2 仕様

5-1-3 処理手順の概要

5-2 小道具[例題:コード変換 空白の読み飛ばし 整数値の10進→2進変換 実数型データの変換 英字名の変換 文の種類の識別 記憶場所の割当て 行先さがし 行番号の整列 異常終了処理]

5-3 メインプログラム

5-3-1 前処理[例題:前処理]

5-3-2 実行[例題:実行部分]

5-3-3 算術式の処理[例題:算術式の値の計算]

5-3-4 コマンドの処理[例題:コマンドの処理]

ENCODE/DECODE

FORTRAN66 で文字列を扱うには、ENCODE/DECODE 命令により、ホレリス文字列を整数変数または実数変数に入れる必要があります。これはほぼ内部ファイルのようなものです。FORTRAN77 で ENCODE/DECODE は廃止され、内部ファイルを使うように促されました。

現在の処理系では intel fortran には ENCODE/DECODE 命令が残ってますが、gfortran にはありません。これは intel fortran は FORTRAN66 から綿々と続く DEC Fortran の流れを汲んでいるのに対して、gfortran は g77/f2c の流れを汲んでおり、66 水準への対応が無かったためと思われます。g77 は f2c を元にしていますが、f2c は 1980 年代末からの全然新しいものです。

www.netlib.org

         data a/4H3.14/
         decode(4,'(f4.2)', a) x
         print *, x
         ix = 100 * x
         encode(4,'(i4)', n) ix
         print *, n
         print '(a)', n
         end
[x] M1:~/fortran% cat enc66.f90
      data a/4H3.14/ 
      decode(4,'(f4.2)', a) x
      print *, x
      ix = 100 * x
      encode(4,'(i4)', n) ix
      print *, n
      print '(a)', n
      end
[x] M1:~/fortran% ifort enc66.f90
[x] M1:~/fortran% ./a.out        
   3.140000    
   875639584
 314