構造化FORTRANの試作と使用経験
井内稔 (昭和52年8月31日受理)
Implementation of Structured FORTRAN and it Experience
MinoruIUCHI Abstract This paper describes an extention of FORTRAN, called Structured FORTRAN, which is upward compatible with FORTRAN with a few exceptions and which contains control structures intend to make FORTRAN not just an acceptable but a good way for structured P「09「amlng.1.はじめに
近年,構造的プログラミング(以下S.P.と略記す る)やソフトウェア工学をめぐる研究や論議が盛んに なるにつれて,プログラミング言語の仕様について幅 広い注意がはらわれるようになってきた。 いっぽう多くの科学技術者によって広く使われている言語はFORTRANであり,これはソフトウェア工
学の見地からすればあまり好ましくない言語である。 そこでS.P.の記述という要求に対するひとつの手段として拡張された構文を標準FORTRANに変換する
プリプロセッサを作ることが広く行われている。本稿 で述べる構i造的FORTRANの試作では, Habermann, Knuth, Zahn らが提唱した新しい構文およびその改 良形を含め,これを用いてこれらの構文の使用実験を 行っている。2.仕
様 ここでいう構造的FORTRAN(以下S. F.と略記する)は既存のFORTRANにS. P.の見地からい
くつかの機能を追加したものである。広義のS.P.で は,プログラム内での制御構造をはじめ,データ構造 およびそこで許容される演算機能も重要である。しか し,ここでは狭義のS.P.の立場から,とりあえず制 御文関係の拡張だけをとりあげた。 プリプロセッサの方式としては種々の方式が可能で ある。ここでは他システムとの互換性が保てるように プリプロセッサそのものを標準FORTRAN(JIS 7000 レベル)で書き,S. F.で書かれたプログラムを標準FORTRANに変換し,変換されたプPグラムを標準
FORTRANの処理係で処理させる方式とした8)。こ のためエラーメッセージ等はS.F.のレベルで出力し ていない。使用可能な文の種類としては,標準FORTRANに
おけるDO文およびIF文を除くすべての文と,以下 に示す9種類の拡張機能の構文である。1)IF−FI文
2)DO−OD文
3)DO−CASE文
4)DO−WHILE文
5)DO−UNTIL文
(一般にrepeat−until構文と呼ぽれるもの)6)DO−FOREVER文
7)Habermannの構文
8)Knuth−Zahnによる状況反復構文 9) 同上構文の改良構文1) ここでは,新しい構文の使用実験を行うために,構 文の拾捨選択は行わず,新しいものもどんどん追加し てゆくことにした。そのため閉じた言語仕様として は,必ずしもバランスがとれているものにはなってい ない。このほかに,自動的に行のあげさげをする機構 を備え,これらの構文のもつ構造を反映したリスティングを印刷している。 3. 拡張機能の仕様
FORTRANに基づいているため,文の記述は一行
一・カである。 (1)IF−FI文 IF ( 論理式 ) 文 FI この文はキーワードがDO UNTILである。実行の 際には論理式が判定され,結果が真になるまでDOUNTILとOD文の間の文がくり返される。この文か
ら抜け出した時にはOD文の次の文に実行が移る。ま たこの文は必ず1回はループの中味をくり返す。(6)DO−FOREVER文
DO FOREVER 文OD
ELSE 文 この文はキーワードがIFであり, FI文と対になっ て使用される。実行の際には,論理式の結果が真なら ぽこの次の文に,偽ならぽELSE文またはFI文の次 の文に実行が移る。 (2)DO−OD文 DO 整数型変数 = 初期値パラメータ 終値パラメータ 文 OD 増文パラメータ この文はキーワードがDOであり, OD文と対になって使用される。標準FORTRANのDO文から文番
号を削除したものに相当する。 (3)DO−CASE文この文はキーワードがDOCASEでありESACOD
と対になって使用される。実行の際には,整数型変数 の値により以下に現れる各CASEブロック (CASE 文とESAC文とが対になって作成される)に実行が移 り,各ブロックが終了するとESACOD文の次の文に 実行が移る。また整数型変数の値以外のCASEブロ ックとして,CASE ELSE文を使用してCASE ELSE ブロックを作成することができる。(4)DO−WHILE文
DOWHILE ( 論理式 ) 文 ODこの文はキーワードがDO WHILEである。実行
の際には論理式が判定され,結果が真である間は,DO WHILEとOD文の間の文がくり返される。こ
の文から抜け出した時にはOD文の次の文に実行が移 る。 (5)DO−UNTIL文この文はキーワードがDO FOREVERでありOD
文と対になって使用されDO FOREVER文とOD文
の間の文をくり返し実行するものである。またループ より抜け出す時にはGO TO文等を使用する。(7)REPEAT−UNTIL文(Habermannの構文)
DO UNIIL ( 論理式 ) この文はwhile・rePeatの複合形であり,キーワー ドがREPEAT, UNTIL, DO, ODである。実行の際 には,まず文1が実行される。次に論理式が評価され 値が偽なら,次に文2を実行し,論理式の値が偽の間 この間が反復実行される。論理式の値が真なら反復を 終わる。 (8)LOOP−UNTIL文(Knuth−Zahnの構文) LOOP UNTI 状況宣言 DO 文 REPEAr THEN 文 OD OR この文はキーワードがLOOP UNTIL, DO, RE− PEAT THEN, CASE BEGIN, ENDである。状況宣言のいずれか一つが成立するまでDO, REPEAT
THENの間の文を反復実行し状況宣言の一つが成立 するとその状況宣言に対応する状況別CASEブロックが実行される。各CASEブロックの実行後はEND
文の次の文に実行が移る。(9)LOOP−SITUATIONS文
LOOP 文 SITUATIONS 状況宣言 OR CASE READY 文 REPEAT 状況別CASE : 文 AGAIN ENDLOOPこの文はキーワードがLOOP, SITUATIONS,
READY, REPEAT, CASE, AGAIN, END LOOP であり,LOOP−UNTIL文に初期値設定文が付いたものである。AGAINはオプショソであり各状況別
CASEブロック中に書くことができこの文に実行が移 るとREADYの次の文に実行が戻る。 占8Pト↓経IE‖NTεGER(A“召一一一一一一一一一① 鞭li膿認;1.。))一.一一一② x=A I:βEAT −一一一一一一一一一③ IF (X.GT.Y) トエ 界(Y.GT.X) FII冨2 UNTIL (X.EQ4Y) D°D。CASE I −一一一一一一一一一Q) 1 CASE X=X−Y ESA( CASE.y≧X ESAC CAsE ELSE STOP ESA(二 ESA(OD 86↓T:6編♀21㍍1。X,14) し ’ 窒96TEδ8“X9∼IH.・。X.・N・TG.C、M.・) OD Fl 999 STOP END ①:DO−FOREVER文使用fe’[J ②:IF−FI文使用例 ③:REPEAT−UNTIL文使用fダ‖ ④IDO−CASE文使用例 図一1拡張構文の使用例 IMPLI(lT INTE6ER (A−∠) ⊂ DO FO}くEVER 9999 co T1NuE 、。。ド8食織▲?2sEND=999)A⑱゜ C IF ((A.GT.O)・AND・(b・bT・0)) IF ((A◆GT・0)・AND‘(ts・bl・∪))(30 TO 9998 GO TO 9997 9998 coNτINUE X=A Y=b REPEAT c 9996 CONTIb,9UE ⊂ IF (X・6T・Y) IF (x・GT.Y) GO TO 99y侍 GO T{⊃ 9993 9994 CONTINUE 1=1 C Fl 9993 CONTINUE C IF (Y.GT・X) lF (Y.GT.X) GO ’「0 9992 GO 「0 9991 9992 CONTltgUE li2 C Fl 9991 CON丁1NUE C UNTIL (X.Eb】.イ) IF (X・EQ.Y) G(X TO ∋99b ε B8c、SEI GO T∼) 9990 C CASE 1 9988 (二〇NT匡NUE X=X−Y C εSA( GO TO 9989 C CASE 2 9987 CUN’「INUE Y=Y−X ⊂ ESAC GO TO 9989 C CASE ELSE 9986 (ONTrtyUE STOPC F. SA( GO TO 9989 C ESACO[) 9990 GO TO( 9988, 9987 ).1 60 TO 9986 9989 CONTINUEC 88T。9996
9995 CON『「1NUE WRITE(6.200)X 200 FOR卜AAT(1H ●10X‘14) ELS’⊂ GO TO 9985 9997 CONTINUE ∀RITE(6,300) 300 FoRMAT(1H ‘1r)Xs°NOT 6・(二・M・°) C FE 998う CONTIト・UE c 88 TO 9999 999 STOP END 図一2図一1のプログラムの展開形 4.S.F.の良い点と悪い点 S.P.の考えかたに基づけぽ,アルゴリズムやデー タの詳細化の機能およびデバッグの機能等が必須条件と考えられ,ここでのS.F.はまだFORTRANの域
を出ない。しかし,最近のプログラミソグにおける重 点は,効率向上から高信頼性へと移りつつあると考え られる。高信頼1生のためには理解しやすいプログラム を書くことが第一条件である。この点について考えると,整った構造をもつプログラムはFORTRAN,
COBOL,さらにアセンブリ言語でも書くことは不可能 ではない。しかしここでのS.F.は,既存のFORTRAN にある程度の制御構造の拡張を行っただけで,既存のFORTRANにくらベプPグラムの構造をかなり明確
にできる。以下に,ここで用いたS.F.における良い 点と悪い点について使用経験から気づいたことを列記 する。 (1)良い点 。制御構造の拡張によりプログラミング・スタイルが 良くなってきている(良いプログラミソグ・スタイ ルは理解しやすいプログラムと関連する)。 。FORTRAN よりも,直接アルゴリズムに添った記 述が可能である。 。S. F.でプログラムを作成した場合,標準FORTRAN で作成したものと比較すると,プログラムサイズは やや大きくなるが,処理時間(実行時)にはほとん ど差異がなく,効率低下は生じない。 。自動的に行のあげさげを行うのは便利である。 。学生のレポートのプログラムでも読み易い。 。FORTRANよりプログラムが書きやすい。 (2)悪い点 。FORTRANに基づいているため文の記述が一行一 文となるので記述面での不自然さが残る。 。DO−UNTIL文など,構文によっては不自然な面が 残る。 。上記二例にも関連するが,構文の構造が必ずしも明 瞭でなく読みにくいものがある。 。制御構文の種類が多すぎる。。IF−FI文等の乱用を行うとかえってプログラムが読 みにくくなる。 。S.F.のレベルでデバッグができない。エラーメッ セージは,S. F.を開いた先のFORTRANのレベ ルで出されたものを利用することになる。 ・自動的な行のあげさげによってかえって読みづらく なる場合が時々ある。 。データ構造等がFORTRAN レベルであり, S. F. にはとりあげられていない。 4.1新しい構文の使用実験 新しい構文実験でとりあげた構文 (1)Habermannの拡張されたrePeat構文
REPEATが最初にあるのは不自然であるがDO一
トUNTIL文やDO−WHILE文よりも自然であり扱い易
く,この両構文におき換えられる。 (2)Knuth−Zahnの状況を用いた構文 (3)同上の改良構文 使用経験不十分である。また扱う問題によって使い 易さの程度が大きいように思われる(使いなれていな いからかもしれない)。 5.使 用 例 SUBROUTINE SEARCH(SDATA) 工MPLIC工[1]工NTEGER(A−Z) COMMON TABLE,COUNT D工MENS工ON TABI」E(101),COUNT(lOl) DATA TRUE,FALSE,EMPTY,M/1,0,−1,ユ00/ LOOP KEY=MOD(SDATA,M)+l ONCE=TRUE S工TUATIONS FOUND OR NOEX工S[[ READY 工F (TABLE(KEY).EQ.SDATA) FOUND E工」SE IF (TABLE(KEY).EQ.EMP[1]Y) NOEXIST F工 F工 KEY=KEY+1 REPEAT CASE FOUND: COUNT(KEY)=COUNT(KEY)+l NOEXIS[1] : 工F (ONCE.EQ.FALSE) RETURN ELSE 工F (KEY.EQ.M) KEY=l ONCE=FALSE AGAIN F工 TAIBLE(KEY)=SDATA COUNT(KEY)=l F工 END LOOP RETURN END 図一3S.F.のプログラム例 図一3はハッシュ表登録検索のプログラムをS.F.で 書いたサブルーチン部である。SITUATIONSの次に書かれているFOUNDおよびNOEXISTは状況名で,
FOUNDまたはNOEXISTのどちらかが生じるまで
READYとREPEAT間の文を反復実行し,生じる
とCASE以下のどちらかのCASEブロックを実行す
る。NOEXISTの処理中のAGAINはオプションで
ありREADYの次の文に実行がもどる。 6. おわりに 本稿ではS.P.の指向のひとつの手段としてプリプ ロセッサの作成が容易であり,かつ有効であることを 述べた。しかし現段階ではまだ不十分である。今後 S.P.のための構造化された言語としてはいろいろな 機能追加が考えられる。特に,S. F.がひとつの言語 としてみることができるように,バランスのとれた構 成を考えなけれぽならない。制御構造,データ構造お よびそれに対する演算機能等の注意深い選択が重要と考えられる。また,FORTRANでは許されない再帰
的なサブルーチンも,構造化されたプログラムを書く 場合に便利なもののひとつである。これをプリプロセ ッサの形で処理することはそれほど困難ではないはず である。さらに,言語としては解析やデバッグ機能も 重要であり,解析およびデバッグに対するいろいろな 機能追加が考えられる。これらのことをふまえ,現在 第2版のS.F.を作製中である。 謝 辞 本研究に当たり詳細な議論をいただいた有澤誠助教 授,ご助言いただいた吉澤正助教授,およびご助力い ただいた本学工学系大学院中島健君に感謝する。参考文献
1)有澤:構造化プログラムにおける非決定性構文と新し いループ構造,情報処理,18−5,p502−504(1977). 2) Charmonman, S.,&Ralston, A.:Structured FORTRAN and the first course in computer Science, Computers in Education(Lecarme and Lewis eds.)North・Holland Pub. Cmpany(1975). 3)Cook, A., T.,:EXPERIENCE WITH EXTEN− SIBLE, PORTABLE FORTRAN EXTENSIONS, Singplan Notices, September(1976). 4) Dahl,0. T., Dijkstra, Ew.,&Hoare. C. A. R.: Stroctured Programing, Academic press(1972).5)富士通:FACOM 2300SII FORTRAN文法書
(1975).6)同上:FACOM 2300SII FORTRAN使用手引
書(1975). 7) Habermann, A. N.,:The corectness of a quad一8) 9) 10) 11) ユ2) ユ3) ratichash algorithm, Carnegie・Mellon Report (1975). Higgins, D. S.:Astructured FORTRAN translator. sigplan Notices, February(1975). 井内,有澤:構造的FORTRANの試作と新しい構 文の使用実験,電子通信学会全国大会論文集(1977). Kernigran, B. W.,&Plauger, P. J.,:The Elements of Rrograming Style,(木村訳:フ゜ログ ラミング書法,共立出版(1976)). Knuth, D. E.:structured programing with go to statements, Computing Surveys 6−4(1974). Knuth, D. E.,&Zahn, C. T.:Jr.“Ill・chosen Use of Event”. CACM 18,6June(1975). Meissner, L. P.:A comptible “structured” extension to Fortran, Sigplan Notics, October (1974). 14) Ralston, A.,& watener, J. L:strutured Fortran’An Evolution of Standard Fortran, IEEE transactiion software engineering, Sept (1976). 15)鳥居,杉藤,真野,二木:プログラム作成技術の現状 に関する調査報告[1],電子技術総合研究所(1975). 16)Wirth, N.:Systematic Programing:An In・ troduction(野下他訳:系統的プログラミングー入 門,近代科学社(1975)). 17)吉澤,井内:計算機入門の改善,山梨大学工学部研究 報告,第27号,P.116−121.