2015年9月16日水曜日

ARMのプログラム技法

数日前のブログではARMのアセンブリ言語でカレンダーのプログラムcalを書いてみた. 今回はおなじラズパイで動くBCPLで同様のプログラムを書こう. (ARMのプログラム技法という題は多少おかしいが.)

BCPLはMartin Richardsが1967年頃に設計した言語である. その元はケンブリッジ大学とロンドン大学がコンパイラ記述用に開発したCPLで, Combined Programming Languageの略である. そのBasic版がBCPLということになっている. またBCPLからC言語が生まれたこともよく知られている.

BCPLをケンブリッジで開発した後, Martin RichardsはMITのProject MACに滞在したので, MITでもBCPLは使えるようになった. 私がBCPLに出逢ったのは1973年から1年MITにいた時であった.

BCPLは最初の設計から50年近く経ったが, まだ保守されているのに驚く.

下のcal.bはBCPLでcalを書いたリストである.



ARMのcalとほとんど同じに出来ているので, それを読む注釈と思って眺めて欲しい. 00行目 C言語のinclude のようなものだ.
02行目 C言語のmain()のようなものだ. ただVALOF { ... RESULTIS ..} の形に なっている.
03行目 変数yearとmonthを定義. BCPLには型がない. 初期値もこう書く流儀らしい.
04行目 他の変数も定義
05,06行目 配列の定義 VEC 11で0から11まで12個の場所が取れる. 初期値の設定は 別にやるらしい. 14行目から18行目で設定した.
08行目から13行目 yearとmonthを引数から取り込むにはこう書くらしい.
19行目 Gregorio暦では週日は400年で繰り返すから, 西暦を400で割った剰余r400だけ を考えることにする.
21行目まで r400を100, 4で割った商と剰余を求める.
22行目 r100≠0をBCPLではr100¬=0と書いたりするが, ASCIIには¬がなく, ~=0でもいいようだ.
23行目 閏年ならrsの1月と2月, msの2月の値を修正する.
24行目 aはその月の1日の週日. nは1週間を数える変数である.
25行目 1日のある週の最初から6週目の最後までFOR分で繰り返す.
26〜28行目 1日から月末までの日なら出力する. それ以外なら空白を出力.
29,30行目 nを下げ0になったら改行する.
31行目 0を持って帰る.

これを実行するには, raspberrypi:~$でcintsysに入る

0.030> bcpl cal.b to cal
bcpl cal.b to cal

BCPL (10 Oct 2014) with simple floating point
Code size =   436 bytes of 32-bit little ender Cintcode
0.110> cal 2015 9
cal 2015 9
        1  2  3  4  5
  6  7  8  9 10 11 12
 13 14 15 16 17 18 19
 20 21 22 23 24 25 26
 27 28 29 30

0.020> cal 2015 10
cal 2015 10
              1  2  3
  4  5  6  7  8  9 10
 11 12 13 14 15 16 17
 18 19 20 21 22 23 24
 25 26 27 28 29 30 31

0.020> 
とまぁこんな具合に動く.

0 件のコメント: