今後必要になるプログラム言語(昭和36年版)


迫りくる電子計算機の時代


https://www.ibm.com/blogs/systems/jp-ja/dream_ibm7100/ より図引用

時は昭和36年(西暦1961年)草木も眠る丑三つ時、闇夜にほの暗く橙色に光る真空管・・・を捨て去って、全身にトランジスタを埋め込んだ驚異の電子計算機 IBM7090(システム価格290万ドル、レンタル月額63,500ドル)。当時の日本の大卒初任給約44ドルで換算して1,444人分。

この千人力の電子頭脳を操る言葉は、FORTRAN II。これこそ今後の電子計算機時代に必要となる言語であろう。1ワード 36bit、1文字 6bit の BCD コードには小文字などはない。よって古代ローマ帝国時代のラテン語の如く全ては大文字で書かれる。(ASCII/EBCDIC の登場は二年後の昭和38年を待つ。)

IBM7090 エミュレータ

本体のエミュレータの Windows 用バイナリは以下のサイトにあります。適当に simhv39-0-exe.zip あたりを落として、その中の i7094.exe を次のコンパイラ等ソフトウェアのディレクトリに一緒に置きます。
http://simh.trailing-edge.com/sources/

コンパイラなどのソフトウェアは、以下のファイルに一式あります。
http://simh.trailing-edge.com/software.html
IBSYS for the IBM 7090/7094 (courtesy of Paul Pierce).

マニュアルの類は米ソフトウェア保存協会のサイトで見られます。
http://www.softwarepreservation.org/projects/FORTRAN/

FORTRAN II reference manulal
IBM 7090/7094 Programming Systems : FORTRAN II Programming. IBM Systems
Reference Library. Form C28-6054-5, April 1964, 51 pages. From bitsavers.org. PDF
http://archive.computerhistory.org/resources/text/Fortran/102653994.05.01.acc.pdf

Mandelbrot 図形

いつもの奴w
今時の Fortran 入門
https://qiita.com/cure_honey/items/795bd0e048ffeadc3e63

入力 ジョブカード

FORTRAN II は、倍精度・複素数が使えるのですが、変数の型として宣言するのではなく、第1カラムに、それぞれ D, I と書くことにより、その行の変数がそれぞれの型として演算されるようになっています。複素数の実部と虚部は、同名の2要素配列の各成分としてアクセスします。なお第1カラムが C または * の時は、FORTRAN66、FORTRAN77 と同じくコメントを表します。

FORTRAN で変数の型が宣言出来るようになったのは FORTRAN IV からです。FORTRAN I が開発された IBM 704 はハードウェアの浮動小数点ユニットを持った最初の機械だったので、FORTRAN I では固定小数点数と浮動小数点数を区別するため型が生まれました。ただ固定小数点数は整数としてのみ解釈が許されたので、結果的に整数型と実数型の二つが存在するようになりました。マニュアルでは INTEGER/REAL ではなく FIXED(POINT)/FLOAT(ING POINT)と呼び分けていることが多いです。

$JOB           MANDEL
$EXECUTE       FORTRAN
*      ID      MANDEL
*      LIST8
*      XEQ
C MANDELBROT SET
      DIMENSION MNDLBR(61, 31)
      DIMENSION C(2), Z(2)
      NX = 61
      NY = 31
      MAXIT = 91
      X0 = -2.0
      X1 =  2.0
      Y0 = -2.0
      Y1 =  2.0
      DO 10 IY = 1, NY
        Y = Y0 + (Y1 - Y0) * FLOATF(IY - 1) / FLOATF(NY - 1)
        DO 20 IX = 1, NX
          X = X0 + (X1 - X0) * FLOATF(IX - 1) / FLOATF(NX - 1)
I         Z = (0.0, 0.0)
          C(1) = X
          C(2) = Y
          NITER = 0
          DO 30 ITER = 1, MAXIT  
I           Z = Z * Z + C
            IF (Z(1)**2 + Z(2)**2 - 4.0) 30, 40, 40
   30       NITER = NITER + 1
   40     CONTINUE
   99     MNDLBR(IX, IY) = (NITER + 9) / 10
   20   CONTINUE  
   10 CONTINUE  
C   
C   
      DO 50 IY = 1, NY
        PRINT 100, (MNDLBR(IX, IY), IX = 1, NX) 
   50 CONTINUE
  100 FORMAT(1H ,61I1)     
      STOP
      END

実行

README_IBSYS.txt 中にあるように、

sim> do do_ibsys.txt <job_file_name> <output_file_name>

で実行できます。ここでは、

sim> do do_ibsys.txt mandel.job out

としました。但し、do_ibsys.txt 中の att lpt print.txt のコメントを外してラインプリンタを有効にしています。

; command file to run ibsys from within simh
; windows specific
; argument 1 = job file
; argument 2 = print file
;
! del punch.* print.* sysou1.* sys*.bin
! gendate > date.txt
! copy date.txt+%1+eof.dat+ibsys.ctl sysin.txt
! txt2bcda sysin 84
set cpu 7094
att -er cdr ibsys.ctl
att cdp punch.txt
att lpt print.txt
att -ef mta1 p7b asys1.bin
att -ef mta2 p7b asys8.bin
att -f mta3 p7b sysin.bcd
att -f mta4 p7b sysou1.bcd
att mta5 sysut1.bin
att mta6 sysut3.bin
att mta7 sysut2.bin
att mta8 syspp1.bin
att mta9 sysut4.bin
att mta10 sysck2.bin
;d ss1 1
boot mta1
;run 3
assert pc =7465
det mta4
! bcd2txta -p sysou1.bcd %2
det all
! del reader.* sys*.bin
! del sysou1*.bcd sysin.*

出力結果 print.txt

ジョブカードに不備があるのか異常終了しますが、計算結果は出るので取りあえず良しとします。おなじみのマンデロブロ図形が出てきました。

$LIST
$DATE          111018

$JOB           MANDEL
$EXECUTE       FORTRAN
      *      ID      MANDEL

      *      LIST8

      *      XEQ


       BEGIN COMPILATION



        EXECUTION


 0000000000000000000000000000000000000000000000000000000000000
 0000000000000000000011111111111111111111100000000000000000000
 0000000000000000111111111111111111111111111110000000000000000
 0000000000001111111111111111111111111111111111111000000000000
 0000000000111111111111111111111111111111111111111110000000000
 0000000011111111111111111111111111111111111111111111100000000
 0000001111111111111111111111111111111111111111111111111000000
 0000011111111111111111111111111111111111111111111111111100000
 0000111111111111111111111111211111111111111111111111111110000
 0001111111111111111111111110002111111111111111111111111111000
 0011111111111111111113312223072671111111111111111111111111100
 0011111111111111111111000000000000061111111111111111111111100
 0111111111111111111120000000000000001111111111111111111111110
 0111111111112040341200000000000000002111111111111111111111110
 0111111112120000000000000000000000005111111111111111111111110
 0345555680000000000000000000000000311111111111111111111111111
 0111111112120000000000000000000000005111111111111111111111110
 0111111111112040341200000000000000002111111111111111111111110
 0111111111111111111120000000000000001111111111111111111111110
 0011111111111111111111000000000000061111111111111111111111100
 0011111111111111111113312223072671111111111111111111111111100
 0001111111111111111111111110002111111111111111111111111111000
 0000111111111111111111111111211111111111111111111111111110000
 0000011111111111111111111111111111111111111111111111111100000
 0000001111111111111111111111111111111111111111111111111000000
 0000000011111111111111111111111111111111111111111111100000000
 0000000000111111111111111111111111111111111111111110000000000
 0000000000001111111111111111111111111111111111111000000000000
 0000000000000000111111111111111111111111111110000000000000000
 0000000000000000000011111111111111111111100000000000000000000
 0000000000000000000000000000001000000000000000000000000000000