スタック構造型FORTRANとその処理系の設計
有泉均
横内滋里
(昭和54年8月27日受理)
Design of Resident Fortran based on Extended
Stack Manipulation and its Implementation
HitoshiARIIZUMI ShigeriYOKOUCHI Abstract AFortran system discripted by the standard Fortran(JIS 70001evel), is designed as a resident interpreter based on extended stack manipulation. Educational programs for begin− ners as input data to this system are processed continuously. In addition to ordinary processing of I/Ostatement and arithmetic expression, recusive procedures of function and subroutine subprogram are performed directly through the routine built in interpreter by stack manipulation.
1・はじめに
最近のコンパイラ言語の傾向として,PASCALに 代表されるように構造化やデータ構造2)などの概念が 導入されてきている。本論文は再帰的手法3)の概念を とり入れた数値計算向き言語FORTRANを基本に, プログラミング教育上の観点からその処理系の設計, 開発について記述したものである。本FORTRAN処理系はJIS 7000レベルを一ヒま
わる標準ACOS FORTRAN4)で記述された,常駐
型のインタプリタ5)であり,主として教育用プログラ ムの処理を対象としている。これらのプログラムはデ ータとして入力され,翻訳部で構文解析やデータ領域 の割当てを受けた後,解釈実行部においてスタック処理を併用して常駐型FORTRAN処理系にあらかじ
め組み込まれたルーチンにより入出力文や算術式およ び再帰的呼出しなどの処理が行われる。このようにし て本処理系は,処理系が翻訳・実行をくり返すことに よって,多量で小規模なジョブを効率良く連続処理し ようというものである。運用面においても,処理系の 制御文などの取扱いが容易であり,システム記述言語であるFORTRANの変更だけで種々の機能の追加
が簡単に行える。またきめ細かいエラー表示も可能と なり個々のジョブに関する統計管理機能を有してい る。 2・処理系と言語設計の目標 本処理系は以下に示す処理系の機能を備えているこ とを目標としている。 1) 原始プログラムの連続処理を行う常駐型のシス テムであること。 2)打ち切り時間,打ち切りページの指定ができる こと。 3) オプションとして自動的に原始プログラムのフ ローチャートを作図すること。 4) マークカードとパンチカード入力の混在が可能 であること。 5) ジョブの処理状況が自動的に把握できる統計管 理機能をもっていること。 6)文法エラー,実行エラーの指摘が明解であるこ と。 7) システム記述が平易で処理系の制御文が少ない こと。 8) システム導入が短期間で完成すること。 9)仕様の変更,追加が簡単であること。 なお,言語の設計目標として,JIS 3000レベルの機能を充足し,さらに再帰形式や各種数値計算ライブ ラリの使用が可能なことである。
3.システム記述言語ACOS FORTRANにお
ける文字処理機能1)CHARACTER型宣言文の採用
1から256までの文字を含む文字型変数を定義でき る。 2)文字型代入文 1から256までの文字型データを任意に転送できる。 3)文字の編集通常のREAD文, WRITE文における機番のか
わりに,記憶域ファイルとして文字型変数を置くことにより,FORMAT文の指定に応じてすべての文字
の編集が可能である。 4.常駐型FORT’RAN処理系の構成と機能の概略 ジョブ管理機能を有する本処理系は,言語の処理に 関してインタプリタとして翻訳および解釈実行ルーチ ンを持っている。以下に各ルーチンの機能の概略を説 明する。 1)主ルーチン 全体的な流れの制御をするルーチンである。すなわ ち入力ルーチンを呼びこみ,各文に従って分析ルーチ ンを呼び出す。ジョブ内制御文によって単一プログラ ムの翻訳終了ごとに,解釈実行ルーチンを呼ぶ。また 各種ルーチンを呼びこむための前処理として,注釈行 の読み捨てを行い,文の空白をつめる。継続行の判定 や文番号のまとめ,副プログラムの結合等も行う。 2)入力ルーチン 原始プログラムを入力する。マークカード入力の場 合は,ワンマーク方式を解析してパンチカード形式に 編集する。JIS FORTRANでは文を区別する見出し 語は任意に他の目的に用いてもよいことになっている が,本処理系では予約語としてとり扱い,これにより 文の識別を行う。予約語を表一1に示す。これはマー表一1予約語表
クカードの省略記号が主体となっている。 3) 分析ルーチン 主ルーチソの要求に応じて単語分析により名前,文 番号,定数,区切り記号などを認識し,構文分析によ り文法の規約に従っているかを解析する。この場合, 名前,文番号,定数(整数型,実数型),予約語など のオペランドおよび+,一,×等の作用素としての記 号が細胞となる。各文に対してこれらの文属性表と文 終了記号‘@’をつけた記号列からなる目的コードが 生成される(書式仕様は特別扱いとする。7.参照)。 4) 解釈実行ルーチソ 登録済みの文属性表,目的コードにもとついて各文 の実行を行う。READ(
WRITE(
FORMAT(
IF(GO TO
DO
CONTINUE
DIMENSION
STOP
END
RETURN
FUNCTION
SUBROUTINE
COMMON
INTEGER
REAL
DATA
5・名前,定数と文番号の処理 インタプリティブに実行するために必要な各種の表 は翻訳時に作成される。以下にそれらについて説明す る。 1)名表の作成 名前のつづりを整数型と実数型に分けて文字型の配 列に登録する。名前が原始プログラム上に現れるとそ のつづりがすでに名表に登録されているか否かを調べ て,登録されていない時には新たにそのつづりを登録 する。 2) 文番号表の作成 文中にある文番号と文番号欄にあるものを文番号表 に登録する。この時,内部文番号として実行文に順次 割当てた番号も登録し,プログラム単位終了後結合が 行われる。 3) 変数表の作成 各名前,定数に対して所属する内部文番号,その値 のデータ領域の記憶場所と属性コードを指定する。つ まり原始プログラム上の名前,定数に対してデータ領 域が確保される。属性コードとしては次の6種類があ る。 (1)単純変数 (2)配列要素 (3)配列名 (4)文関数 (5)関数実引数 (6)定数 これらは整数型か実数型かによってそれぞれを区別 する。 4) 手続き結合表の作成 文関数,外部関数およびサブルーチンの結合に用い て,各関数名の名表ポインタと内部文番号を登録す る。 5) 文属性表の作成 目的コードに対応して作られ,各文のポイソタ群が登録される。ポインタとして次の6種類がある。 (1)内部文番号 (2)文の種類 (3)文番号 (4)文中の文番号 (5)変数表 (6)その他(手 続き結合表,局所変数のデータ領域) 6.算術式のスタック構造 算術式(代入文)の処理は原始プログラムに対応し た記号列に対して直接,解釈実行を行う。算術式を計 算するためにはどの演算子から順に計算すればよいの かという演算子の優先順位を考慮しなけれぽならな い。本処理系においては‘=’,‘(’,‘)’,‘@’,比較演算 子,論理演算子,組込み関数等も演算子として考えて いる。優先順位関数f,gを表一2に示す。 演算を実行するアルゴリズムについては通常の処理 系5)とほぼ同様であるが,スタックの操作はすべて解 釈実行時に行われる。本処理系の特徴として,組み込 み関数や論理演算は算術演算などとともに,ACOS
FORTRANの機能をそのまま実行ルーチンとして備
えている。したがって,実行時エラー表示もACOSFORTRANで作成したものがそのまま使われるよう
に工夫されている。 7・入出力文のスタック構造 ’瓦言←1 s1←( .←2 原始プログラ ムかち生成し た記号列 α夫←工 ん←ゐ十1 演算ルーチン を呼ぶ 9(Si−1):1図一1算術式の処理
表一2優先順位関数
Si←x j←」十1t αk←(αk, αh+1,s元) k←k十1 k←k・一一 2 」←」−1 入出力文の処理は処理系の用意した入出力ルーチン を呼び出すことによって実現する。すなわちユーザ記述の入出力並びとFORMAT文は実引数として対応
する処理ルーチンと結合する。入力処理は次の標準ACOS FORTRANのREAD
文を本処理系に組み込み,そのパラメタをユーザ記述 文から与えることにより実行する。入力実行時のエラ ー指示はACOSシステムに依存している。 READ(5, FOM, ERR=××)((IDBUF(1), 1=MX(L), MX(L十2)−1),(RDBUF(1), 1=MX(L十1), MX(L十3)−1), L=1, K,2) (A)x
19ω f(∋
** ×,/ 十,一 # ( ),@ 比較演算子 AND, OR 組込み関数 *) 10 8 6 4 10 1 9 2 3 10 9 7 5 11 12 11 1 4 2 11 *)単項減算ここでFOMは=・・一一ザ記述のFORMAT文の内
容を文字代入文として与えられた文字型書式である。IDBUFは整数型変数のスタック, RDBUFは実数
型変数のスタックである。MX, Kはユーザ記述の入 力並びをスタックに対応させるためのポインタで,す べての入力文が表現できる。この手続きは書式,スタ ック,ポインタを引数として入力ルーチンを呼び出す ことにより,入力データがスタックに入る。入力ルー チンの終了後,スタックの内容をポインタによって入 力並びへ復帰する。 例えぽ次のようなREAD文を考える。 READ(5,100)1, A, X, J, K, L, Y, M, Z (B) 入力並びに対して整数型,実数型の対を組として, 次のような前処理をする。 MX, Kの初期値をそれぞれ1,2とする。入力並びを左から調べていく。整数型の並びならぽMX
入力並び 1,A,X/J,K, L, Y/M,Z スタック 1 2 1DBUF
RDBUF
ポインタMX
K 5 6 1 J K LM
1 3 4 5 A X Y Z 1 1 2 3 5 4 6 5 図一2スタックの説明図(K十1)に1を加える。実数型の並びならばMX
(K+2)に1を加える。この実数型の並びから整数型 の並びへ移る時を区切りとして,Kに2を加える。(B)で説明するとXとJ,YとMのところで区切
られて(1,(A,X))の組,((J, K, L), Y)の組, (M,Z)の組の計K/2個の組が生じる。 MXの奇数番地にIDBUF,偶数番地にRDBUFの区切りを示す
ポインタがそれぞれはいることにより,(A)と(B) とで一対一対応がついて入力処理が行われる。また並 びが配列名またはDO型の場合は展開した後で同様 な処理をする。WRITE文の手続きはREAD文の手続きと同様
であるが,前処理で出力並びの変数に格納されてある 値をスタックへ保存する。そして次の形で出力処理が なされる。 WRITE(6, FOM, ERR=××)((IDBUF(1), 1ニMX(L), MX(L十2)−1),(RDBUF(1), 1=MX(L十1), MX(L十3)−1), L=1, K, 2) 8.再帰的手続きと副プログラム 通常,手続きはその機能によって関数,サブルーチ ンの二つに分けられ,またプログラム構造では内部手 続き,外部手続きの二つに分けられる。サブル・・一・一チン は外部手続きとして定義され,関数には内部手続きと して定義する文関数と,外部手続きとして定義する外 部関数とがある。 また,以上に加えて本処理系では,外部手続きの内 部における再帰的呼び出しとして再帰関数と再帰サブ ルーチンを可能にしている。 1) 文関数と再帰関数の引用 文関数の引用は算術式中の1次子として次の形で現 れることにより文関数定義文と結合する。 f(e1, e2,…en) ここでfは関数名であり,el,…, enは実引数と呼 ぼれ算術式とする。 文関数定義文においては,文関数名fは変数とし て扱われて変数表に文関数コードが登録される。また 文関数定義文の名表ポインタと内部文番号を文関数引 用文に渡すために,文関数結合表に登録しておく。名前が名表に登録済みであり,算術式の1次子でf
が配列名でないことを満たし,文関数結合表に対応 する文関数定義文の内部文番号および名表のポイン タとが登録されていなけれぽ,再帰関数の引用にな る。 2)副プログラム(外部手続き)の引用と再帰的手続 き 再帰形式を含む副プログラムの引用を制御する外部関数および外部関数の引用,SUBROUTINE文およ
びCALL文, RETURN文について述べる。副プロ
グラムに受け渡されるデータのうち,COMMON文
を用いたものについては,データの割当て方によって 自動的に受け渡しがなされる。ここでは引数によるデ ータの受け渡しをとり扱う。 2−1) 再帰関数を含む外部関数とその引用 (1)形式 外部関数はそれを引用するプログラム単位の外部で 定義する。ただし,再帰関数は同時に引用するプnグラム単位の内部で定義する。予約語FUNCTIONを
先頭に置いて次のような形で与えられる。fは関数 名であり,al,…, anは仮引数と呼ばれる変数名とす る。 FUNCTION f(al, a2,…, an) 外部関数の引用は算術式中の1次子として次の形で 現れることにより外部関数と結合する。 f(el, e2,…, en) ここでノは関数名であり,el,…, enは実引数と呼 ばれ算術式とする。 (2)翻訳文の種類は外部関数定義文ではFUNCTION文,
外部関数引用文では代入文である。 (a) 関数定義文の翻訳 関数定義文とみなされると,関数名と変数表ポイン タを外部手続き結合表に登録する。(b) 関数引用の翻訳 i) 名前が再帰形式を除いて,名表に未登録で ある(関数引用文の関数引用変数の名前は,変数表 作成時にその名前を登録してある名表から除く)。 ii) 文関数定義文ではない(再帰形式の場合は 文関数の項参照)。 関数引用とみなされると,関数変数名と変数表ポイ ンタを外部手続き結合表に登録する。原始プログラム の入力終了ごとに,関数定義文および関数引用文の外 部手続き結合表を用いて,文関数と同様に引用関数の 変数表に定義文関数変数のデータ領域内番地を登録す る。さらに関数引用として文の属性表に実引数の変数 表ポインタおよび関数定義文の内部文番号を登録して 関数引用文を生成する。 再帰関数引用の場合には副プログラムの翻訳終了 後,仮引数および局所変数の上限と下限の局所変数ポ インタを文の属性表に登録しておく。 (3) 解釈実行手順 再帰関数を含む関数副プログラムの実行は,関数引 用文によって引きおこされる。以下に関数の実行手順 を示す。 a) 関数引用文 b) 関数引用文の内部文番号を,戻り内部文番号ス タックに保存する。 c) 実引数を変数スタックに転送する。
d)FUNCTION文に分岐する。
e)再帰形式の場合,仮引数と局所変数を局所変数 スタックに保存する。f)FUNCTION文の仮引数に変数スタックから
値を転送する。 g) 副プログラムの処理を行う。 h) RETURN文で戻り内部文番号に復帰する。 i) 再帰形式の場合,仮引数と局所変数を復帰す る。 j) 関数値を引用関数変数へ転送する。 k) 関数引用を含む算術式を処理する。 2−2)再帰的手続きを含むサブルーチンとその引用 (1)形式 外部サブルー一チンはそれを引用するプログラム単位 の外部で定義する。ただし同時に引用するプログラム 単位の内部で定義する場合は再帰サブルーチンとな る。次のような形で与えられる。 SUBROUTINE S(al, a2,…, an) またはSUBROUTINE S
ここでal,…, anは仮引数と呼ぽれ変数名および配 列名とする。 サブルーチンはCALL文により引用される。 CA LL文は次のような形で与えられる。 CALL S(al, a2,…, an) またはCALL S
ここでal,…, anは実引数と呼ぼれ変数名および配 列名とする。 (2)翻駅 (a)サブルーチン定義文の翻訳 サブルーチン定義文とみなされると,サブルーチン 名と変数表ポインタを外部手続き結合表に登録する。 (b)サブルーチン引用文の翻訳 CALL文とみなされると,そのサブルー一チン名と 変数表ポインタを外部手続き結合表に登録する。 原始プρグラムの入力終了ごとに,SUBROUTINE 文およびCALL文の外部手続き結合表を用いて内部’ 文番号を結合する。 再帰サブルーチンの場合は副プログラム翻訳終了 後,仮引数および局所変数の上限と下限の局所変数ポ インタを文の属性表に登録しておく。 (3) 解釈実行手順 再帰サブルーチンを含むサブルーチン副プログラム の処理はCALL文により引きおこされる。以下にサ ブルーチンの実行手順を示す。a) CALL文
b) CALL文の内部文番号を戻り内部文番号スタ ックに保存する。 c)実引数を変数スタックに転送する。d)SUBROUTINE文に分岐する。同時にSUB
ROUTINE文の内部文番号を,サブルーチン内部
文番号スタックに保存する。 e) 再帰形式の場合,仮引数および局所変数を局所 変数スタックに保存しておく。f)SUBROUTINE文の仮引数に,変数スタック
から値を転送する。 g)副プログラムの処理を行う。h)RETURN文でSUBROUTINE文の内部文
番号を復帰させる。i)再帰形式でない場合,SUBROUTINE文の仮
引数の値を変数スタックへ転送する。そしてCALL 文の戻り内部文番号を復帰させ,実引数定数と算術 式を除いて変数スタックの値をCALL文の実引数 へ転送する。CALL文の次の文へ制御を移す。 」)再帰形式の場合,仮引数,局所変数および